mysql_real_escape_string() 对于 MySQL REGEXP 是否足够?
是否可以选择以下代码中的 $user_input
来使 MySQL 查询不按预期运行?
<?
$regexp = mysql_real_escape_string( $user_input );
mysql_query( "SELECT col FROM table WHERE col REGEXP \"$regexp\"" );
?>
我无法使用准备好的语句,因为 SQL 字符串需要稍微传递一下。
编辑:我要补充一点,我已经知道正则表达式 DoS 攻击。
Could $user_input
in the following code be chosen to make the MySQL query not behave as expected?
<?
$regexp = mysql_real_escape_string( $user_input );
mysql_query( "SELECT col FROM table WHERE col REGEXP \"$regexp\"" );
?>
I can't use prepared statements, since the SQL string needs to be passed around a bit.
Edit: I'll add that I'm already aware of regex DoS attacks.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
此查询:
不能被破坏以执行除 SELECT 之外的操作(我用单引号替换了双引号,因为 double 是仅 mysql 的扩展)。
但是,如果正则表达式本身不在您的直接控制范围内,则用户可能会使用它选择任何内容 - 您应该考虑这可能是一个问题。
This query:
cannot be subverted to do things other than SELECT (I replaced the double quotes with single, since double are a mysql-only extension).
However, if the regexp itself is not in your immediate control, the user might select anything with it -- you should consider the possibility of that being a problem.
不,你在那里是安全的(除了正则表达式,它当然可以是任何东西)。
如果你传递 $link_identifier 的话,你会更高效(也更安全),因为 PHP 必须知道有关数据库的信息才能正确转义(例如编码)。
所以这个函数并不是简单地转义字符串,而是询问mysql如何正确地完成它。
因此,传递链接标识符可确保您的字符串针对其预期的数据库正确转义。
No, you're safe there (except for the regex, which can be anything of course).
You would be more efficient (and secure) if you passed the $link_identifier though, because PHP has to know stuff about the database in order to properly escape (encoding for example).
So this function does not simply escape the string, but asks mysql how to properly do it.
So passing the link identifier ensures that your string is correctly escaped for the database it is meant for.