当前位置:  开发笔记 > 编程语言 > 正文

什么是SQL注入?

如何解决《什么是SQL注入?》经验,为你挑选了5个好方法。

有人可以解释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注入的情况.请参阅如何在PHP中阻止SQL注入?举些例子.



1> Bill Karwin..:

有人可以解释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注入的情况.请参阅如何在PHP中阻止SQL注入?举些例子.



2> Jim OHallora..:

当应用程序的用户能够影响数据库查询的含义时,就会发生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查询,并真正损坏数据库.

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

一旦你理解了SQL注入,你就会得到这个漫画背后的笑话.



3> Sebastian Pa..:

SQL注入是指那些应该是数据的东西被不情愿地视为SQL代码.

例如,如果你这样做的话

mysql_query("SELECT * FROM posts WHERE postid=$postid");

通常它会给你带有给定id的帖子,但是假设它$postid被设置为字符串10; DROP TABLE posts --; 突然之间,您发送的实际查询是

mysql_query("SELECT * FROM posts WHERE postid=10; DROP TABLE posts --");

这是一个很大的问题,因为你会因恶意用户丢失整个帖子表 - 哦亲爱的.

防止这种情况的最简单方法是使用预准备语句,例如通过PDO或MySQLi.

那么PDO中的等效示例就是

$statement = $db->prepare('SELECT * FROM posts WHERE postid = :postid');
$statement->bindValue(':postid', $postid);
$statement->execute();

这样做可以确保数据库系统知道$ postid将被视为数据而不是代码,因此将被适当地处理.



4> Bill Karwin..:

StackOverflow已经多次回答了这个问题,但这是一个让每个人都知道的重要话题,所以我不打算投票来关闭这个问题.

以下是我过去关于此主题的一些答案的链接:

什么是SQL注入?

如何保护此函数免受SQL注入?

参数真的足以阻止Sql注入吗?

SQL注入今天是否存在风险?

我本月也在MySQL大会上做了一个演讲,我的幻灯片在线:

SQL注入神话和谬误



5> John Weldon..:

SQL注入是恶意用户将SQL放入输入字段以尝试在您的服务器上运行SQL的地方.

我坚持的#1建议是使用参数化存储过程而不是在代码中构建原始SQL.

存储过程参数不会被执行,在大多数情况下使它们安全.

推荐阅读
李桂平2402851397
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有