2016-11-16 9 views
-3

Этот код был найден в DNN PortalSecurity.cs. Предполагается, что он будет содержать вводную строку sql injection safe. Я хочу знать, может ли этот код очищать пользовательский ввод, чтобы сделать его безопасным для использования в не параметризованном запросе, то есть может ли он предотвратить SQL-инъекцию? Вы видите здесь какие-то проблемы?Может ли этот код сделать SQL-инъекцию невозможной?

private string FormatRemoveSQL(string strSQL) 
{ 
    const string BadStatementExpression = ";|--|create|drop|select|insert|delete|update|union|sp_|xp_|exec|/\\*.*\\*/|declare|waitfor|%|&"; 
    return Regex.Replace(strSQL, BadStatementExpression, " ", RegexOptions.IgnoreCase | RegexOptions.Compiled).Replace("'", "''"); 
} 
+12

Почему не параметризованные запросы? – adt

+1

Почему 'select' является« плохим заявлением »? То же самое для '%'? Похоже, что это слишком много, чтобы быть «общим». –

+0

@mybirthname Прочитайте первое предложение. Он был дернут от [DotNetNuke/PortalSecurity.cs] (https://searchcode.com/codesearch/view/3358680/) –

ответ

2

Все, что происходит, это удаление ключевых слов общего языка. Для того, чтобы это было достаточно безопасным, оно должно быть религиозно поддерживаться продавцом, поэтому с административной точки зрения это кошмар.

Кроме того, я очень сомневаюсь, что список содержит все потенциально опасные ключевые слова. Это также может ограничивать вашу способность вводить определенные строки (хотя это может быть желательно). Однако это может помешать случайному хакеру.

Я бы назвал это способом непрофессионала сделать входную строку несколько безопасной.

+0

Действительно, входной фильтр не может предотвратить SQLi в общем случае. Это неадекватная защита, и, скорее всего, злоумышленник может обойти это. Он также зависит от базы данных, а точную атаку зависит от используемой СУБД. –