3

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

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

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

4

3 回答 3

9

如果使用预处理语句,SQL 注入将是不可能的。您应该始终使用准备好的语句。

尽管关于昂贵的正则表达式,Roborg 提出了一个很好的观点。

于 2008-10-19T14:03:33.847 回答
2

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

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

模式语法

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

这可以以 33 种不同的方式匹配“aaaa”,并且随着字符串变长,这个数字会迅速增加。

于 2008-10-19T12:09:20.780 回答
-2

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

还知道有一种方法,意图注入的人在那里写出 SQL,将其转换为 varbinary 并提交带有我过去遇到过的查询的 base 64 表示形式的 exec 命令。

于 2008-10-19T12:08:22.170 回答