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