【问题标题】:Is mysql_real_escape_string() sufficient for a MySQL REGEXP?mysql_real_escape_string() 对于 MySQL REGEXP 是否足够?
【发布时间】:2011-06-25 17:45:03
【问题描述】:

是否可以选择以下代码中的$user_input 以使 MySQL 查询的行为不符合预期?

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

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

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

【问题讨论】:

  • '%needle' 不会使用索引,因为 % 在开头。所以这可能会很慢。

标签: php mysql regex mysql-real-escape-string


【解决方案1】:

这个查询:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 为什么传递链接标识符会更高效、更安全? (我没有投反对票)
    猜你喜欢
    • 2017-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多