2015-10-06 125 views
-4

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

我一直在寻找这个问题的最后两天的完美答案,但徒劳无功。如果您可以根据SQL注入漏洞和安全性将MySQL与其他数据库进行比较,那将会更好。 PS:我非常了解MySQL和SQL注入攻击。请尝试了解问题的全部内容。

+0

任何人都可以提供答案,而不是投票下来? –

+0

看看这个http://www.rackspace.com/knowledge_center/article/sql-injection-in-mysql –

+0

另请参阅:[MySQL是否比Perl DBI下的PostgreSQL更能抵抗SQL注入攻击?](http:// stackoverflow.com/questions/2221787/is-mysql-more-resistant-to-sql-injection-attack-than-postgresql-under-perl-dbi) – Paul

回答

3

为什么MySQL的SQL注入攻击

更容易MySQL是不是。从来没有过。

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

就是这样。

而用户的问题仍然存在,正如其他答案生动地表明的那样。遵循其建议(php/mysql人员中非常常见,介意你),很快你就会享受到一流的SQL注入。

+0

好的。它可能不在当前场景中。但为什么在更早的时候呢? –

+1

@Rohit:如上所述,它从来没有。事实上,由于不支持大多数界面中的多个语句,因此它比许多弱点更容易受到攻击,这限制了轻松攻击的范围。 MySQL在没有经验的PHP编程人员中很受欢迎;这是关于它的一切。 – bobince

-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安全替代品(逃脱报价)输入的麻烦引号(')。

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

的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 \' •Evil:\';删除客户WHERE 1或用户名= \'

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

+0

我很清楚SQL注入攻击和MySQL。你能回答这个问题吗? –

+0

阅读我的答案,它有如何防止它在MySQL中。 –

+0

我不是在谈论缓解。我的问题很简单:“为什么可以对MySQL执行SQL注入攻击?” –