2014-09-04 3 views
1

Я пытался обеспечить, чтобы мой код не был восприимчив к печально известным SQL Injection Attack. Вопрос вовлекает Строка запроса, наследие код, я управляющий имеет экземпляры встроенного SQL, который применяется:SQL Injection Technique For Query String

string query = @"SELECT * FROM [Order] 
    WHERE ([Id]=" + Request.QueryString[@"oid"] + ");"; 

Очевидно, что это плохо, это займет атаку. Мой вопрос достаточно?

command.Parameters.AddWithValue("@OrderId", Request.QueryString[@"oid"]); 

Так что теперь запрос имеет параметр, которому передается значение. Я знаю, что он имеет некоторую форму кодирования. Однако этого будет достаточно, чтобы любой злоумышленник мог использовать эту строку запроса? Так должен ли я делать Encode в строке запроса? Таким образом, он будет безопасно шифровать его, чтобы избежать дальнейшего использования?

Некоторые разъяснения по этому вопросу были бы полезными.

+0

Да, этого достаточно. – Zer0

+0

Вы должны проверить [Может ли мы перестать использовать AddWithValue() уже?] (Http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/) и перестать использовать '.AddWithValue()' - это может привести к неожиданным и неожиданным результатам ... –

ответ

4

это достаточно?

Нет - вы также должны изменить свой запрос

string query = @"SELECT * FROM [Order] 
    WHERE ([Id][email protected]);"; 

Я знаю, что есть некоторая форма кодирования

Нет, он использует действительное значение, но его не вводит его в оператор SQL. Он рассматривает его как литеральную строку, поэтому нет возможности включить пунктуацию или вредоносный код, который будет интерпретироваться как SQL.

РЕДАКТИРОВАТЬ

я, возможно, не понял - возможно, потребуется URL-декодирования значения, если он включен URL-кодированных символов (%20, & и т.д.), но не кодирование (или декодирование) не требуется для предотвращения внедрения SQL.

+0

Я знаю, что запрос нужно изменить, чтобы использовать этот параметр, должен добавить это к вопросу, извините. Так что 'Parameters.AddWithValue' должно быть достаточно из-за того, как он преобразуется? – Greg

+0

@Greg Он не конвертируется. Он будет вставлять строковое значение as-is. Вам не нужно беспокоиться о кодировании или экранировании символов. –