我正在创建一个网站,其中用户不幸地必须提供在MySQL WHERE子句中使用的正则表达式。当然,我必须验证用户输入以防止SQL注入。该网站是用PHP制作的,我使用以下正则表达式检查我的正则表达式:
/^([^\\\\\']|\\\.)*$/
由于PHP处理正则表达式的方式,这是双重转义。 它应该工作的方式是只匹配安全的正则表达式,而没有未转义的单引号。但大多数是自学成才,我想知道这是否是一种安全的方式。
答案 0 :(得分:9)
如果使用预准备语句,则无法进行SQL注入。你应该总是使用准备好的陈述。
Roborg虽然关于昂贵的正则表达方式,但仍然提出了一个很好的观点。
答案 1 :(得分:2)
您应该将字符串传递给mysql_escape_string或mysql_real_escape_string。
我会谨慎接受任何旧的正则表达式 - 其中一些可以运行很长时间并且会占用你的数据库服务器。
注意包含嵌套的模式 无限重复。这些可以采取 应用于a时运行时间长 不匹配的字符串。考虑 模式片段(a +)*
这可以匹配33种不同的“aaaa” 方式,这个数字增加了很多 随着字符串越来越快。
答案 2 :(得分:-2)
如果它是为了显示这个reg表达式的目的,那么大多数程序只需要Html对值进行编码并存储在DB中,然后在出路时解码。同样仅用于显示目的,如果您需要使用提交的reg exp,这将不起作用。
还知道有一种方法,意图注入SQL的人写入SQL,将其转换为varbinary并使用我过去曾经遇到过的查询的base 64表示提交exec命令。