SQL 注入在概念上是如何工作的? (简要)[重复]
Posted
技术标签:
【中文标题】SQL 注入在概念上是如何工作的? (简要)[重复]【英文标题】:How do SQL injections conceptually work? (brief) [duplicate] 【发布时间】:2011-07-26 18:52:25 【问题描述】:可能的重复:What is SQL injection?XKCD SQL injection - please explain
我拥有一家公司,并希望了解 php 的流行情况,同时我正在招聘人员来维护和扩展其网站的代码,我一直在关注 SQL 注入的安全性,但不太了解这些代码会如何影响SQL 数据库,因为它们包含在查询的字符串中。
如何显示安全漏洞,以便我亲眼看到正在发生的事情?
【问题讨论】:
阅读此secure.wikimedia.org/wikipedia/en/wiki/SQL_injection 并返回任何具体问题 What is SQL injection? 也可能重复,请在询问之前使用search。 【参考方案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
【讨论】:
IMO 将参数数组传递给 PDO 的execute()
方法比使用单独的函数调用绑定参数更简洁。
(通过,chriso的例子是更好)【参考方案2】:
mysql_query("SELECT * FROM users WHERE username = '$username'");
看看当我们将 $username
变量设置为讨厌的东西时会发生什么:
$username = "' OR 1";
查询变为:
SELECT * FROM users WHERE username = '' OR 1
攻击者可以使用不正确转义的变量将 SQL 注入到您的查询中,从而有效地绕过您现有的任何(较差的)安全措施。
更多信息here
【讨论】:
【参考方案3】:还值得注意的是,您可以通过一些工具测试您的网站是否容易受到注入攻击。
看看
http://sqlmap.sourceforge.net/
【讨论】:
我会看看这个,可能是一个很好的学习体验。【参考方案4】:危险来自事实,即 SQL 查询是程序。 因此,可以注入恶意代码来代替某些操作员。
字符串由引号分隔。如果字符串中的分隔符没有被转义,它实际上会关闭字符串语句,其余的将是恶意代码。
不仅字符串是动态的。如果 $amount 包含恶意代码以及ORDER BY $order
,则没有分隔符将保护LIMIT $amount
。
【讨论】:
谢谢,这很有趣!以上是关于SQL 注入在概念上是如何工作的? (简要)[重复]的主要内容,如果未能解决你的问题,请参考以下文章