为什么这容易出现SQL注入?

时间:2015-08-19 09:58:45

标签: php mysql sql security code-injection

我一直在阅读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,但是我也希望从旧的错误中深入学习。

1 个答案:

答案 0 :(得分:3)

第一个SQL语句

'SELECT username FROM users WHERE id = ' . $id;

易于基于=always true SQL注入。就像追加OR 1=1一样,它总是正确的,因此返回users表中的所有行。

此外,可以附加批量恶意SQL语句。

检查出来:SQL Injection

第二个查询更安全一点,但这并不意味着SQL注入是安全的。