热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

深入研究数据访问:什么是SQL注入

简单地说,SQL注入是一种技术,它可以让恶意用户注入SQL命令,这些命令在语义上是合法的,但可以改变命令预期的行为,并且有可能危及应用程序的安全。这会儿你可能在挠头,并尝试多读几次看是否有更多的意义。通过示例解释起来会更直观一些。

简单地说,SQL注入是一种技术,它可以让恶意用户注入SQL命令,这些命令在语义上是合法的,但可以改变命令预期的行为,并且有可能危及应用程序的安全。这会儿你可能在挠头,并尝试多读几次看是否有更多的意义。通过示例解释起来会更直观一些。

想想前面章节看到的SQL,一个典型的例子是根据所属的类别检索记录:


1
varsql ="SELECT* FROM Items where CategoryId = 2";

<

该语句的问题是:类别是常量。它不会改变,这意味着始终会检索出属于WHERE语句指定的类别的数据。根据网站的情况和需求,这可能确实不是一件坏事。向用户提供一种可以通过类别过滤产品的方法是非常常见的需求。通常使用表单,将类别列表放在下拉菜单或文本框中。服务器端代码接收到传递过来的选项,用它动态组装成一条可用的SQL语句,如下所示:


1
varsql ="SELECT * FROM Items WHERE CategoryId = "+ Request["categoryId"];

<

此刻,任何传入Request[“categoryId”]的值都将和SQL字符串连接在一起并在数据库中执行。没有阻止用户向文本框里输入非法信息的措施。如果用户向文本框中输入垃圾数据,连接在一起的结果可能会不符合SQL语法,网站会出现问题;否则SQL会成功执行。在前面的例子里,如果用户输入数值2,同时对前一章的示例数据库执行SQL,那么将导致所有属于Computing类别的条目被检索出来。但是用户还可以向文本框中输入下面的内容:


1
2or1=1

<

当被拼接在一起时候,结果会是这样:


1
SELECT * FROMItems WHERE CategoryId =2or1=1

<

这完全是有效的SQL,同时会返回所有行,因为WHERE 1 = 1这个条件一直是成立的。

该SQL的初衷是提供一种方法,在用户知道哪些有效的类别可用的情况下,可以将结果限制在一种类别里;但是由于允许用户通过注入额外的过滤器修改SQL的行为,导致了预料不到的结果。这就是SQL注入,是安全性不高的网站暴露出的最多的两个漏洞之一。

前面的例子看起来不怎么危险,那么SQL注入能导致什么问题呢?首先,为了好的初衷才提供了过滤器。因为有上百万条记录,过滤器原本可能是用来防止检索出所有的记录,同时持续请求所有的记录会降低网站的性能。这也使得拒绝服务攻击(DoS)变得更加容易,另外还有更大的风险。

看看下面的代码段:

1
2
3
varsql = @"SELECTCount(*) FROM Users   
WHERE UserName ='" + Request["UserName"] + "'  
AND Password ='"+ Request["UserPass"] + "'";

 

 

这常作为用户认证的方式,用于匹配在登录表单中提供的用户名和密码。它用于测试数据库中有多少条记录和用户提供的用户名和密码匹配,如果结果大于0,用户就可以进一步操作。在前面的示例中,展示了总是成立的条件并导致返回了所有的记录。这里有另外一个总是成立的条件:


1
WHERE' '=' '

<

 

对于黑客来说,很容易向这个SQL中注入代码,从而返回用户表中的所有数据,因此只需要向用户名或密码文本框中输入'or'"=',就可以访问网站中的限制区域。拼接将完成创建有效的可被执行的SQL语句的工作。

幸运的是,相比SQL Server完整版,SQL Server Compact有一些功能性限制。例如,Compact版本不支持批处理语句,更强大的数据库可以做到这点,这会令它们面临潜在的严重后果。批处理语句可以在一条SQL语句中传递多个操作,每个独立的命令都会依次执行。下面展示了一个批处理示例:


1
SELECT * FROMItems; DROP TABLE Users

 

在SQL Server数据库中执行该语句,首先会返回Items表中的所有条目,然后会永久删除名为Users的数据表。甚至还有更强大的命令,能够导致整个数据库被删除,甚至导致黑客获取数据库所在服务器的完整控制权。

参数保护

现在知道了问题的本质,以及能够导致的潜在的非常严重的后果,就需要学习如何使代码远离SQL注入的威胁。一些人建议使用黑名单作为有效途径。这涉及监控用户是否输入了SQL关键词,如果检查到关键字,就驳回提交的请求。这种做法具有两面性:很多SQL关键词是日常用语(or、and等),并且SQL关键词时常变更。这意味着如果黑名单中引入了新的关键词,就不得不更新构建的每个网站。第二个建议是避开单引号,当然这也是有效的,但如果字符串不是SQL的一部分就起不了作用,就像前面的第一个示例。

事实是,只有一种被证明有效的方法能够保护网站不受SQL注入攻击,那就是使用参数。参数是动态数据的占位符,在执行SQL时,这些动态数据以一种安全的方式和SQL语句拼接在一起。为了帮助大家理解它的工作机制,下面举一个例子展示数据库辅助程序如何支持参数的使用:


1
2
varsql ="SELECT* FROM Items WHERE CategoryId = @0;   
vardata =db.Query(sql, Request["categoryId"]);

 

 

注意,@0标记代表了SQL语句中的动态数据,@符号后面跟一个0。像往常一样,SQL被传递到Query方法,但是这次它后面跟着动态数据的源。在内部,数据库辅助程序会创建ADO.NET参数对象并且将其传递到数据库中。数据库会依次检查传入的参数值以保证它们的数据类型和目标列是匹配的,从而避免期望的是数值类型、但传入的是字符串类型的情况;也能保证按照字面含义处理所有被成功传入的字符串,而不是作为被执行SQL的一部分。当然,即使这样还是应该按照第5章中介绍的对用户输入的值进行类型验证。但是现在应该明白参数是如何提供保护网站的。如果只通过参数的形式验证数据类型,应用程序会产生很多异常。

在下面的SQL片段中,按照顺序传入了多个参数:


1
2
3
4
5
varsql ="INSERT INTO items (Title,Description, Price) VALUES (@0, @1, @2) ";   
vartitle =Request["title"];   
vardesc =Request["desc"];   
varprice =Request["price"];   
db.Execute(sql,title, desc, price);

 

参数标识从@0开始,依次递增,这是预先设定的,无法改变。如果序列从@1开始就会产生异常,遗漏任何一个数字也会产生异常。

现在清楚了如何使用数据库辅助程序和参数与数据库安全地交互。下一节将使用这些知识,将之应用到第5章中构建的表单中,在数据库中保存提交的数据。


推荐阅读
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 本文介绍了互联网思维中的三个段子,涵盖了餐饮行业、淘品牌和创业企业的案例。通过这些案例,探讨了互联网思维的九大分类和十九条法则。其中包括雕爷牛腩餐厅的成功经验,三只松鼠淘品牌的包装策略以及一家创业企业的销售额增长情况。这些案例展示了互联网思维在不同领域的应用和成功之道。 ... [详细]
  • 本文详细介绍了Mybatis中#与$的区别及其作用。#{}可以防止sql注入,拼装sql时会自动添加单引号,适用于单个简单类型的形参。${}则将拿到的值直接拼装进sql,可能会产生sql注入问题,需要手动添加单引号,适用于动态传入表名或字段名。#{}可以实现preparedStatement向占位符中设置值,自动进行类型转换,有效防止sql注入,提高系统安全性。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 禁止程序接收鼠标事件的工具_VNC Viewer for Mac(远程桌面工具)免费版
    VNCViewerforMac是一款运行在Mac平台上的远程桌面工具,vncviewermac版可以帮助您使用Mac的键盘和鼠标来控制远程计算机,操作简 ... [详细]
  • 生成对抗式网络GAN及其衍生CGAN、DCGAN、WGAN、LSGAN、BEGAN介绍
    一、GAN原理介绍学习GAN的第一篇论文当然由是IanGoodfellow于2014年发表的GenerativeAdversarialNetworks(论文下载链接arxiv:[h ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 延迟注入工具(python)的SQL脚本
    本文介绍了一个延迟注入工具(python)的SQL脚本,包括使用urllib2、time、socket、threading、requests等模块实现延迟注入的方法。该工具可以通过构造特定的URL来进行注入测试,并通过延迟时间来判断注入是否成功。 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • 本文介绍了一个免费的asp.net控件,该控件具备数据显示、录入、更新、删除等功能。它比datagrid更易用、更实用,同时具备多种功能,例如属性设置、数据排序、字段类型格式化显示、密码字段支持、图像字段上传和生成缩略图等。此外,它还提供了数据验证、日期选择器、数字选择器等功能,以及防止注入攻击、非本页提交和自动分页技术等安全性和性能优化功能。最后,该控件还支持字段值合计和数据导出功能。总之,该控件功能强大且免费,适用于asp.net开发。 ... [详细]
  • 本文介绍了在go语言中利用(*interface{})(nil)传递参数类型的原理及应用。通过分析Martini框架中的injector类型的声明,解释了values映射表的作用以及parent Injector的含义。同时,讨论了该技术在实际开发中的应用场景。 ... [详细]
  • Spring框架《一》简介
    Spring框架《一》1.Spring概述1.1简介1.2Spring模板二、IOC容器和Bean1.IOC和DI简介2.三种通过类型获取bean3.给bean的属性赋值3.1依赖 ... [详细]
  • Kali Linux 简介
    KaliLinux是世界渗透测试行业公认的优秀的网络安全审计工具集合,它可以通过对设备的探测来审计其安全性,而且功能完备,几乎包含了目前所 ... [详细]
author-avatar
yzxnha_975
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有