我通过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
?我在第一次出发时从一个网站上得到它(如果我没记错的话)它说除了转义字符串之外你还必须使用这个搜索/替换.看起来它试图删除任何以前转义的注入字符?
好的,我有几条评论:
魔术引用功能已弃用,您的PHP环境永远不应启用魔术引号.因此,检查它应该是不必要的,除非您设计的代码可以部署到其他客户的环境中(无意中)启用了魔术引号.
preg_match()
如果您正在搜索字符序列,则您的正则表达式不正确.正则表达式[xyz]
匹配单个字符x,y或z 中的任何一个.它与字符串xy或yz不匹配.无论如何,这是学术性的,因为我认为你根本不需要以这种方式搜索或替换特殊字符.
mysql_real_escape_string()
足以转义您打算在SQL字符串中的引号内插入的字符串文字.不需要为其他引号,反斜杠等进行字符串替换.
%
并且只有在与表达式使用模式匹配时_
才是SQL中的通配符.如果您只是与等式或不等式运算符或正则表达式进行比较,则这些字符没有任何意义.即使您使用表达式,也不需要为了防御SQL注入而转义这些字符.如果你想将它们视为文字字符(在这种情况下用反斜杠转义它们)或表达式中的通配符(在这种情况下只是将它们留在其中),这取决于你.LIKE
LIKE
LIKE
当您将PHP变量插入到SQL表达式中而不是文字字符串值时,所有这些都适用.如果使用绑定查询参数而不是插值,则根本不需要转义.绑定参数在普通的"mysql"API中不可用,但仅在"mysqli"API中可用.
另一种情况是您插入PHP变量来代替SQL表名,列名或其他SQL语法.在这种情况下,您不能使用绑定参数; 绑定参数仅取代字符串文字.如果需要使列名称动态化(例如,ORDER BY
用户首选项的列),则应使用反引号(在MySQL中)或方括号(Microsoft)或双引号(其他标准SQL)来分隔列名称.
所以我想说你的代码可以简化为以下内容:
$quotedString = mysql_real_escape_string($string);
这就是,如果你要使用的字符串进行插值; 如果你打算将它用作绑定参数值,它甚至更简单:
$paramString = $string;