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