我注意到mysql_real_escape_string
函数有些奇怪。它不会逃脱“
或”
,例如:“TEST”
未转换为\“TEST\”
。
这些功能可以正常使用"
(仔细观察,你会发现它们不同)
任何想法如何解决这个问题,我宁愿不从头开始编写这个函数。是否已弃用,是否有替代方案?
编辑:谢谢大家回答。为了澄清我试图将此字符串我喜欢的东西“目录\ r \ n 插入到数据库中,并且由于某种原因它无法正常工作。一切都适用于任何其他字符串,我没有得到任何错误消息,它只是没有出现在数据库中。所以我认为它可能与“。
有关对我这么容易!
EDIT2
$interestTable = "5431591 1 Things I Like” <br>";
//problem lies here
$count = 0;
$interestTable = preg_replace_callback( '/<br>/', function( $match) use( $tagName, &$count) {
return $tagName[$count++][0] . ' ' . PHP_EOL;
}, $interestTable);
//$interestTable = "5431591 1 Things I Like” catalog \r\n" after format
$interestTable = mysql_real_escape_string($interestTable);
echo $interestTable;
mysql_query("INSERT INTO $tbl_name(userID,storyID,rank, storyType, interestTable)VALUES('$userID','$storyID','$rank','$storyType','$interestTable')", $dbh1);
EDIT3 我没有弄错,我把字符串从我喜欢的东西“目录\ r \ n 更改为我的AA目录\ r \ n
答案 0 :(得分:5)
烨。永远不要依赖这样的黑名单机制来保障安全。它已经坏了,可能会导致一些有趣的SQL注入:
$query = "SELECT id, title, body FROM posts WHERE id = " . mysql_real_escape_string($_GET['id']);
仍然可以注入:
1 OR 1=1
导致:
SELECT id, title, body FROM posts WHERE id = 1 OR 1=1
返回所有结果。不相信这是坏事吗?好的...
1 OR 1=1 UNION SELECT id, username, password FROM users
糟糕!
为什么这是注射剂?开发人员忘了引用数字ID。如果您永远看到自己犯了这个错误,那么您应该寻求更好的解决方案。
我的建议?停止使用字符串连接,停止使用已弃用的mysql_
函数,并使用参数化查询切换到MySQLi或PDO,其中内容与查询语言明确分开。
答案 1 :(得分:3)
卷曲引号不需要转义,因为它们对MySQL没有特殊意义。
答案 2 :(得分:3)
这是因为“智能”引号不被MySQL引擎识别为引号,因此完全没有注入攻击的风险。
答案 3 :(得分:2)
您无需转义“
或”
。没有什么可以解决的。
答案 4 :(得分:0)
不再维护mysql_
函数,自PHP 5.5.0起不推荐使用它们
但是,您无需转义“
或”
。这些不被MySQL识别为引号。
我建议您在连接MySQL数据库时使用PDO或MySQLi扩展名。
答案 5 :(得分:0)
正如我所想,事实证明这是一个令人困惑的问题。
在我的字符串上使用 utf8_encode (http://php.net/manual/en/function.utf8-encode.php)后,一切正常。
谢谢大家的帮助(特别是Polynomial)。