我一直在阅读 this当到达 addslashes 缓解部分时,我遇到了这个:
$id = addslashes( $_GET['id'] );
$query = 'SELECT username FROM users WHERE id = ' . $id;
说它容易受到 SQL 注入(inject)攻击,但不是这样:
$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字符集
编辑:阅读回复帖子后,我可能需要澄清:我的想法是了解哪些值可能会触发问题,以及为什么,而不是如何避免它,因为我已经在测试平台中使用 PDO,但是也想从旧错误中吸取教训并深入学习。
最佳答案
第一条SQL语句,
'SELECT username FROM users WHERE id = ' . $id;
容易出现基于 =
或 always true
的 SQL 注入(inject)。就像附加 OR 1=1
一样,它始终为真,因此返回用户表中的所有行。
此外,还可以附加一批恶意SQL语句。
检查一下:SQL Injection
第二个查询更安全一些,但这并不意味着它可以避免 SQL 注入(inject)。
关于php - 为什么这容易发生 SQL 注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32092299/