SQL 注入

SQL 注入利用了未能验证用户输入的 Web 应用程序。黑客可以通过 Web 应用程序恶意传递 SQL 命令,由后端数据库执行。

SQL 注入可以未经授权访问数据库或直接从数据库检索信息。许多数据泄露都是由 SQL 注入造成的。

Pie chart of most common vulnerabilities: SQL Injection is responsible for 50% of vulnerabilities, Cross Site Scripting is responsible for 42% of vulnerabilities, Source Code Disclosure is responsible for 7% of vulnerabilities.

原始来源

工作原理

Screenshot of the login form with username and password fields

输入用户名和密码后,在 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) 在每个 (') 之前添加了 (/)。修改后的魔法字符串无法绕过身份验证,您的数据库保持安全。

另见