SQL 注入
SQL 注入利用了未能验证用户输入的 Web 应用程序。黑客可以通过 Web 应用程序恶意传递 SQL 命令,由后端数据库执行。
SQL 注入可以未经授权访问数据库或直接从数据库检索信息。许多数据泄露都是由 SQL 注入造成的。

工作原理

输入用户名和密码后,在 GUI 背后,SQL 查询的工作方式如下
sql
"SELECT Count(*) FROM Users WHERE Username=' " + txt.User.Text+" ' AND Password=' "+ txt.Password.Text+" ' ";
现在假设用户输入用户名:admin 和密码:passwd123,所以点击登录按钮后,SQL 查询将如下运行
sql
"SELECT Count(*) FROM Users WHERE Username=' admin ' AND Password=' passwd123 ' ";
如果凭据正确,则允许用户登录,因此这是一种非常简单(因此不安全)的机制。黑客利用这种不安全性来获得未经授权的访问。
黑客使用一个称为“魔法字符串”的简单字符串,例如
用户名:admin
密码:anything 'or'1'='1
点击登录按钮后,SQL 查询将如下工作
sql
"SELECT Count(*) FROM Users WHERE Username=' admin ' AND Password=' anything 'or'1'='1 ' ";
请仔细查看上述查询的密码部分。
Password=' anything 'or'1'='1 '
密码不是“anything”,因此 password=anything 的结果是 FALSE,但“1”='1' 是一个 TRUE 语句,因此返回 TRUE 值。最后,由于 OR 运算符,值 (FALSE OR TRUE) 为 TRUE,因此身份验证成功绕过。仅仅由于一个简单的字符串(魔法字符串),整个数据库就被攻破了。
如何预防
在执行用户凭据查询之前,进行如下更改
php
$id = $_GET["id"]
(1) $id = stripslashes($id)
(2) $id = mysql_real_escape_String($id)
因此,由于 (1) 输入字符串中的每个单引号 (') 都被替换为双引号 ("),并且由于 (2) 在每个 (') 之前添加了 (/)。修改后的魔法字符串无法绕过身份验证,您的数据库保持安全。