为什么MySQL更容易受到SQL注入攻击

时间:2015-10-06 06:03:27

标签: mysql security sql-injection

为什么MySQL更容易受到SQL注入攻击?

过去两天我一直在寻找这个问题的完美答案,但是徒劳无功。如果您可以在SQL注入漏洞和安全性方面将MySQL与其他数据库进行比较,那会更好。

PS:我很清楚MySQL和SQL注入攻击。请尝试了解问题的全部内容。

2 个答案:

答案 0 :(得分:3)

  

为什么MySQL更容易受到SQL注入攻击

Mysql不是。从来没有。

MySQL不比任何其他DBMS更容易受到影响。 这不是魔杖,而是巫师,你知道。它不是mysql,而是更易受SQL注入攻击的用户。

就是这样。

用户的问题仍然存在,其他答案生动地证明了这一点。遵循它的建议(在php / mysql人员中非常常见,请注意),并且很快就会享受到一流的SQL注入。

答案 1 :(得分:-3)

什么是SQL注入

SQL注入是指某人在您不知情的情况下插入要在您的数据库上运行的MySQL语句的行为。注入通常发生在您询问用户输入时,例如他们的姓名,而不是名称,他们会给您一个MySQL语句,您将无意中在您的数据库上运行。

SQL注入示例

虽然上面的示例显示了攻击者可能访问他们不应该拥有的大量信息的情况,但攻击可能会更糟。例如,攻击者可以通过执行DELETE语句清空表。

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语句将完全清空您的"客户"表。既然你知道这是一个问题,你怎么能阻止它呢?

注入预防 - mysql_real_escape_string()

幸运的是,这个问题已经有一段时间了,PHP有一个特殊的功能来防止这些攻击。您需要做的就是使用一个函数mysql_real_escape_string。

mysql_real_escape_string所做的是获取将在MySQL查询中使用的字符串,并返回相同的字符串,并安全地转义所有SQL注入尝试。基本上,它将取代用户可能使用MySQL安全替代品输入的麻烦的引号('),转义引用\#39;。

让我们在之前的两次注入攻击中尝试这个功能,看看它是如何工作的。

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 = \'' 

请注意,那些邪恶的引号已经使用反斜杠\来进行转义,从而防止了注入攻击。现在所有这些查询都会尝试找到一个完全荒谬的用户名: •不好:\&#39;或1 \&#39; •邪恶:\&#39 ;;从客户WHERE 1或用户名= \&#39;

删除

而且我认为我们不必担心那些愚蠢的用户名可以访问我们的MySQL数据库。因此,请使用方便的mysql_real_escape_string()函数来帮助防止对您网站的SQL注入攻击。阅读本课后,你没有理由不使用它!