php - 为什么这容易发生 SQL 注入(inject)?

标签 php mysql sql security code-injection

我一直在阅读 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/

相关文章:

php - 设置 GD Lib imagerotate 和 imagecopy 的背景颜色

PHP OOP 困境 : how to keep a database connection 'within' a class object?

PHP 类问题

php - 在 php 中迭代数组,但在迭代期间添加到数组/从数组中删除

mysql - 字符集问题

javascript - 谷歌地图点击标记打开数据库中的 URL

mysql - 如何使用 ALTER 语句与 GENERATE ALWAYS INSIDE mysql 函数?

sql - 如何使用 Cube、Pivo​​t 或 Rollup SQL 转换列中的行

sql - BigQuery : Format ISO Date

sql - PostgreSQL 中的条件语句