SQL 注入与防御实例
注入
1. 创建存储
USE TSQL2012;
GO
IF OBJECT_ID('Sales.ListCustomersByAddress') IS NOT NULL
DROP PROCEDURE Sales.ListCustomersByAddress;
GO
CREATE PROCEDURE Sales.ListCustomersByAddress
@address NVARCHAR(60)
AS
DECLARE @SQLString AS NVARCHAR(4000);
SET @SQLString = N'
SELECT companyname, contactname
FROM Sales.Customers WHERE address = ''' + @address + '''';
-- PRINT @SQLString;
EXEC(@SQLString);
RETURN;
GO
2. 执行正常查询
EXEC Sales.ListCustomersByAddress @address = N'8901 Tsawassen Blvd.';
3. 输入一个单引号进去。 此时因有个引号没转义所以报错了
EXEC Sales.ListCustomersByAddress @address = N'''';
SELECT companyname, contactname
FROM Sales.Customers WHERE address = '''
Msg , Level , State , Line
Unclosed quotation mark after the character
string '''. Msg , Level , State , Line
Incorrect syntax near
'''.
4. 输入--把最后一个单引号注释掉
EXEC Sales.ListCustomersByAddress @address = N''' -- '; --拼接语句如下
SELECT companyname, contactname
FROM Sales.Customers WHERE address = '' – '
5. 注入一个SQL语句,然后你懂得。
EXEC Sales.ListCustomersByAddress @address = N''' SELECT 1 -- '; --拼接语句如下
SELECT companyname, contactname
FROM Sales.Customers WHERE address = '' SELECT 1 -- '
防止
1. 修改存储,使用 sp_executesql
USE TSQL2012;
GO
IF OBJECT_ID('Sales.ListCustomersByAddress') IS NOT NULL
DROP PROCEDURE Sales.ListCustomersByAddress;
GO
CREATE PROCEDURE Sales.ListCustomersByAddress
@address AS NVARCHAR(60)
AS
DECLARE @SQLString AS NVARCHAR(4000);
SET @SQLString = N'
SELECT companyname, contactname
FROM Sales.Customers WHERE address = @address';
EXEC sp_executesql
@statement = @SQLString
, @params = N'@address NVARCHAR(60)'
, @address = @address;
RETURN;
GO
2. 正常查询
EXEC Sales.ListCustomersByAddress @address = N'8901 Tsawassen Blvd.';
3. 注入尝试
EXEC Sales.ListCustomersByAddress @address = N'''';
EXEC Sales.ListCustomersByAddress @address = N''' -- ';
EXEC Sales.ListCustomersByAddress @address = N''' SELECT 1 -- ';
其他
QUOTENAME
这个函数用来给字符串两边加括号,引号等符号。
quotename函数有几种写法:
quotename('aa') 生成的有效的标识符为 [aa]
quotename('aa','') 生成的有效的标识符为 [aa]
quotename('aa','''') 生成的有效的标识符为 'aa'
DECLARE @address AS NVARCHAR(60) = '5678 rue de l''Abbaye';
PRINT N'SELECT *
FROM [Sales].[Customers]
WHERE address = '+ QUOTENAME(@address, '''') + ';';
Output 参数
DECLARE @SQLString AS NVARCHAR(4000)
, @outercount AS int;
SET @SQLString = N'SET @innercount = (SELECT COUNT(*) FROM Production.Products)';
EXEC sp_executesql
@statment = @SQLString
, @params = N'@innercount AS int OUTPUT'
, @innercount = @outercount OUTPUT;
SELECT @outercount AS 'RowCount';
参考资料
SQL Injection
https://msdn.microsoft.com/en-us/library/ms161953(SQL.105).aspx
sp_executesql (Transact-SQL)
https://msdn.microsoft.com/zh-cn/library/ms188001.aspx
SQL 注入与防御实例的更多相关文章
- SQL注入与防御
SQL注入与防御 下载:https://pan.baidu.com/s/1ZiLVY2IxHXD9-bMRS61Fzg 提取码:yof2
- sql注入-原理&防御
SQL注入是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数 ...
- web安全之sql注入的防御
自动把引号转义 1.防御sql注入的基本原则 任何时候不应该改变用户的输入 比如用户输入单引号,那输出也要是单引号. 几种基本的防 ...
- sql注入的防御和挖掘
首先我们可以在PHP.ini当中将display_errror关闭,以防止报错型的注入. 1.字符型防护 is_number 正则来判断是否是数字. ctype_digit() intval() st ...
- java web sql注入测试(2)---实例测试
以下篇幅,用一个简单的实例说明如何进行测试. 功能:根据用户NAME删除用户,采用的是SQL拼接的方式,核心代码部分如下: public static void deleteByName(String ...
- sql注入测试(2)---实例测试
以下篇幅,用一个简单的实例说明如何进行测试. 功能:根据用户NAME删除用户,采用的是SQL拼接的方式,核心代码部分如下: public static void deleteByName(String ...
- SQL注入(SQL Injection)案例和防御方案
sql注入(SQL Injection):就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令. SQL注入攻击的主要危害包括:非法读取.篡 ...
- SQL 注入防御方法总结
SQL 注入是一类危害极大的攻击形式.虽然危害很大,但是防御却远远没有XSS那么困难. SQL 注入可以参见:https://en.wikipedia.org/wiki/SQL_injection S ...
- 防御SQL注入的方法总结
这篇文章主要讲解了防御SQL注入的方法,介绍了什么是注入,注入的原因是什么,以及如何防御,需要的朋友可以参考下 SQL 注入是一类危害极大的攻击形式.虽然危害很大,但是防御却远远没有XSS那么困难 ...
随机推荐
- ThinkPHP实现导出
刚开始做项目的时候,遇到了这个需求.说实话,对于一个才出来实习的菜鸟,而且还是才接触PHP的菜鸟而言,实在是有心杀敌,无力回天啊. 最简单的方法,就是网上找一个插件,然后一个本来就十几兆的项目,又增加 ...
- java_httpservice
http://blog.csdn.net/maosijunzi/article/details/41045181
- 关于strcpy的实现.
#include <stdio.h> #include <stdlib.h> int strlen(const char *str) { ; while(*str++!='\0 ...
- Mysql 忘密码 + Phpadmin 修改密码无法登陆
mysql有时候忘记密码了怎么办?我给出案例和说明!一下就解决了! Windows下的实际操作如下 1.关闭正在运行的MySQL. 2.打开DOS窗口,转到mysql\bin目录. 3.输入mysql ...
- iPhone 5s网络钓鱼邮件,和苹果发布会同步亮相
正如预期的一样,网络犯罪分子会利用Apple最新发表的iPhone 5s消息,几乎在苹果的新产品发表会同时,这个网络钓鱼(Phishing)信件开始流传.此次,趋势科技病毒防治中心 Trend Lab ...
- AIDE支持实时错误检查、代码重构、代码智能导航、生成APK
AIDE是一个Android Java集成开发环境,可以在Android系统内进行Android软件和游戏的开发.它不仅仅是一个编辑器,而是支持编写-编译-调试运行整个周期,开发人员可以在Androi ...
- Drupal7模块multiselect使用
Drupal二次开发的时候,我们时常要使用到多选列表,但是官方默认的多选下拉列表,是在不敢恭维如下图所示: 不过难看不可怕,Drupal有两万第三方模块做支撑,只有你想不到,没有找不到的. 功夫不负有 ...
- js判断undefined类型,undefined,null,NaN的区别
js判断undefined类型 今天使用showModalDialog打开页面,返回值时.当打开的页面点击关闭按钮或直接点浏览器上的关闭则返回值是undefined 所以自作聪明判断 ...
- WebApi个人理解概要
WebApi概要 Global文件的作用: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public class MvcApplication : System.We ...
- ajax post传值
一.字符串 $.ajax({ type: "POST", data: {"ID&quo ...