2015-09-17 3 views
2

У меня есть поле для комментариев на моем сайтекод, который свободен от проблем SQL Injection

<td id="commentsBox" class="xec" size="200"></td> 

Я использую Javascript для чтения в поле для комментариев и создать строку XML.

<ROWS><COMMENTS>My comments</COMMENTS></ROWS> 

Строка XML передается в хранимую процедуру через java. (Я упростил SQL кода и XML-строки для целей данного вопроса)

CREATE PROCEDURE [DB].[TEST$ExecuteXML] @doc VARCHAR(max) 
    ,@P_Result VARCHAR(max) OUTPUT 
AS 
BEGIN 
    DECLARE @idoc INT; 

    EXEC sp_xml_preparedocument @idoc OUTPUT 
     ,@doc; 



     INSERT INTO MyTable (
      COMMENTS 
      ,UPDATE_DATE 
      ) 
     SELECT COMMENTS 
      ,getDate() 
     FROM OPENXML(@idoc, '/ROWS', 1) WITH (
       COMMENTS VARCHAR(200) 'COMMENTS' 
       ); 


    SET @p_result = 1; 
END 

я смотрел на сайтах, связанных с SQL инъекций, таких как https://technet.microsoft.com/en-us/library/ms161953(v=sql.105).aspx

Можно ли ввести что-то в текстовое поле, что будет разрушительным для базы данных?

UPDATE

В ответ на @Linky добавить здесь (часть) код Java - хотя я в растерянности, чтобы понять, как это может быть проблематично, так как предпосылка моего вопроса в том, что в SQL Server процедура может принимать что угодно в XML.

XMLObject br = new XMLObject(xmlString); 
String result = br.update(); 

public class XMLObject { 

    public static final int RESULT_FAILED = 0; 
    public static final int RESULT_SUCCESS = 1; 

    protected DBConnection dbConn = null; 

    protected String theXML=null; 

    public XMLObject(String theXML) {  
     this.theXML=theXML; 
    } 


    public String update() { 
     String result; 
     ArrayList<DBField> fields = new ArrayList<>(); 
     fields.add(new DBField(DBField.STRING, theXML, false)); 
     result = DMLUtils.executeString("ExecuteXML", fields); 
     return result; 
    } 

}

+0

Обычно проблема заключается в коде, который вызывает команду db (либо процедуру, либо любой другой DML). Да - это все еще возможно - это зависит от того, как вы вызываете процедуру с Java – Linky

+0

Чтобы понять, как это может быть проблематично, см. Http://stackoverflow.com/questions/332365/how-does-the-sql-injection-from- the-bobby-tables-xkcd-comic-work – Linky

ответ

1

Injection исходит из того, что SQL-данные становятся или обрабатываются как команды SQL. В вашем примере вы четко и четко указываете данные и команды, и AFAIK, ни OPENXML, ни sp_xml_preparedocumen могут сами по себе использовать причину инъекции.

Таким образом, по моему профессиональному мнению, это кажется безопасным от инъекции.

+1

Вы правы, что показанный код кажется безопасным, но только показанный код. IMHO по-прежнему можно открыть для SQL-инъекции, поскольку мост java-sql не показан – Linky

+0

@Linky Это верно для всего и будет задавать вопрос «Является ли этот код безопасным *» всегда спорным. Но это не спорный вопрос, и он * * является важным, чтобы быть в состоянии определить, какой код является безопасным и который не является. Этот код, как представлено, безопасен. – RBarryYoung

2

Лучший способ избежать атак SQL Injection, чтобы связать содержание к определенному столбцу. Непосредственное внесение комментариев пользователей в базу данных открывает вам атаки на межсайтовый скриптинг, если эти данные когда-либо отображаются пользователю. Я бы посоветовал вам ответить на этот вопрос до Security Stack Exchange.

Смежные вопросы