【问题标题】:How to escape special characters like " in the SQL query in order to avoid Injection如何在 SQL 查询中转义特殊字符,如 " 以避免注入
【发布时间】:2011-12-26 17:39:41
【问题描述】:

使用 delphi 2010,我想知道是否有某种方式可以转义以下字符串以使其免受 sql 注入攻击:

我的字符串:

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

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

【问题讨论】:

  • 使用sql参数:)
  • 请不要将标签信息放在问题标题中。这就是标签的用途,在标题中重复它会使标题变得更长更难阅读。谢谢。 :)

标签: sql delphi delphi-2010


【解决方案1】:

使用参数,让数据库驱动处理这些东西。

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

【讨论】:

  • 此代码不起作用 EDatabase 错误(不支持操作)
  • 这段代码运行良好;我在每天运行的大量代码中使用它。你用的是什么数据库?什么数据库组件? (顺便说一句,在发布 SQL 问题时,您应该始终提及数据库引擎,因为它们之间的语法和功能不同。)
  • 0x0005 不支持操作
  • @Rafik:再说一次,您使用什么数据库,以及哪些组件? (我在上一条评论中问过,如果你注意到的话。)
【解决方案2】:

将 ' 替换为 '' 应该确保您不会被注入到文本字段中。

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

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • -1。这对防止 SQL 注入没有任何作用(甚至使它变得更加困难)。此外,QuotedStr 已经在 RTL 中(在 SysUtils 中)。
    • 如果您的数据库使用单引号(例如 SQL Server),请使用 QuotedStr docwiki.embarcadero.com/VCL/en/SysUtils.QuotedStr,或者其他人使用 AnsiQuotedStr (docwiki.embarcadero.com/VCL/en/SysUtils.AnsiQuotedStr)(或始终使用 AnsiQuotedStr 并将变量设置为提供程序语法)跨度>
    • @KenWhite:出于好奇:这怎么不能防止 SQL 注入?
    • 这不是一个有效的例子,因为我的代码是
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-23
    • 2013-09-16
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    相关资源
    最近更新 更多