PHP - 检查转义字符

问题描述:

对于MySQL数据库查询我想检查并记录非转义字符。PHP - 检查转义字符

正如我想要一个安全的数据库,并希望录制尝试(现在)在SQL注入。

由于它将在测试中,因此必须将值记录为纯文本。

由于我不确定如何去做。使用序列化和序列化来查看它是否会因为转义字符存在问题而停下来,然后记录字符串。

我意识到这是一种反应性的情况,而不是主动的,但它仍然有利于测试。

+0

它有一个内置函数; '* escape_string' – 2013-04-29 05:30:59

+2

如何区分SQL注入尝试与字符串,如果不逃脱,将意外引起语法错误? – deceze 2013-04-29 05:38:01

+3

为什么有非转义字符的事实表示SQL注入的显式尝试?如果某人的名字是“O'Rourke”呢?或者在我的评论中甚至考虑有多少非转义角色。准备你的语句的一个好方法是使用准备好的语句:) http://php.net/manual/en/mysqli.prepare.php - 但是我没有看到在试图记录撇号是输入字符串的一部分。 – vcardillo 2013-04-29 05:38:34

如何检查需要转义的字符串?

要直接回答这个问题:最简单的方法可能是通过适当的转义函数运行它并查看它是否更改。例如:

if ($string !== mydatabaseadapters_escape_string($string)) { 
    // there was something escape-worthy in the string 
} 

尽管如此,这并不意味着这个字符串是一次尝试的SQL注入攻击。转义只是通过转义SQL语句中使用的特殊字符来保留SQL语法;当你忘记这么做时,SQL注入只是一种副作用。许多常规值需要被转义以不破坏SQL语法,而与注入尝试没有任何关系。

+0

我知道大多数mysql语法甚至可能是我自己的代码。但我确实喜欢有一些工具来选择我可能没有看到的东西。感谢你的回答。 – Werezwolf 2013-04-29 06:04:04

如果你真的只是想知道,如果一个字符串需要进行转义,你可以做这样的测试(这里使用PDO)

$originalString = 'Some value'; 
$quoted = substr($pdo->quote($originalString), 1, -1); 
// PDO::quote() wraps the string in quotes so using substr to remove them 

if ($originalString != $quoted) { 
    // log this string as requiring escaping 
} 

正如其他人会提到,最好的做法是使用准备好的语句,查询绑定,或至少逃避你的MySQL查询,以保护你的数据库。简而言之,这个想法就是让一个既定的函数/库处理保护数据库的工作,而不是试图推出自己的解决方案。这还有另外一个好处,就是你不需要手工批准任何“有问题”的条目,虽然这对于一个教育课程来说可能是好的,但对于在任何规模的网站中使用都是不实际的。