1

是否可以$user_input在以下代码中选择使 MySQL 查询不按预期运行?

<?
$regexp = mysql_real_escape_string( $user_input );
mysql_query( "SELECT col FROM table WHERE col REGEXP \"$regexp\"" );
?>

我不能使用准备好的语句,因为 SQL 字符串需要传递一下。

编辑:我要补充一点,我已经知道正则表达式 DoS 攻击。

4

2 回答 2

4

这个查询:

mysql_query("SELECT col FROM table WHERE col REGEXP '$regexp'");

不能被颠覆来做除了 SELECT 之外的事情(我用单引号替换了双引号,因为双引号是一个 mysql-only 扩展)。

但是,如果 regexp 本身不在您的直接控制范围内,则用户可能会使用它选择任何东西——您应该考虑这是一个问题的可能性。

于 2011-06-25T17:49:27.273 回答
3

不,你在那里是安全的(除了正则表达式,它当然可以是任何东西)。

如果你传递了 $link_identifier 你会更高效(和安全),因为 PHP 必须知道关于数据库的东西才能正确地转义(例如编码)。所以这个函数并不是简单的转义字符串,而是询问mysql如何正确的做。

因此,传递链接标识符可确保您的字符串正确转义到它所针对的数据库。

于 2011-06-25T17:51:28.507 回答