1

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

因为我想要一个安全的数据库并且想要在 SQL 注入时记录尝试(现在)。

由于它将处于测试阶段,因此必须将值记录为纯文本。

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

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

4

3 回答 3

5

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

直接回答这个问题:最简单的方法大概就是通过相应的转义函数运行一下,看看有没有变化。例如:

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

但这至少并不意味着该字符串是一次尝试的 SQL 注入攻击。转义只是通过转义 SQL 语句中使用的特殊字符来保留 SQL 语法;SQL 注入只是当您忘记执行此操作时可能产生的副作用。许多常规值需要转义才能不破坏 SQL 语法,而与注入尝试无关。

于 2013-04-29T05:45:54.850 回答
4

正如其他人将提到的,最佳实践是使用准备好的语句、查询绑定,或者至少对 MySQL 查询进行转义,以保护您的数据库。简而言之,这个想法是让一个已建立的函数/库来处理保护数据库的工作,而不是尝试推出自己的解决方案。这还有一个额外的好处,即您不需要手动批准任何“有问题的”条目,虽然这可能对教育课程有好处,但在任何规模的网站中使用都是不切实际的。

于 2013-04-29T05:48:06.617 回答
3

如果你真的只是想知道一个字符串是否需要转义,你可以做一个这样的测试(在这里使用 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
}
于 2013-04-29T05:46:40.690 回答