【问题标题】:regex expressions prevent sql/script injection正则表达式防止 sql/脚本注入
【发布时间】:2011-11-17 17:47:58
【问题描述】:

我正在尝试为客户端验证创建一个正则表达式(在服务器端验证之前),以防止 sql/脚本注入,即类似这样的东西 - 工作

(script)|(<)|(>)|(%3c)|(%3e)|(SELECT) |(UPDATE) |(INSERT) |(DELETE)|(GRANT) |(REVOKE)|(UNION)|(<)|(>)

这个(上面的)表达式的正确格式是什么,以便我可以让它工作?

例如我的电子邮件检查器是这样的

(/^[^\\W][a-zA-Z0-9\\_\\-\\.]+([a-zA-Z0-9\\_\\-\\.]+)*\\@[a-zA-Z0-9_]+(\\.[a-zA-Z0-9_]+)*\\.[a-zA-Z]{2,4}$/))

哦,如果您能想到其他要添加的内容,请“喊”。

【问题讨论】:

  • 不要尝试验证输入,只需确保转义字符串中的特殊字符。
  • 为什么,为什么?在您的服务器端代码中使用适当的转义工具来转义 SQL 参数,以及您将要插入 HTML 或其他地方的文本。防止任何注射可能性并消除任何“注射预防检查”的需要。
  • 它允许用户添加包含 SQL 文本的文章等。考虑一下,您可能会在以后重用此代码。
  • @brain 如果他使用准备好的语句,他甚至不需要转义任何东西。如果您正在执行接受用户提供的参数的查询(或任何重复多次的查询),它们在各方面都会更好。但是,如果该文本随后从数据库中读回,则在读取该文本时,他将不得不进行一些转义以防止存储的 XSS 攻击。
  • @sillyMunky:您说得对,如果您使用准备好的语句,则无需转义。我的评论是如果您想在不使用准备好的语句的情况下进行查询。

标签: regex sql-injection javascript-injection


【解决方案1】:

一般Sql Injection发生在传递给插入、更新、删除或选择等sql命令的参数的字符串中。此正则表达式验证 sql 命令中是否有任何内联或块注释。

/[\t\r\n]|(--[^\r\n]*)|(\/\*[\w\W]*?(?=\*)\*\/)/gi

【讨论】:

    【解决方案2】:

    不能以任何方式阻止客户端的 SQL 注入尝试。这是一个可怕的、糟糕的想法,它不能帮助你,但可能会让真正的用户感到头疼。它不会阻止任何有机会实际利用 SQLi 的人。

    就正则表达式而言,您需要在开头和结尾添加 / ,就像在您的邮件示例中一样,以表示它是一个正则表达式。此外,我认为正则表达式设计存在缺陷,因为它仍然允许许多注入向量。例如它允许可怕的单引号'、--cmets 和其他。它甚至没有开始涵盖 RDBMS 中可能出现的所有内置函数。攻击者经常会利用,例如SELECT 语句已经在您的服务器端,因此删除它们可能也无济于事。

    您最好的防御是在服务器端使用参数化查询(例如 pg_prepare 用于 php 和 postgres)

    【讨论】:

    • 好吧,换一种说法,我只想要 a-z A-Z 0-9 。 , ?相关网站的真正用户无论如何都不需要使用诸如脚本之类的词。
    • /[a-zA-Z0-9.,?]*/ 将匹配任何只包含这些字符的字符串为真,如果有其他字符则为假。
    • 转义所有输入字符串,并使用参数化查询。
    • @Russell,如果它在某种程度上对您有帮助,请使用客户端验证,但老实说,您必须停止认为客户端检查会提高安全性。您的设计应该假设每个人都是攻击者,并且攻击者将能够使用他们自己的代理发送他们想要的任何参数(我建议您使用 burp 代理来了解我的意思)。
    • @sillyM - 老实说,我同意,但我有一个非常(压力)偏执的客户,因为他们之前曾遇到过脚本和 sql 注入问题。即使我确实验证、过滤和清理服务器端,他们仍然坚持“腰带和大括号以及所有不必要的东西”——总是这样做的。哦,不是通过我的脚本注入的 :)
    【解决方案3】:

    只有 a-z 或 A-Z 或 4-8 个字符之间的 0-9:

    ^([a-z]|[A-Z]|[0-9]){4,8}$
    

    【讨论】:

    • 如果允许非拉丁字符集怎么办?
    【解决方案4】:

    转义控制字符(如“和”)更为常见,这样人们仍然可以将 SQL 代码输入到数据库中,比如在 CMS 上,我正在添加一篇关于 SQL 注入的文章。我想在不触发注入的情况下使用这些单词和字符。看着它,它似乎是基于 HTML 的东西,所以将 转换为 <和 >,这将净化所有 html 标签,同时仍然允许显示 HTML 演示内容。

    正如已经说过的,这应该都是服务器端的,因为它进入了系统。

    【讨论】:

      【解决方案5】:

      SQL 注入和转义对很多人来说听起来很神奇,就像抵御一些神秘的危险,但是:不要害怕 - 这没什么神奇的。这只是启用查询处理特殊字符的方法。

      所以,不要发明新的魔法护盾和保护魔法注射危险的方法!相反,试着了解how escaping of the input works

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-09-07
        • 1970-01-01
        • 1970-01-01
        • 2018-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多