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 注入在概念上是如何工作的? (简要)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

《小迪网络安全笔记》 第十二节:WEB漏洞-SQL注入之简要SQL注入

WEB漏洞——SQL注入之简要SQL注入

SQL注入是如何完成的? [复制]

如何在 iOS 上注入用户脚本?

简要MYSQL注入

我如何防止使用codeigniter进行sql注入[重复]