2013-04-23 47 views
-1

我注意到一些奇怪的与mysql_real_escape_string功能。它不逸出,例如:“TEST”不转化为\“TEST\”mysql_real_escape_string不逃避所有类型的”

的功能很好地工作"(仔细观察,你会看到它们是不同的)

不知道如何解决这个问题,我不想从头开始写这个功能。它是否被弃用,是否有其他选择?

编辑:谢谢大家的回答。为了澄清我试图将这个字符串我喜欢的东西“目录\ 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

停止使用'mysql_'函数。 – Kermit 2013-04-23 15:15:16

+2

此行为是设计使然;那些报价是无害的。 – SLaks 2013-04-23 15:15:47

+4

[**请不要在新代码中使用'mysql_ *'函数**](http://bit.ly/phpmsql)。他们不再被维护[并且被正式弃用](http://j.mp/XqV7Lp)。看到[**红框**](http://j.mp/Te9zIL)?学习[*准备的语句*](http://j.mp/T9hLWi),并使用[PDO](http://php.net/pdo)或[MySQLi](http://php.net/ mysqli) - [这篇文章](http://j.mp/QEx8IB)将帮助你决定哪个。如果你选择PDO,[这里是一个很好的教程](http://j.mp/PoWehJ)。 – ceejayoz 2013-04-23 15:15:50

回答

3

弯引号不需要进行转义,因为他们没有任何特殊含义的MySQL。

3

这是因为“聪明”引号不承认为MySQL的引擎报价,并因此造成绝对没有注入攻击的风险。

+0

这就是我的想法,但出于某种原因,我无法将'我喜欢的东西\ r \ n'目录插入到目录中。对于任何其他字符串,一切都很好。 – r3x 2013-04-23 15:42:03

2

你不需要逃避。没有什么可以解决的。

0

mysql_功能不再保留并且弃用PHP 5.5.0

你并不需要但是逃避的。这些不被MySQL识别为引号。

我会建议你使用PDO或连接到MySQL数据库时MySQLi扩展的。

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

将2个引号添加到您的查询实际上比移动到参数化查询要简单:) – 2013-04-23 15:34:52

+6

@YourCommonSense是的,但那不是**点。你能保证你会抓住这样的每一个“陷阱”吗?几乎我测试的所有应用都属于SQL注入,因为开发人员忘记了转义参数或不正确地转义它,而不是*因为他们对安全问题一无所知。它对于MySQLi或PDO是非常安全的。来源:二十年的软件开发,多年的安全研究,渗透测试工作,以及[Sec.SE](http://security.stackexchange.com/)上的30k代表。 – Polynomial 2013-04-23 15:40:52

+0

同意。但是,您也可以使用旧的mysql ext来伪造准备好的语句。所以,这个必须是一个重点,而不仅仅是API,它本身不会有任何好处。 – 2013-04-23 15:51:13