2008-10-19 59 views
3

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

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

这是双重逸出,因为处理正则表达式PHP的方式。 它应该工作的方式是只匹配安全的正则表达式,没有未转义的单引号。但大部分是自学成才的,我想知道这是否是一种安全的做法。

回答

-2

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

还知道有一种方法,其中注入的人有意写SQL,将其转换为varbinary,并提交exec命令以及过去一直使用的查询的base 64表示形式。

+1

我不明白这是如何回答这个问题的。你能澄清吗? – ysth 2008-10-19 16:23:00

2

您应该只通过mysql_escape_stringmysql_real_escape_string传递字符串。

虽然我会对接受任何旧的正则表达式保持警惕 - 但它们中的一些可能会运行很长时间,并会捆绑您的数据库服务器。

Pattern Syntax

当心包含嵌套 无限期重复图案。应用于不匹配的 字符串时,可能需要很长时间才能运行 。考虑 模式片段(A +)*

这可以在33种不同 方式匹配“AAAA”,并且这个数字增加非常迅速 作为字符串变长。

+0

- 但不会使用mysql_escape_string更改正则表达式? 例如用户输入

/\d+/
以匹配一系列数字,而最终匹配反斜杠,后跟一系列“d”。这就是为什么我想首先推出自己的产品。 – Kalleguld 2008-10-19 12:56:25

+0

这种情况呼吁准备好的声明。无论用户输入到DB 1:1,它们对于SQL注入都是牢不可破的。 – Tomalak 2008-10-19 15:04:41

9

如果使用预准备语句,SQL注入将不可能。你应该总是使用准备好的语句。

虽然关于昂贵的正则表达式,但Roborg仍然非常出色。