为了账号安全,请及时绑定邮箱和手机立即绑定

什么是SQL注入

什么是SQL注入

慕慕森 2019-05-21 16:25:54
什么是SQL注入?有人可以解释SQL注入吗?它是如何导致漏洞的?注入SQL的确切位置在哪里?
查看完整描述

4 回答

?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

当应用程序的用户能够影响数据库查询的含义时,就会发生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注入,你就会得到这个漫画背后的笑话。


查看完整回答
反对 回复 2019-05-21
?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

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 --");

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

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

那么PDO中的等效示例就是

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

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


查看完整回答
反对 回复 2019-05-21
?
慕勒3428872

TA贡献1848条经验 获得超6个赞

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

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

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


查看完整回答
反对 回复 2019-05-21
  • 4 回答
  • 0 关注
  • 447 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号