Php 为什么这会倾向于SQL注入?

Php 为什么这会倾向于SQL注入?,php,mysql,sql,security,code-injection,Php,Mysql,Sql,Security,Code Injection,我一直在阅读,当到达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 . '"'; 第一个易受

我一直在阅读,当到达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字符集


编辑:在阅读了回复文章之后,我可能需要澄清:我的想法是了解哪些值可能触发问题,以及为什么,而不是如何避免它,因为我已经在测试床上使用了PDO,但我想从过去的错误中学习并深入了解。

第一条SQL语句

'SELECT username FROM users WHERE id = ' . $id;
易于基于
=
始终为true
SQL注入。像追加
或1=1
,这总是真的,因此返回用户表中的所有行

此外,还可以附加一批恶意SQL语句

看看这个:


第二个查询稍微安全一些,但这并不意味着它不受SQL注入的影响。

第一个SQL语句

'SELECT username FROM users WHERE id = ' . $id;
易于基于
=
始终为true
SQL注入。像追加
或1=1
,这总是真的,因此返回用户表中的所有行

此外,还可以附加一批恶意SQL语句

看看这个:


第二个查询稍微安全一些,但这并不意味着它不受SQL注入的影响。

第一个SQL语句

'SELECT username FROM users WHERE id = ' . $id;
易于基于
=
始终为true
SQL注入。像追加
或1=1
,这总是真的,因此返回用户表中的所有行

此外,还可以附加一批恶意SQL语句

看看这个:


第二个查询稍微安全一些,但这并不意味着它不受SQL注入的影响。

第一个SQL语句

'SELECT username FROM users WHERE id = ' . $id;
易于基于
=
始终为true
SQL注入。像追加
或1=1
,这总是真的,因此返回用户表中的所有行

此外,还可以附加一批恶意SQL语句

看看这个:


第二个查询稍微安全一些,但这并不意味着它不受SQL注入的影响。

前面这个问题可能重复的答案比我能更好地解释这一点。从本质上讲,前两个代码片段之间的区别是:第一个片段将值用作数字(因此,当字符串未用作字符串时,终止该字符串的转义值无效),而第二个片段将值用作字符串(可以有效地转义)。您的第三个snippit应该是相对安全的,但易受addslash和各种字符编码问题的影响。@Kickstart,太好了!谢谢你的链接。我曾尝试在第三个代码段中使用相同的技术来处理cURL(同样,$user和$password值所涉及的唯一一件事是它们是预先添加的),但我没有得到它所描述的行为。也许这取决于PHP的某个版本?您的第三个snippit应该相对安全(虽然仍然可能不安全,但它上的sql注入是非常重要的),因为用户id和密码都在引号中。前面问题的可能重复项的答案比我能更好地解释这一点。从本质上讲,前两个代码片段之间的区别是:第一个片段将值用作数字(因此,当字符串未用作字符串时,终止该字符串的转义值无效),而第二个片段将值用作字符串(可以有效地转义)。您的第三个snippit应该是相对安全的,但易受addslash和各种字符编码问题的影响。@Kickstart,太好了!谢谢你的链接。我曾尝试在第三个代码段中使用相同的技术来处理cURL(同样,$user和$password值所涉及的唯一一件事是它们是预先添加的),但我没有得到它所描述的行为。也许这取决于PHP的某个版本?您的第三个snippit应该相对安全(虽然仍然可能不安全,但它上的sql注入是非常重要的),因为用户id和密码都在引号中。前面问题的可能重复项的答案比我能更好地解释这一点。从本质上讲,前两个代码片段之间的区别是:第一个片段将值用作数字(因此,当字符串未用作字符串时,终止该字符串的转义值无效),而第二个片段将值用作字符串(可以有效地转义)。您的第三个snippit应该是相对安全的,但易受addslash和各种字符编码问题的影响。@Kickstart,太好了!谢谢你的链接。我曾尝试在第三个代码段中使用相同的技术来处理cURL(同样,$user和$password值所涉及的唯一一件事是它们是预先添加的),但我没有得到它所描述的行为。也许这取决于PHP的某个版本?您的第三个snippit应该相对安全(虽然仍然可能不安全,但它上的sql注入是非常重要的),因为用户id和密码都在引号中。前面问题的可能重复项的答案比我能更好地解释这一点。从本质上讲,前两个代码片段之间的区别是:第一个片段将值用作数字(因此,当字符串未用作字符串时,终止该字符串的转义值无效),而第二个片段将值用作字符串(可以有效地转义)。您的第三个snippit应该相对安全,但易受addslash和各种字符编码问题的影响。@Kickstar