SQL注入如何工作以及如何防范它

时间:2011-04-19 19:45:24

标签: php mysql sql-injection protection

  

可能重复:
  What is SQL injection?

我看到很多php代码在stackoverflow上浮动,而且(也)很少有字符串转义。

任何人都可以

  1. 解释SQL注入是什么;
  2. 说明它对您的服务器,数据和代码的作用;
  3. 举例说明如何执行SQL注入
  4. 给php示例代码如何防止SQL注入

4 个答案:

答案 0 :(得分:11)

SQL注入是一种恶意形成的SQL查询,用于“混淆”SQL数据库以提供它不应该提供的内容。例如,请考虑以下查询

"SELECT * FROM `users` WHERE `username` = '$name'";

在正常情况下,这将有效。如果我们向此提交“Jack”,它将返回名为Jack的所有用户。但是,如果用户输入,例如“'OR 1 = 1”,则生成的查询将为

"SELECT * FROM `users` WHERE `username` = '' OR 1=1";

因为1总是等于1,并且组合子句是OR,所以每行都会返回true,这反过来会向恶意用户显示每一行。使用此技术,有人可以查看整个数据库。还要考虑是否有人提交了类似“'; DROP TABLE users”; - 的结果

"SELECT * FROM `users` WHERE `username` = ''; DROP TABLE `users`";--";

哪两个查询,一个什么都不做,第二个将删除整个用户数据库,导致数据丢失。

防止SQL注入的最佳方法是使用预准备语句。通过这些,您可以向SQL数据库发送一个类似

的查询
"SELECT * FROM `users` WHERE `username` = '?'";

这使数据库知道查询的格式(WHERE用户名等于某个值),因此在给定纯文本查询时不会产生混淆。然后数据库知道期望一个值,以及放置它的位置。然后将该值传递给可用于搜索的数据库。这也更好,因为数据库可以优化查询以加快搜索速度。

阅读准备好的陈述,这将更详细地解释这一点。

答案 1 :(得分:10)

我无法拒绝发布此内容。

1- Sql Injection在一个cartoon中比大多数其他文档更好地解释。

2-主要是它对服务器没有太大作用,只对底层数据有用。结果包括删除,插入,选择记录,删除,创建表。 (基于权限等..)

3- Examples

4-抱歉我不懂PHP。但只要您可以从View中抽象出您的数据库层,就应该没问题。

答案 2 :(得分:9)

我无法抗拒。

SQL Injection是“利用应用程序数据库层中发生的安全漏洞的代码注入技术”。换句话说,它是SQL代码注入作为查询中的用户输入。

SQL注入可以操纵数据(删除,更新,添加ecc ...)以及损坏或删除数据库的表。我不知道SQL Injections操纵脚本。

假设在您的PHP脚本中,您希望(作为用户输入)登录表单中的用户名和密码,以后在查询中使用,例如:

SELECT Id FROM Users WHERE Name = $name AND Password = $password;

用户可以在$name内和$password内插入任何他喜欢的内容(例如,通过<input>)。我们假设他添加了一个名为“1 OR 1 = 1; --”的名称,查询现在看起来像:

SELECT Id FROM Users WHERE Name = 1 OR 1 = 1; -- AND Password = $password;

然后,在;后我可以添加另一个查询或让脚本认为用户名和密码确实存在。

请注意-- AND Password = $password;是SQL注释,因此将被忽略。

如果您使用的是PHP&lt; 5然后你应该寻找mysql_real_escape_string()并在将它嵌入查询之前使用它来转义用户输入。

如果您使用的是PHP5 +,则应使用PDOmysqli扩展名来解决此问题。

答案 3 :(得分:1)

此处(以及此处其他地方)有关于此主题的很多信息,所以不要以任何方式将此答案作为完整列表,并继续自行研究 ...

  
      
  1. 解释SQL注入是什么;
  2.   
  3. 说明它对您的服务器,数据和代码的作用;
  4.   
  5. 举例说明如何执行SQL注入
  6.   
  7. 给php示例代码如何防止SQL注入
  8.   
  1. SQL注入是攻击者发现提供给您的应用程序的输入值直接发送到数据库并意识到他们可以将该输入设置为自定义SQL命令的地方。它可能就像在文本字段中输入特殊字符(例如%)并收到奇怪的响应一样简单。

  2. 它可以执行您的数据库允许该命令执行的任何操作。例如,如果您的Web应用程序具有应用程序数据库的数据库所有者权限,则攻击可能会丢弃表甚至丢弃整个数据库。或者,即使是正常的应用程序权限,攻击也可以覆盖数据或读取敏感数据(如果有这些数据,则可以使用纯文本密码)。

  3. 例如,如果某个应用程序有一个输入用户名的文本字段。如果该字段对SQL注入是开放的,则攻击者可以输入如下内容:MyName';DROP TABLE Users;--在此示例中,攻击手动完成查询,使用结束单引号和分号,然后添加另一个查询,然后注释掉任何内容之后。如果不受此保护,数据库可以运行两个查询。

  4. 这个我不知道更新的足够信息,但那里有很多:)