mysql_real_escape_string没有逃避所有类型的“

时间:2013-04-23 15:14:30

标签: php mysql

我注意到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 并且它有效。我不知道为什么会发生这种情况,也许在转换为字符串后,某些东西会被编码弄乱,但我不确定。我确切知道,从字符串中删除后,一切正常

6 个答案:

答案 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)。