Как избежать специальных символов, таких как "в запросе SQL, чтобы избежать инъекций - PullRequest
3 голосов
/ 26 декабря 2011

Используя delphi 2010, мне интересно, можно ли каким-либо образом экранировать следующую строку, чтобы обезопасить себя от атак инъекций sql:

моя строка:

    SQLQuery1.SQL.Text := 'SELECT * FROM registered WHERE email="'+
      email+'" and login_pass="'+password+'"';

Как переписать эту строку, чтобы сделать ее более безопасной, чем когда кто-то печатает "в моей TEditbox в качестве своего адреса электронной почты или пароля!

Ответы [ 3 ]

13 голосов
/ 26 декабря 2011

Используйте параметры, и пусть драйверы базы данных справятся с этим.

SQLQuery1.SQL.Text := 'SELECT * FROM registered WHERE email= :email'+
  ' and login_pass = :password';
SQLQuery1.ParamByName('email').AsString := EMail;
SQLQuery1.ParamByName('password').AsString := Password;
0 голосов
/ 27 декабря 2011

базовая замена 'with' 'должна гарантировать, что вы не попадете в текстовые поля.

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

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

0 голосов
/ 27 декабря 2011

Если по какой-либо причине вы не можете использовать параметры, вы можете использовать функцию, подобную этой:

USES SysUtils;

FUNCTION QuotedStr(CONST S : STRING) : STRING;
  BEGIN
    Result:='"'+ReplaceStr(S,'"','""')+'"'
  END;

, а затем

SQLQuery1.SQL.Text := 'SELECT * FROM registered WHERE email='+
  QuotedStr(email)+' and login_pass='+QuotedStr(password);

(это предполагает, что ваш поставщик базы данных используетдвойные кавычки для разделения строк и две последовательные двойные кавычки в строке в кавычках - это на самом деле одинарные двойные кавычки, т. е. одна двойная кавычка).

...