避免SQL注入用户生成SQL正则表达式
问题描述:
我正在创建一个网站,用户不幸必须提供一个MySQL WHERE子句中使用的正则表达式。当然,我必须验证用户输入以防止SQL注入。该网站是在PHP做,我用下面的正则表达式来检查我的正则表达式:避免SQL注入用户生成SQL正则表达式
/^([^\\\\\']|\\\.)*$/
这是双重逸出,因为处理正则表达式PHP的方式。 它应该工作的方式是只匹配安全的正则表达式,没有未转义的单引号。但大部分是自学成才的,我想知道这是否是一种安全的做法。
答
如果它只是为了显示这个reg表达式的目的,那么大多数程序只是Html对值进行编码并存储在数据库中,然后解码出来。再次仅用于显示的目的,如果你需要使用提交的reg exp,这将不起作用。
还知道有一种方法,其中注入的人有意写SQL,将其转换为varbinary,并提交exec命令以及过去一直使用的查询的base 64表示形式。
答
您应该只通过mysql_escape_string或mysql_real_escape_string传递字符串。
虽然我会对接受任何旧的正则表达式保持警惕 - 但它们中的一些可能会运行很长时间,并会捆绑您的数据库服务器。
当心包含嵌套 无限期重复图案。应用于不匹配的 字符串时,可能需要很长时间才能运行 。考虑 模式片段(A +)*
这可以在33种不同 方式匹配“AAAA”,并且这个数字增加非常迅速 作为字符串变长。
答
如果使用预准备语句,SQL注入将不可能。你应该总是使用准备好的语句。
虽然关于昂贵的正则表达式,但Roborg仍然非常出色。
我不明白这是如何回答这个问题的。你能澄清吗? – ysth 2008-10-19 16:23:00