SQL Server 2005 联机丛书

SQL Injection 是一种攻击方法,它可以将恶意代码插入到以后将传递给 SQL Server 供分析和执行的字符串中。任何构成 SQL 语句的过程都应进行注入漏洞检查,因为 SQL Server 将执行其接收到的所有语法有效的查询。

SQL Injection 的主要形式包括直接将代码插入与 SQL 命令串联并执行的用户输入变量。一种间接的攻击会将恶意代码注入要在表中存储或作为元数据存储的字符串。在存储的字符串随后串连到一个动态 SQL 命令中时,将执行该恶意代码。

基本的攻击是提前终止文本字符串,然后追加一个新的命令。由于插入的命令可能在执行前追加其他字符串,因此攻击者将用注释标记“--”来中止注入的字符串。执行时,此后的文本将被忽略。

以下脚本阐释了一个简单的 SQL Injection 攻击。此脚本通过串联硬编码字符串和用户输入的字符串而生成一个 SQL 查询。

复制代码

var Shipcity;

ShipCity = Request.form ("ShipCity");

var sql = "select * from OrdersTable where ShipCity = '" + ShipCity + "'";

用户将被提示输入一个城市名称。如果用户输入 Redmond,则查询将由以下这样的脚本组成:

复制代码

select * from OrdersTable where ShipCity = 'Redmond'

如果用户输入如下内容会怎样呢?

Redmond'; drop table OrdersTable--

此时,查询将由如下所示的脚本组成:

复制代码

select * from OrdersTable where ShipCity = 'Redmond';drop table OrdersTable--'

“;”字符表示一个查询的结束和另一个查询的开始。“--”字符序列则表示当前行余下的部分是一个注释,应该忽略。如果更改后的代码语法正确 ,则服务器将执行该代码。SQL Server 在处理此语句时,将首先选择 OrdersTable 中的所有记录(其中 ShipCity 为 Redmond),然后删除 OrdersTable。

只要注入的 SQL 代码语法正确,就无法用编程方式来检测篡改。因此,必须验证所有用户输入,并仔细检查在服务器中执行构造 SQL 命令的代码。下面讨论了一些编写代码的最佳做法。

验证所有输入

始终通过测试类型、长度、格式和范围来验证用户输入。实现对恶意输入的预防时,请注意应用程序的体系结构和部署方案。请记住,为在安全环境下运行而设计的程序可能被复制到不安全的环境中。以下建议应被视为最佳做法:

· 对应用程序接收的数据不做任何有关大小、类型或内容的假设。例如,评估以下内容:

· 如果是一个用户在需要邮政编码的位置无意中或恶意地输入了一个 10 MB 的 MPEG 文件,应用程序会做出什么反应?

· 如果在文本字段中嵌入了一个 DROP TABLE 语句,应用程序会做出什么反应?

· 测试输入的大小和数据类型,强制执行适当的限制。这有助于防止有意造成的缓冲区溢出。

· 测试字符串变量的内容,只接受所需的值。拒绝包含二进制数据、转义序列和注释字符的输入内容。这有助于防止脚本注入,防止某些缓冲区溢出攻击。

· 使用 XML 文档时,根据数据的架构对输入的所有数据进行验证。

· 绝不直接使用用户输入内容来生成 Transact-SQL 语句。

· 使用存储过程来验证用户输入。

· 在多层环境中,所有数据都应该在验证之后才允许进入可信区域。未通过验证的数据应被拒绝,并向前一层返回一个错误。

· 实现多层验证。对无目的的恶意用户采取的预防措施可能对专业黑客无效。最佳做法是在用户界面验证输入,然后在所有跨信任边界的后续点上验证输入。
例如,在客户端应用程序中验证数据可以防止简单的脚本注入;但是,如果下一层假设其输入已被验证,则任何可以跳过客户端的黑客就可能不受限制地访问系统。

· 绝不串联未验证的用户输入。字符串串联是脚本注入的主要输入点。

· 在可能据以构造文件名的字段中,不接受下列字符串:AUX、CLOCK$、COM1 到 COM8、CON、CONFIG$、LPT1 到 LPT8、NUL 以及 PRN。

如果可能,拒绝包含以下字符的输入。

输入字符

使用类型安全的 SQL 参数

SQL Server 中的 Parameters 集合提供了类型检查和长度验证。如果使用 Parameters 集合,则输入将被当成文字值而不是可执行代码进行处理。使用 Parameters 集合的另一个好处是可以强制执行类型和长度检查。范围以外的值将触发异常。以下代码片断阐释了如何使用 Parameters 集合:

复制代码

SqlDataAdapter myCommand = new SqlDataAdapter("AuthorLogin", conn);

myCommand.SelectCommand.CommandType = CommandType.StoredProcedure;

SqlParameter parm = myCommand.SelectCommand.Parameters.Add("@au_id",

SqlDbType.VarChar, 11);

parm.Value = Login.Text;

在上述示例中,@au_id 参数被当成文字值而不是可执行代码进行处理。将对此值进行类型和长度检查。如果 @au_id 值不符合指定的类型和长度约束,则将引发异常。

在存储过程中使用参数化输入

存储过程如果使用未筛选的输入,则可能容易受 SQL Injection 攻击。例如,以下代码容易受到攻击:

复制代码

SqlDataAdapter myCommand =

new SqlDataAdapter("LoginStoredProcedure '" +

Login.Text + "'", conn);

如果使用存储过程,则应使用参数作为存储过程的输入。

在动态 SQL 中使用参数集合

如果不能使用存储过程,您仍可使用参数,如下所示。

复制代码

SqlDataAdapter myCommand = new SqlDataAdapter(

"SELECT au_lname, au_fname FROM Authors WHERE au_id = @au_id", conn);

SQLParameter parm = myCommand.SelectCommand.Parameters.Add("@au_id",

SqlDbType.VarChar, 11);

Parm.Value = Login.Text;

筛选输入

筛选输入可以删除转义符,这也可能有助于防止 SQL 注入;但由于可引起问题的字符数量很大,因此这并不是一种可靠的防护方法。以下代码片段可搜索字符串分隔符。

复制代码

private string SafeSqlLiteral(string inputSQL)

{

return inputSQL.Replace("'", "''");

}

LIKE 子句

请注意,如果要使用 LIKE 子句,还需要对通配符字符进行转义:

复制代码

s = s.Replace("[", "[[]");

s = s.Replace("%", "[%]");

s = s.Replace("_", "[_]");

参数批处理

有一种常见的错误概念,即,当多个 SQL 语句串联起来向服务器进行成批传输时,不能使用参数。事实上,只要参数名不重复,是可以使用参数的。保证每个名称唯一性的方法很简单,就是在 SQL 文本串联过程中,在每个参数名称中添加一个数字或其他唯一值。

SQL 登录注入脚本_深圳嘉华学校之SQL 注入相关推荐

  1. SQL 登录注入脚本_常见web安全问题,SQL注入、XSS、CSRF,基本原理以及如何防御...

    1.SQL注入 原理: 1).SQL命令可查询.插入.更新.删除等,命令的串接.而以分号字元为不同命 令的区别.(原本的作用是用于SubQuery或作为查询.插入.更新.删除--等 的条件式) 2). ...

  2. hadoop使用mapreduce统计词频_深圳嘉华学校之Hadoop简介(什么是Map-Reduce-Mapreduce-about云开发)...

    Hadoop简介 Hadoop就是一个实现了Google云计算系统的开源系统,包括并行计算模型Map/Reduce,分布式文件系统HDFS,以及分布式数据库Hbase,同时Hadoop的相关项目也很丰 ...

  3. action请求_深圳嘉华学校之Action方法返回类型

    Action方法返回类型 . Action方法返回类型 . Void . 简单或复杂类型 . HttpResponseMessage . IHttpActionResult . 自定义返回类型 在前面 ...

  4. sql参数化还是被注入了_面试官问你 SQL 注入攻击了吗?

    目录 为什么要聊 SQL 注入攻击? 什么是 SQL 注入攻击? 如何进行 SQL 注入攻击? 如何防范? 常见面试题 瞎比比 为什么要聊 SQL 注入攻击? 我这人有个想法,就是不管自己跳不跳槽,每 ...

  5. sql注入攻击_让你彻底明白sql注入攻击

    点击上方 Java旅途,选择 设为星标 优质文章,每日送达 SQL注入攻击是黑客对数据库进行攻击常用的手段之一,随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多.但是由于程序员 ...

  6. 怎么更改sql的实例版本_学会复杂一点的SQL语句:Oracle DDL和DML

    create:创建表创建用户创建视图 创建表 create table student(id int,score int) ; student后面与括号之间可以有空格可以没有 创建用户 create ...

  7. sql not exists用法_牛客网数据库SQL实战详细剖析(5160)(更新完结)

    文章来源:大数据肌肉猿 作者:无精疯 这是一个系列文章,总共61题,分6期,有答案以及解题思路,并附上解题的一个思考过程. 具体题目可参考牛客网的SQL实战模块: https://www.nowcod ...

  8. SQL 登录注入脚本_项目实战 | SQL注入的“格局”

    文章来源:安译Sec 0x00 前言 曾经搞站最经典的套路就是:注入拿到密码进后台,上传shell然后内核提权.但是实际环境中,往往会有注入后密码解不开.找不到后台等情况,所以现在有的师傅说sql注入 ...

  9. python sql注入脚本_python打造一个分析网站SQL注入的脚本

    1 importrequests,re,time,os2 from tqdm importtqdm3 from bs4 importBeautifulSoup4 defzhuru():5 global ...

最新文章

  1. 点击率预估又有新花样?
  2. java libpcap,Linux下编译安装libpcap
  3. wxWidgets:wxTimePickerCtrl类用法
  4. 阿里研究院:数据治理解决方案,附7篇数据治理完整版PDF下载
  5. php字符串与数字比较,PHP容易被忽略而出错陷阱 数字与字符串之间的比较
  6. java 中sub,Fn :: Sub中的嵌套Fn :: ImportValue不适用于SAM模板
  7. 升级到WP8必需知道的13个特性
  8. 计算机视觉空间域(spatial)注意力机制——CBAM
  9. c语言中islower是什么函数,C语言islower函数介绍、示例和实现
  10. 微信打飞机思路总结 蓝懿教育
  11. KiCad下载及安装教程
  12. 【083】毛笔字在线生成器-在线生成几十种毛笔字
  13. VC “变速齿轮”再研究
  14. 苹果手机微信怎么接龙_【手机】微信接龙
  15. Padavan编译技巧
  16. python南宁培训
  17. 模拟计算 |“五重解读”带你玩转CO2RR描述符-科学指南针
  18. IFPUG软件功能点计算方法
  19. 蓝桥杯单片机比赛学习:5、中断系统之外部中断的基本原理
  20. VMware虚拟机安装及共享文件夹和BIOS等的设置

热门文章

  1. VS2005的数据断点功能
  2. 解决800A0046没有权限问题
  3. VB.Net - 基本语法
  4. 如何下载(高程数据)并生成等高线?
  5. Ubuntu 20.04修改ip地址(Netplan)
  6. Canvas学习:绘制圆和圆弧
  7. 人工神经网络教程第四版,人工神经网络教程视频
  8. Hadoop学习之动态IP修改为静态IP
  9. 大数据分析与数据分析的根本区别在哪里
  10. 安全HCIP之华为USG6000