как предотвратить SQL-инъекцию на веб-сайте asp.net - PullRequest
5 голосов
/ 17 ноября 2011

Для ввода электронной почты пользователем в текстовом поле, я выполняю проверку на стороне клиента, чтобы определить, является ли электронная почта действительной или нет.

 string emailexist = "SELECT COUNT(DISTINCT UserID) as count FROM tbl_user WHERE Email=@Email ";     


   <asp:RegularExpressionValidator ID="RegularExpressionValidator2" ValidationGroup="Login" ControlToValidate="txtUserName"
                            ValidationExpression="\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*" CssClass="Error"
                             runat="server" />

достаточно ли это регулярное выражение, чтобы предотвратить внедрение sql для электронной почты.

Другой текст:

   string groupExistQuery = "SELECT COUNT(DISTINCT GroupID) as count FROM tbl_group WHERE GroupName=@GroupName";   

Я делаю запрос на стороне сервера, чтобы проверить, есть ли имя группы, введенное пользователем, уже доступно в базе данных, существует сильная возможностьвыполнить инъекцию SQL здесь.Как мне предотвратить это?

Ответы [ 5 ]

8 голосов
/ 17 ноября 2011

Регулярное выражение не связано с SQL-инъекцией (внесение в черный список и т. Д. Никогда не является самым сильным подходом); однако использование параметра @Email означает (при условии, что остается параметризованным), что не подвержено внедрению SQL.

Внедрение SQL связано с неправильной конкатенацией ввода; главный инструмент для борьбы с ним - это параметры, которые уже произошли здесь.

Например, если вы сделали:

var sql = "SELECT ...snip... WHERE Email='" + email + "'"; // BAD!!!!!

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

6 голосов
/ 17 ноября 2011

Если вы используете параметризованные значения, все будет в порядке независимо, вы не можете вводить через параметры, только через объединенные значения.

4 голосов
/ 17 ноября 2011

Вы можете предотвратить это, не используя Direct SQL и не используя параметризованные запросы и / или хранимые процедуры.

1 голос
/ 17 ноября 2011
  1. Использовать параметризованные значения
  2. Кодировать ваши строки
0 голосов
/ 17 ноября 2011

Здесь - это ответ группы Microsoft Pattern & Practices на ваш вопрос.

В общем, простое правило: не использовать динамическую генерацию SQL, а если это так, очиститеinput.

Никогда не объединяйте строки для построения SQL-запроса.Если вам нужно создать запрос самостоятельно в своем приложении, то используйте параметризованные запросы SQL с параметрами - так вы на безопасной стороне.

Вот пример из документа, на который я предоставляю ссылкувыше:

  DataSet userDataset = new DataSet();
  SqlDataAdapter myCommand = new SqlDataAdapter( 
             "LoginStoredProcedure", connection);
  myCommand.SelectCommand.CommandType = CommandType.StoredProcedure;
  myCommand.SelectCommand.Parameters.Add("@au_id", SqlDbType.VarChar, 11);
  myCommand.SelectCommand.Parameters["@au_id"].Value = SSN.Text;

  myCommand.Fill(userDataset);
...