为什么 MySQL 更容易受到 SQL 注入攻击
Why is MySQL more susceptible to SQL Injection attacks
为什么 MySQL 更容易受到 SQL 注入攻击?
这两天我一直在寻找这个问题的完美答案,但没有成功。如果您能在 SQL 注入漏洞和安全性方面将 MySQL 与其他数据库进行比较,那就更好了。
PS:我很清楚 MySQL 和 SQL 注入攻击。请尝试理解问题的全部内容。
什么是SQL注入
SQL 注入是指有人在您不知情的情况下在您的数据库中插入 MySQL 语句成为 运行 的行为。注入通常发生在你要求用户输入时,比如他们的名字,而不是他们给你一个 MySQL 语句,你会在不知不觉中 运行 在你的数据库中。
SQL 注入示例
虽然上面的示例显示了攻击者可能会访问大量他们不应该拥有的信息的情况,但攻击可能会更糟。例如,攻击者可以通过执行 DELETE 语句清空 table。
MySql 和代码
$name_evil = "'; DELETE FROM customers WHERE 1 or username = '";
// our MySQL query builder really should check for injection
$query_evil = "SELECT * FROM customers WHERE username = '$name_evil'";
// the new evil injection query would include a DELETE statement
echo "Injection: " . $query_evil;
显示
SELECT * FROM customers WHERE username = ' '; DELETE FROM customers WHERE 1 or username = ' '
如果您是 运行 这个查询,那么注入的 DELETE 语句将完全清空您的 "customers" table。既然您知道这是一个问题,那么您该如何预防呢?
注入预防 - mysql_real_escape_string()
幸运的是,这个问题已经知道一段时间了,PHP 有一个特制的功能来防止这些攻击。您需要做的就是使用一口函数mysql_real_escape_string。
mysql_real_escape_string 所做的是获取将在 MySQL 查询中使用的字符串和 return 所有 SQL 注入尝试安全转义的相同字符串.基本上,它将用一个 MySQL 安全的替代品,一个转义的引号 \'.
替换用户可能输入的那些麻烦的引号 (')
让我们在之前的两次注入攻击中尝试这个函数,看看它是如何工作的。
MySQL & PHP 代码
//NOTE: you must be connected to the database to use this function!
// connect to MySQL
$name_bad = "' OR 1'";
$name_bad = mysql_real_escape_string($name_bad);
$query_bad = "SELECT * FROM customers WHERE username = '$name_bad'";
echo "Escaped Bad Injection: <br />" . $query_bad . "<br />";
$name_evil = "'; DELETE FROM customers WHERE 1 or username = '";
$name_evil = mysql_real_escape_string($name_evil);
$query_evil = "SELECT * FROM customers WHERE username = '$name_evil'";
echo "Escaped Evil Injection: <br />" . $query_evil;
显示
Escaped Bad Injection:
SELECT * FROM customers WHERE username = '\' OR 1\''
Escaped Evil Injection:
SELECT * FROM customers WHERE username = '\'; DELETE FROM customers WHERE 1 or username = \''
注意那些邪恶的引号已经用反斜杠\转义了,防止了注入攻击。现在所有这些查询要做的就是尝试找到一个完全荒谬的用户名:
•差:\' OR 1\'
•邪恶的: \'; DELETE FROM customers WHERE 1 或用户名 = \'
而且我认为我们不必担心那些愚蠢的用户名可以访问我们的 MySQL 数据库。所以请务必使用方便的 mysql_real_escape_string() 函数来帮助防止 SQL 对您网站的注入攻击。看完本课,你没有理由不使用它!
Why is MySQL more susceptible to SQL Injection attacks
Mysql 不是。从来没有。
MySQL 并不比任何其他 DBMS 更容易受到影响。 不是魔杖,是巫师,你懂的。不是mysql,而是它的用户更容易受到SQL注入攻击。
就这些了。
而且用户的问题仍然存在,其他答案生动地证明了这一点。遵循它的建议(请注意,在 php/mysql 人中非常普遍),您很快就会享受第一次 class SQL 注射。
为什么 MySQL 更容易受到 SQL 注入攻击?
这两天我一直在寻找这个问题的完美答案,但没有成功。如果您能在 SQL 注入漏洞和安全性方面将 MySQL 与其他数据库进行比较,那就更好了。
PS:我很清楚 MySQL 和 SQL 注入攻击。请尝试理解问题的全部内容。
什么是SQL注入
SQL 注入是指有人在您不知情的情况下在您的数据库中插入 MySQL 语句成为 运行 的行为。注入通常发生在你要求用户输入时,比如他们的名字,而不是他们给你一个 MySQL 语句,你会在不知不觉中 运行 在你的数据库中。
SQL 注入示例
虽然上面的示例显示了攻击者可能会访问大量他们不应该拥有的信息的情况,但攻击可能会更糟。例如,攻击者可以通过执行 DELETE 语句清空 table。
MySql 和代码
$name_evil = "'; DELETE FROM customers WHERE 1 or username = '";
// our MySQL query builder really should check for injection
$query_evil = "SELECT * FROM customers WHERE username = '$name_evil'";
// the new evil injection query would include a DELETE statement
echo "Injection: " . $query_evil;
显示
SELECT * FROM customers WHERE username = ' '; DELETE FROM customers WHERE 1 or username = ' '
如果您是 运行 这个查询,那么注入的 DELETE 语句将完全清空您的 "customers" table。既然您知道这是一个问题,那么您该如何预防呢?
注入预防 - mysql_real_escape_string()
幸运的是,这个问题已经知道一段时间了,PHP 有一个特制的功能来防止这些攻击。您需要做的就是使用一口函数mysql_real_escape_string。
mysql_real_escape_string 所做的是获取将在 MySQL 查询中使用的字符串和 return 所有 SQL 注入尝试安全转义的相同字符串.基本上,它将用一个 MySQL 安全的替代品,一个转义的引号 \'.
替换用户可能输入的那些麻烦的引号 (')让我们在之前的两次注入攻击中尝试这个函数,看看它是如何工作的。
MySQL & PHP 代码
//NOTE: you must be connected to the database to use this function!
// connect to MySQL
$name_bad = "' OR 1'";
$name_bad = mysql_real_escape_string($name_bad);
$query_bad = "SELECT * FROM customers WHERE username = '$name_bad'";
echo "Escaped Bad Injection: <br />" . $query_bad . "<br />";
$name_evil = "'; DELETE FROM customers WHERE 1 or username = '";
$name_evil = mysql_real_escape_string($name_evil);
$query_evil = "SELECT * FROM customers WHERE username = '$name_evil'";
echo "Escaped Evil Injection: <br />" . $query_evil;
显示
Escaped Bad Injection:
SELECT * FROM customers WHERE username = '\' OR 1\''
Escaped Evil Injection:
SELECT * FROM customers WHERE username = '\'; DELETE FROM customers WHERE 1 or username = \''
注意那些邪恶的引号已经用反斜杠\转义了,防止了注入攻击。现在所有这些查询要做的就是尝试找到一个完全荒谬的用户名: •差:\' OR 1\' •邪恶的: \'; DELETE FROM customers WHERE 1 或用户名 = \'
而且我认为我们不必担心那些愚蠢的用户名可以访问我们的 MySQL 数据库。所以请务必使用方便的 mysql_real_escape_string() 函数来帮助防止 SQL 对您网站的注入攻击。看完本课,你没有理由不使用它!
Why is MySQL more susceptible to SQL Injection attacks
Mysql 不是。从来没有。
MySQL 并不比任何其他 DBMS 更容易受到影响。 不是魔杖,是巫师,你懂的。不是mysql,而是它的用户更容易受到SQL注入攻击。
就这些了。
而且用户的问题仍然存在,其他答案生动地证明了这一点。遵循它的建议(请注意,在 php/mysql 人中非常普遍),您很快就会享受第一次 class SQL 注射。