我一直在阅读this,当达到addslashes缓解的部分时,我遇到了这个:
$id = addslashes( $_GET['id'] );
$query = 'SELECT username FROM users WHERE id = ' . $id;
说它容易受到SQL注入攻击但不是这样:
$uname = addslashes( $_GET['id'] );
$query = 'SELECT username FROM users WHERE id = "' . $uname . '"';
第一个如何易受攻击?为什么?
当我查看使用此语法的一些旧代码时,就会出现这种情况:
$query = "SELECT * FROM users WHERE user='$user' AND password='$password'";
变量在使用之前会被添加,但我仍然被告知这是易受攻击的。我知道正确的做法现在要求PDO,但是当我无法向自己解释这将如何容易受到影响时,它只是让我感到很冷淡。
有人可以给我一些例子,它可以绕过addslashes吗?除了GBK charset
编辑:在阅读回复帖后,我或许需要澄清一下:想法是了解哪些值可以触发问题,以及为什么,而不是如何避免它,因为我已经在测试平台中使用PDO,但是我也希望从旧的错误中深入学习。答案 0 :(得分:3)
第一个SQL语句
'SELECT username FROM users WHERE id = ' . $id;
易于基于=
或always true
SQL注入。就像追加OR 1=1
一样,它总是正确的,因此返回users表中的所有行。
此外,可以附加批量恶意SQL语句。
检查出来:SQL Injection
第二个查询更安全一点,但这并不意味着SQL注入是安全的。