什么是SQL注入?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (40)

有人能解释一下SQL注入吗?它是如何造成漏洞的?注入SQL的点到底在哪里?

提问于
用户回答回答于

当应用程序的用户能够影响数据库查询的含义时,就会发生SQL注入。当来自用户输入的任意字符串连接在一起以创建提供给数据库的SQL时,通常会发生这种情况。例如,假设我们有以下代码(在PHP中,但对于任何语言都是如此),这可能会用于处理用户登录。

$sql = "SELECT  FROM users WHERE username='".$_GET['username']."' AND password='".$_GET['password']."'";

当用户输入类似的东西时会造成伤害

administrator'; --

...为用户名。如果没有正确的编码,查询将变为

SELECT * FROM users WHERE username='administrator'; -- AND password=''

这里的问题是'在用户名中关闭用户名字段',然后 - 启动一个SQL注释,导致数据库服务器忽略字符串的其余部分。最终结果是用户现在可以以管理员身份登录,而无需知道密码。SQL Inection也可以用来执行UPDATE,DELETE或DROP查询并真正损坏数据库。

SQL注入可以通过使用参数化查询或应用你的语言/工具箱的转义函数(例如PHP中的mysql_real_escape_string())来阻止。

用户回答回答于

有人可以解释SQL注射器吗?

当你将某些内容插入到SQL查询字符串中时,会发生SQL注入,并且结果会以你不打算的方式修改查询语法。

它不一定是恶意的,它可能是一个意外。但意外的SQL注入更可能导致错误而不是漏洞。

有害内容不一定来自用户,它可能是您的应用程序从任何来源获得的内容,甚至可以通过代码生成。

它是如何导致漏洞的?

它可能导致漏洞,因为攻击者可以将值发送到他们知道将被插入到SQL字符串中的应用程序。通过非常聪明,他们可以操纵查询结果,读取数据,甚至改变他们不应该被允许执行的数据。

PHP中的示例:

$password = $_POST['password'];
$id = $_POST['id'];
$sql = "UPDATE Accounts SET PASSWORD = '$password' WHERE account_id = $id";

现在假设攻击者将POST请求参数设置为“ password=xyzzy”和“ id=account_id”,产生以下SQL:

UPDATE Accounts SET PASSWORD = 'xyzzy' WHERE account_id = account_id

尽管我希望$id是一个整数,但攻击者选择了一个字符串作为列的名称。当然,每一行的条件都是真实的,所以攻击者只需为每个帐户设置密码即可。现在攻击者可以登录到任何人的帐户 - 包括特权用户。

SQL注入点到底在哪里?

它不是注入的SQL,它是插入(“注入”)到SQL字符串中的内容,导致与我想要的不同类型的查询。我信任动态内容而不验证它,并盲目地执行结果SQL查询。这是麻烦开始的地方。

SQL注入是应用程序代码中的错误,通常不在数据库或数据库访问库或框架中。SQL注入的补救措施:

  • 过滤器输入:验证内容是否符合您的预期格式,而不是假设。例如,应用一个正则表达式,或者像使用intval()函数一样使用数据类型强制转换。
  • 转义输出:在这种情况下,“输出”是内容与SQL字符串结合的位置。在插入字符串时,通过使用转义字面引号字符的函数以及可能是字符串边界的任何其他字符来避免不平衡的引号。

扫码关注云+社区

领取腾讯云代金券