SQL注入在概念上如何工作? (简要)

时间:2011-03-31 10:27:59

标签: php sql security scripting

  

可能重复:
  What is SQL injection?
  XKCD SQL injection - please explain

我拥有一家公司,我希望知道PHP的漏洞,而我正在招聘人员来维护和扩展其网站的代码,我正在考虑SQL注入的安全性,并且不太明白这些代码会如何影响SQL数据库,因为它们包含在查询的字符串中。

如何显示安全漏洞,以便我可以亲眼看到发生了什么?

4 个答案:

答案 0 :(得分:1)

尽管可以在线解释其中的大部分内容,但我有一种更详细的解释。

如果您可以看到字符串将会变成什么样,那么您将理解您正在编写的脚本的潜在风险,因为它将在实际运行之前成为其他内容。

一个琐碎的恶意例子:

$fromtheuser = "foo'; DROP TABLE affiliates; --";
$q = "SELECT id FROM affiliates WHERE website = '$fromtheuser'";

你能解释一下这会变成什么样吗?开发商不能。

"SELECT id FROM affiliates WHERE website = 'foo'; DROP TABLE affiliates; --'"

此向量的关键部分为';以结束SQL字符串原语,--'注释掉推送的引用。

在编写的代码中,您将要寻找的是在将数据放入查询之前对数据进行适当的清理和过滤。帮助保护此前端的一个重要工具是某种形式的准备查询,因此您可以将参数绑定到查询,以便无需操作。

我们可以使用MySQLi(改进版)或我个人喜欢的PDO中的预处理语句来实现这一点。快速了解它们的样子。

mysql_real_escape_string(可以处理编码和引号)

<?php
$clean = mysql_real_escape_string($q)

MySQLi:

<?php
$clean = $mysqli->prepare("SELECT id FROM affiliates WHERE website = ?");
$clean->bind_param('s', $website); //'s' for 'string'

PDO:

<?php
$clean = $pdo->prepare("SELECT id FROM affiliates WHERE website = ?");
$clean->bindParam(1, $website); //you can use :site rather than ? and 1

答案 1 :(得分:0)

mysql_query("SELECT * FROM users WHERE username = '$username'");

看看当我们将$username变量设置为讨厌的东西时会发生什么:

$username = "' OR 1";

查询变为:

SELECT * FROM users WHERE username = '' OR 1

攻击者可以使用不正确转义的变量将SQL注入您的查询,从而有效地绕过您现有的任何(差)安全措施。

更多信息here

答案 2 :(得分:0)

值得注意的是,有一些工具可以测试您的网站是否容易受到注射攻击。

看看

http://sqlmap.sourceforge.net/

答案 3 :(得分:0)

SQL查询程序这一事实带来的危险 因此,可以代替某些运营商注入恶意代码。

  1. 字符串由引号分隔。如果字符串内的分隔符没有被转义,它实际上会关闭字符串语句,其余的将是恶意代码。

  2. 不仅字符串是动态的。如果$ amount包含恶意代码,LIMIT $amount

  3. ,则分隔符不会保护ORDER BY $order