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

可能重复:
什么是SQL注入?
XKCD SQL注入 - 请解释

我拥有一家公司,并且希望知道PHP在我为人员维护和扩展其网站代码的过程中所享有的乐趣,但我并不十分理解这些代码如何影响SQL数据库因为它们在查询中包含字符串。

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


虽然大部分内容都可以在网上解释,但我有一种感觉可以更详细地解释这一点。

如果你能想象这个字符串会变成什么样,你就会明白你正在编写的脚本的潜在风险,因为它在实际运行之前会变成别的东西。

一个微不足道的恶意例子:

$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

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

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

$username = "' OR 1";

该查询变为:

SELECT * FROM users WHERE username = '' OR 1

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

更多信息在这里


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

看一眼

http://sqlmap.sourceforge.net/

链接地址: http://www.djcxy.com/p/93815.html

上一篇: How do SQL injections conceptually work? (brief)

下一篇: Injection C# SQL