如何在SQL查询中转义特殊字符,以避免注入

时间:2011-12-26 17:39:41

标签: sql delphi delphi-2010

使用delphi 2010,我想知道是否有一些事情要逃避以下字符串以使其免受sql注入攻击:

我的字符串:

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

如何重写此字符串,使其比某人在“我的TEditbox中输入”作为他的电子邮件或密码更安全!

3 个答案:

答案 0 :(得分:13)

使用参数,让数据库驱动程序处理这些内容。

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

答案 1 :(得分:0)

'with''的基本替换应该确保你不会在文本字段中注入。

根据经验,确保添加到数据库的所有输入都符合您期望的模式。 对于电子邮件地址,邮政编码和密码,您可以定义一个简单的正则表达式来验证其有效性。

请记住,数字字段也可以注入,也应该验证。

答案 2 :(得分:-1)

如果由于某种原因你不能使用参数,你可以使用这样的函数:

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);

(这假设您的数据库提供程序使用双引号来分隔字符串,并且带引号的字符串中的两个连续双引号实际上是一个双引号,即一个双引号)。