正则表达式阻止sql / script注入

时间:2011-09-15 09:50:21

标签: regex sql-injection javascript-injection

我正在尝试为客户端验证创建一个正则表达式(在服务器端验证之前也会发生)阻止sql / script注入,就像这样 - 不会工作

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

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

e.g。我的电子邮件检查器是这样的

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

哦,如果你能想到任何其他事情,请“大喊”。

5 个答案:

答案 0 :(得分:5)

通常,Sql Injection发生在传递给sql命令参数的字符串中,例如insert,update,delete或select。此正则表达式验证sql命令中是否有任何内联或块注释。

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

答案 1 :(得分:3)

无法以任何方式甚至阻碍客户端的SQL注入尝试。这是一个可怕的,可怕的想法,它无法帮助你,但可能会给真正的用户带来痛苦。它不会阻止任何有可能实际利用SQLi的人。

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

更常见的是逃避像“和”之类的控制字符,这样仍然可以将SQL代码输入到数据库中,比如它在CMS上,我正在添加一篇关于SQL注入的文章。我想在不触发注射的情况下使用这些单词和字符。看着它,它似乎是针对HTML基础的东西,所以转换<和>到& lt;和& gt;,它将清除任何和所有html标签,同时仍然允许显示HTML演示内容。

如前所述,这应该是服务器端,因为它进入系统。

答案 4 :(得分:0)

SQL注入和逃避声音对很多人来说都是神奇的,就像屏蔽了一些神秘的危险,但是:不要害怕它 - 它不是什么神奇的东西。这只是启用查询处理特殊字符的方法。

所以,不要发明新的魔法护盾和如何保护神奇注射危险的方法!而是尝试理解how escaping of the input works