当前位置:  开发笔记 > 编程语言 > 正文

MySQL/PHP - 转义可能减慢数据库速度(或使其意外执行)的字符

如何解决《MySQL/PHP-转义可能减慢数据库速度(或使其意外执行)的字符》经验,为你挑选了1个好方法。

我通过a运行所有整数(int)Integer,以便在我的查询字符串中使用它们.

我还通过这个功能代码运行我的字符串: -

if(!get_magic_quotes_gpc()) {
           $string = mysql_real_escape_string($string);
        }

$pattern = array("\\'", "\\\"", "\\\\", "\\0");
$replace = array("", "", "", "");
if(preg_match("/[\\\\'\"\\0]/", str_replace($pattern, $replace, $string))) $string = addslashes($string); 


$cleanedString = str_replace('%','',$string);

我显然返回$ cleaningString变量.现在我替换%字符,因为它是mySQL的通配符,如果用户插入它们,它可能会减慢我的查询速度(或使它们返回不正确的数据).我应该关注mySQL还有其他特殊字符吗?

在第二个注释中,我的搜索和替换之后是否有任何错误或多余mysql_real_escape_string?我在第一次出发时从一个网站上得到它(如果我没记错的话)它说除了转义字符串之外你还必须使用这个搜索/替换.看起来它试图删除任何以前转义的注入字符?



1> Bill Karwin..:

好的,我有几条评论:

魔术引用功能已弃用,您的PHP环境永远不应启用魔术引号.因此,检查它应该是不必要的,除非您设计的代码可以部署到其他客户的环境中(无意中)启用了魔术引号.

preg_match()如果您正在搜索字符序列,则您的正则表达式不正确.正则表达式[xyz]匹配单个字符x,y或z 中的任何一个.它与字符串xy或yz不匹配.无论如何,这是学术性的,因为我认为你根本不需要以这种方式搜索或替换特殊字符.

mysql_real_escape_string()足以转义您打算在SQL字符串中的引号内插入的字符串文字.不需要为其他引号,反斜杠等进行字符串替换.

%并且只有在与表达式使用模式匹配时_才是SQL中的通配符.如果您只是与等式或不等式运算符或正则表达式进行比较,则这些字符没有任何意义.即使您使用表达式,也不需要为了防御SQL注入而转义这些字符.如果你想将它们视为文字字符(在这种情况下用反斜杠转义它们)或表达式中的通配符(在这种情况下只是将它们留在其中),这取决于你.LIKELIKELIKE

当您将PHP变量插入到SQL表达式中而不是文字字符串值时,所有这些都适用.如果使用绑定查询参数而不是插值,则根本不需要转义.绑定参数在普通的"mysql"API中不可用,但仅在"mysqli"API中可用.

另一种情况是您插入PHP变量来代替SQL表名,列名或其他SQL语法.在这种情况下,您不能使用绑定参数; 绑定参数取代字符串文字.如果需要使列名称动态化(例如,ORDER BY用户首选项的列),则应使用反引号(在MySQL中)或方括号(Microsoft)或双引号(其他标准SQL)来分隔列名称.

所以我想说你的代码可以简化为以下内容:

$quotedString = mysql_real_escape_string($string);

这就是,如果你要使用的字符串进行插值; 如果你打算将它用作绑定参数值,它甚至更简单:

$paramString = $string;

推荐阅读
可爱的天使keven_464
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有