在用户生成的SQL-regex中避免SQL注入

时间:2008-10-19 11:56:49

标签: php mysql regex sql-injection

我正在创建一个网站,其中用户不幸地必须提供在MySQL WHERE子句中使用的正则表达式。当然,我必须验证用户输入以防止SQL注入。该网站是用PHP制作的,我使用以下正则表达式检查我的正则表达式:

/^([^\\\\\']|\\\.)*$/

由于PHP处理正则表达式的方式,这是双重转义。 它应该工作的方式是只匹配安全的正则表达式,而没有未转义的单引号。但大多数是自学成才,我想知道这是否是一种安全的方式。

3 个答案:

答案 0 :(得分:9)

如果使用预准备语句,则无法进行SQL注入。你应该总是使用准备好的陈述。

Roborg虽然关于昂贵的正则表达方式,但仍然提出了一个很好的观点。

答案 1 :(得分:2)

您应该将字符串传递给mysql_escape_stringmysql_real_escape_string

我会谨慎接受任何旧的正则表达式 - 其中一些可以运行很长时间并且会占用你的数据库服务器。

来自Pattern Syntax

  

注意包含嵌套的模式   无限重复。这些可以采取   应用于a时运行时间长   不匹配的字符串。考虑   模式片段(a +)*

     

这可以匹配33种不同的“aaaa”   方式,这个数字增加了很多   随着字符串越来越快。

答案 2 :(得分:-2)

如果它是为了显示这个reg表达式的目的,那么大多数程序只需要Html对值进行编码并存储在DB中,然后在出路时解码。同样仅用于显示目的,如果您需要使用提交的reg exp,这将不起作用。

还知道有一种方法,意图注入SQL的人写入SQL,将其转换为varbinary并使用我过去曾经遇到过的查询的base 64表示提交exec命令。