正则表达式防止 sql/脚本注入
Posted
技术标签:
【中文标题】正则表达式防止 sql/脚本注入【英文标题】:regex expressions prevent sql/script injection 【发布时间】:2011-11-17 17:47:58 【问题描述】:我正在尝试为客户端验证创建一个正则表达式(在服务器端验证之前),以防止 sql/脚本注入,即类似这样的东西 - 不工作
(script)|(<)|(>)|(%3c)|(%3e)|(SELECT) |(UPDATE) |(INSERT) |(DELETE)|(GRANT) |(REVOKE)|(UNION)|(&lt;)|(&gt;)
这个(上面的)表达式的正确格式是什么,以便我可以让它工作?
例如我的电子邮件检查器是这样的
(/^[^\\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:您说得对,如果您使用准备好的语句,则无需转义。我的评论是如果您想在不使用准备好的语句的情况下进行查询。 【参考方案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。
【讨论】:
以上是关于正则表达式防止 sql/脚本注入的主要内容,如果未能解决你的问题,请参考以下文章