Sql server之sql注入

这篇具有很好参考价值的文章主要介绍了Sql server之sql注入。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

SQL Injection

关于sql注入的危害在这里就不多做介绍了,相信大家也知道其中的厉害关系。这里有一些sql注入的事件大家感兴趣可以看一下

防范sql注入的方法无非有以下几种:

1.使用类型安全的SQL参数 2.使用参数化输入存储过程 3.使用参数集合与动态SQL 4.输入滤波 5.过滤LIKE条款的特殊字符

...如果有遗漏的也欢迎大大们指教。

Sample:

 

复制

var Shipcity;
ShipCity = Request.form ("ShipCity");
var sql = "select * from OrdersTable where ShipCity = '" + ShipCity + "'";

复制

上面是一个简单的sql注入示例

用户将被提示输入一个市县名称。如果用户输入 Redmond,则查询将由与下面内容相似的脚本组成:

 

复制

SELECT * FROM OrdersTable WHERE ShipCity = 'Redmond'

复制

但是,假定用户输入以下内容:

Redmond'; drop table OrdersTable--

此时,脚本将组成以下查询:

 SELECT * FROM OrdersTable WHERE ShipCity = 'Redmond';drop table OrdersTable--'

复制

分号 (;) 表示一个查询的结束和另一个查询的开始。双连字符 (--) 指示当前行余下的部分是一个注释,应该忽略。如果修改后的代码语法正确,则服务器将执行该代码。

SQL Server 处理该语句时,SQL Server 将首先选择 OrdersTable 中的所有记录(其中 ShipCity 为 Redmond)。然后,SQL Server 将删除 OrdersTable。

只要注入的 SQL 代码语法正确,便无法采用编程方式来检测篡改。因此,必须验证所有用户输入,并仔细检查在您所用的服务器中执行构造 SQL 命令的代码。本主题中的以下各部分说明了编写代码的最佳做法。

下面就介绍一下常用的几种防止sql注入的方法:

1. 验证所有输入

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

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

  • 如果一个用户在需要邮政编码的位置无意中或恶意地输入了一个 10 MB 的 MPEG 文件,应用程序会做出什么反应?
  • 如果在文本字段中嵌入了一个 DROP TABLE 语句,应用程序会做出什么反应?

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

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

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

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

(6)使用存储过程来验证用户输入。

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

(8)实现多层验证。对无目的的恶意用户采取的预防措施对坚定的攻击者可能无效。更好的做法是在用户界面和所有跨信任边界的后续点上验证输入。

例如,在客户端应用程序中验证数据可以防止简单的脚本注入。但是,如果下一层认为其输入已通过验证,则任何可以绕过客户端的恶意用户就可以不受限制地访问系统。

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

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

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

输入字符

在 Transact-SQL 中的含义

;

查询分隔符。

'

字符数据字符串分隔符。

--

注释分隔符。

/* ... */

注释分隔符。服务器不对 /* 和 */ 之间的注释进行处理。

xp_

用于目录扩展存储过程的名称的开头,如 xp_cmdshell。

注:验证输入是最被常用和联想到的,但是个人感觉这种方式不但代码显得肥胖,而且效率不是很好

2.使用类型安全的 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);

复制

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

注:在鄙人现在的项目中,这种方法应用最为广泛

3.在动态 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;

复制

注:和第二种雷同,这种方法是为了补充方法2存在,因为往往在很多时候业务简单不需要用proc的时候,可以用这种方法

4.筛选输入

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

 private string SafeSqlLiteral(string inputSQL)
 {
   return inputSQL.Replace("'", "''");
 }

复制

注:Filtering Input有种类似方法1

5.LIKE 子句

请注意,如果要使用 LIKE 子句,还必须对通配符字符进行转义:文章来源地址https://www.toymoban.com/news/detail-524894.html

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

到了这里,关于Sql server之sql注入的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Web攻防--Java_SQL注入--XXE注入-- SSTI模板注入--SPEL表达式注入

    编译器在编译sql语句时,会依次进行词法分析、语法分析、语义分析等操作, 预编译技术会让数据库跳过编译阶段,也就无法就进行词法分析,不会被拆开,注入语句也就不会被识别为SQL的,从而防止恶意注入语句改变原有SQL语句本身逻辑。 在使用JDBC进行数据

    2024年02月09日
    浏览(59)
  • 通用工资管理系统--SQL server课程设计(Java实现+SQL server)

    本科参与项目文档合集: 点击跳转~ General payroll management system 设计题目:通用工资管理系统 专 业:计算机科学与技术 班 级: 19级1班 设 计 人: 安** 指导老师: 刘** 日 期:2021年06月30日 1.1开发环境 数据库系统:Microsoft SQL Server 2019 开发语言:JAVA 数据库连接方式:JDBC连接方

    2024年02月03日
    浏览(51)
  • 【Java】mybatis中#{}和${}导致sql注入问题及解决办法

    使用mybatis的时候遇到了#{}和${}可能导致sql注入的问题 #{} 底层通过prepareStatement对当前传入的sql进行了预编译,一个 #{ } 被解析为一个参数占位符 ?; #{} 解析之后会将String类型的数据自动加上引号,其他数据类型不会 #{} 很大程度上可以防止sql注入(sql注入是发生在编译的过程

    2024年01月17日
    浏览(43)
  • Java连接SQL Server教程(详细教程)

    如果有搜索不到则Win+R输入cmd打开命令提示符输入 SQLServerManager10.msc 这里的 SQLServerManager10.msc 对应的是SQL Sever 2008 SQL Sever 2019版本的对应的是 SQLServerManager15.msc 双击TCP/IP(右键→属性),在弹出的窗口中选择 “IP地址” 选项卡。 将IP1和IP10的【IP地址】设为127.0.0.1,并将所有【

    2024年02月04日
    浏览(41)
  • 宾馆客房管理系统(Java+SQL Server)

    随着互联网技术的迅速发展,计算机技术的普及以及信息化时代的推波助澜,宾馆客房需求的逐渐增大,这也是挑战了宾馆客房管理方面的技术,以前的人工管理方式已经不再适应现在的环境,取而代之的是先进的宾馆客房管理系统,提高了宾馆的工作效率,为想要入住宾馆

    2023年04月17日
    浏览(31)
  • 【Java+SQL Server】前后端连接小白教程

    目录 📋 流程总览 ⛳️【SQL Server】数据库操作 1. 新建数据库text 2. 新建表 3. 编辑表 ⛳️【IntelliJ IDEA】操作 1. 导入jar包 2. 运行显示错误 打开SQL Server数据库--sa登录--新建数据库text 1. 新建数据库text 2. 新建表 刚建的表需要重连才显示 3. 编辑表 1. 导入jar包 新建文件夹lib-将下

    2024年02月05日
    浏览(39)
  • 通过Java连接Sql Server数据库

    JDBC是Java DateBase Connectivity的简写,翻译过来就是java连接数据库,或者更通俗地说就是java语言操作数据库。JDBC的本质其实是官方定义的一套操作所有关系型数据库的规则,也就是接口。 微软官方jdbc下载地址:https://www.microsoft.com/zh-cn/download/details.aspx?id=11774 下载之后解压到相

    2024年01月17日
    浏览(52)
  • 学生管理系统--课程设计项目(Java+SQL server)

    本科参与项目文档合集: 点击跳转~ Student Management System 学校:山东科技大学 指导老师:杨 * * 教授 学号:2019032**** 学生姓名:安** 专业班级:计算机19-1                                    山东科技大学 二〇二〇年七月 1. 总体设计

    2024年02月11日
    浏览(41)
  • Java连接SQL Server数据库的详细操作流程

    1.1 JDK版本查看 win + r输入cmd,命令窗口输入java --version 1.2 SQL Server官网下载驱动 SQL Server驱动下载直达地址 下载完成后解压到自己熟悉的目录,不出意外的话你会看到以下文件 1.3 加载驱动类 1.4 eclipse导入驱动jar包 目录结构 右键当前工程文件,选择 build path ,然后选择 Add Exter

    2024年02月03日
    浏览(65)
  • 记录一下Java JDBC连接微软SQL Server遇到的那些坑

    最近忙实习,宅在国内远程办公,然后呢我的西班牙老板又要求我用Java做某个管理系统。由于我的电脑和公司的远程电脑上都装的是SQL Server 2019,为了图方便,我就没有换数据库系统软件,顺便随手建了个库建了个表来测试一下。 表大概长这么一个样子:  插入了一些数据

    2024年02月04日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包