接着下午的写:

关于防止sql注入的几种手段(一)

第二条或许应该再补充一下,在mysql里,也有类似的执行动态语句的,就是PREPARE+execute,这个的使用和mssql里的sp_executesql功效相同,也能够带参数,防止动态sql语句注入。

在很多应用场景里面,用户最烦的就是分页的存储过程写法,所以,很多人就发明了通用的存储过程分页,可以通过site:cnblogs.com 通用存储过程分页 在gg里搜索,居然有32000条收录,先不说别的,看看排名前三位的的吧,

1  http://www.cnblogs.com/wengyuli/archive/2009/01/13/1375196.html

2  http://www.cnblogs.com/spring/archive/2005/09/02/228573.html

3 http://www.cnblogs.com/vagerent/archive/2007/10/17/927825.html

都是有注入漏洞的, 随便拿一个来试试注入,排名第一的,sql语句如下:

Code
--TOP n 实现的通用分页存储过程(转自邹建)
CREATE PROC sp_PageView
@tbname     sysname,               --要分页显示的表名
@FieldKey   nvarchar(1000),      --用于定位记录的主键(惟一键)字段,可以是逗号分隔的多个字段
@PageCurrent int=1,               --要显示的页码
@PageSize   int=10,                --每页的大小(记录数)
@FieldShow nvarchar(1000)='',      --以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段
@FieldOrder nvarchar(1000)='',      --以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC
                                          用于指定排序顺序
@Where    nvarchar(1000)='',     --查询条件
@PageCount int OUTPUT             --总页数
AS
SET NOCOUNT ON
--检查对象是否有效
IF OBJECT_ID(@tbname) IS NULL
BEGIN
    RAISERROR(N'对象"%s"不存在',1,16,@tbname)
    RETURN
END
IF OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTable')=0
    AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsView')=0
    AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTableFunction')=0
BEGIN
    RAISERROR(N'"%s"不是表、视图或者表值函数',1,16,@tbname)
    RETURN
END

--分页字段检查
IF ISNULL(@FieldKey,N'')=''
BEGIN
    RAISERROR(N'分页处理需要主键(或者惟一键)',1,16)
    RETURN
END

--其他参数检查及规范
IF ISNULL(@PageCurrent,0)<1 SET @PageCurrent=1
IF ISNULL(@PageSize,0)<1 SET @PageSize=10
IF ISNULL(@FieldShow,N'')=N'' SET @FieldShow=N'*'
IF ISNULL(@FieldOrder,N'')=N''
    SET @FieldOrder=N''
ELSE
    SET @FieldOrder=N'ORDER BY '+LTRIM(@FieldOrder)
IF ISNULL(@Where,N'')=N''
    SET @Where=N''
ELSE
    SET @Where=N'WHERE ('+@Where+N')'

--如果@PageCount为NULL值,则计算总页数(这样设计可以只在第一次计算总页数,以后调用时,把总页数传回给存储过程,避免再次计算总页数,对于不想计算总页数的处理而言,可以给@PageCount赋值)
IF @PageCount IS NULL
BEGIN
    DECLARE @sql nvarchar(4000)
    SET @sql=N'SELECT @PageCount=COUNT(*)'
        +N' FROM '+@tbname
        +N' '+@Where
    EXEC sp_executesql @sql,N'@PageCount int OUTPUT',@PageCount OUTPUT
    SET @PageCount=(@PageCount+@PageSize-1)/@PageSize
END

--计算分页显示的TOPN值
DECLARE @TopN varchar(20),@TopN1 varchar(20)
SELECT @TopN=@PageSize,
    @TopN1=(@PageCurrent-1)*@PageSize

--第一页直接显示
IF @PageCurrent=1
    EXEC(N'SELECT TOP '+@TopN
        +N' '+@FieldShow
        +N' FROM '+@tbname
        +N' '+@Where
        +N' '+@FieldOrder)
ELSE
BEGIN
    --处理别名
    IF @FieldShow=N'*'
        SET @FieldShow=N'a.*'

--生成主键(惟一键)处理条件
    DECLARE @Where1 nvarchar(4000),@Where2 nvarchar(4000),
        @s nvarchar(1000),@Field sysname
    SELECT @Where1=N'',@Where2=N'',@s=@FieldKey
    WHILE CHARINDEX(N',',@s)>0
        SELECT @Field=LEFT(@s,CHARINDEX(N',',@s)-1),
            @s=STUFF(@s,1,CHARINDEX(N',',@s),N''),
            @Where1=@Where1+N' AND a.'+@Field+N'=b.'+@Field,
            @Where2=@Where2+N' AND b.'+@Field+N' IS NULL',
            @Where=REPLACE(@Where,@Field,N'a.'+@Field),
            @FieldOrder=REPLACE(@FieldOrder,@Field,N'a.'+@Field),
            @FieldShow=REPLACE(@FieldShow,@Field,N'a.'+@Field)
    SELECT @Where=REPLACE(@Where,@s,N'a.'+@s),
        @FieldOrder=REPLACE(@FieldOrder,@s,N'a.'+@s),
        @FieldShow=REPLACE(@FieldShow,@s,N'a.'+@s),
        @Where1=STUFF(@Where1+N' AND a.'+@s+N'=b.'+@s,1,5,N''),    
        @Where2=CASE
            WHEN @Where='' THEN N'WHERE ('
            ELSE @Where+N' AND ('
            END+N'b.'+@s+N' IS NULL'+@Where2+N')'

--执行查询
    EXEC(N'SELECT TOP '+@TopN
        +N' '+@FieldShow
        +N' FROM '+@tbname
        +N' a LEFT JOIN(SELECT TOP '+@TopN1
        +N' '+@FieldKey
        +N' FROM '+@tbname
        +N' a '+@Where
        +N' '+@FieldOrder
        +N')b ON '+@Where1
        +N' '+@Where2
        +N' '+@FieldOrder)
END

这个是转自邹健大哥的,邹健想必大家都认识,让我们来试一下他的通用存储过程:

exec sp_PageView 'article','articleid',1,10,'subject,articleid',' articleid desc;select 1 as ''ok''; ','', null

看看返回什么吧:

注入成功!

那这个到底怎么回事呢???

邹健大哥的通用存储过程都存在漏洞吗?

到底什么样的写法才不会被注入呢?太恐怖了

转载于:https://www.cnblogs.com/perfectdesign/archive/2009/11/24/sqlinjection2.html

关于防止sql注入的几种手段(二)相关推荐

  1. SQL注入分类,一看你就明白了。SQL注入点/SQL注入类型/SQL注入有几种/SQL注入点分类

    「作者主页」:士别三日wyx 「作者简介」:CSDN top200.阿里云博客专家.华为云享专家.网络安全领域优质创作者 SQL注入分类 一.数值型注入 二.字符型注入 1)单引号字符型注入 2)双引 ...

  2. 网站mysql防止sql注入攻击 3种方法总结

    mysql数据库一直以来都遭受到sql注入攻击的影响,很多网站,包括目前的PC端以及手机端都在使用php+mysql数据库这种架构,大多数网站受到的攻击都是与sql注入攻击有关,那么mysql数据库如 ...

  3. 强网杯 2019]随便注 【SQL注入】四种解法

    题目简介 题目名称:[强网杯 2019]随便注 1 题目平台:BUUCTF 题目类型:Web 考察知识点: SQL注入 解题步骤 方法一: 首先启动并访问靶机,有一个输入框,随便输入1' or 1 = ...

  4. 防范SQL注入的几种方法 4

    sql = "SELECT ID T_ID, NAME FROM Category where ID="&ID&" ORDER BY xh asc&quo ...

  5. jsp工程防止外部注入_防止 jsp被sql注入的五种方法

    一.SQL注入简介 SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库. 二.SQL注入攻击的总体 ...

  6. java防止sql注入方正_有效防止SQL注入的5种方法总结

    sql注入入门 SQL 注入是一类危害极大的攻击形式.虽然危害很大,但是防御却远远没有XSS那么困难. SQL 注入漏洞存在的原因,就是拼接 SQL 参数.也就是将用于输入的查询参数,直接拼接在 SQ ...

  7. 防止SQL注入的几种方法

    一.什么是sql注入 SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库. 二.SQL注入攻击的总 ...

  8. SQL注入的几种实用办法

    一.查询表中包含有多少列: 这里以DISCUZ举例说明,如下 select * FROM pre_forum_thread ORDER BY 80 返回,Unknown column '80' in ...

  9. sql注释符注入防御_WAF的SQL注入绕过手段和防御技术

    一.关于SQL注入 SQL注入是一种常见的入侵WEB应用的手法.SQL注入是利用应用系统的编程漏洞和SQL语言的语法特征,改变原始的SQL语句执行逻辑而产生的. 攻击者向Web应用发送精心构造的输入数 ...

最新文章

  1. 百变冰冰!手把手教你实现CVPR2021最新妆容迁移算法
  2. 囚犯学会编程之后会发生什么?
  3. 看懂GE Predix ,就看懂了工业互联网
  4. 写 5 个你知道的 HTML5 标签,说明他们的意义
  5. 设置让php能够以root权限来执行exec() 或者 shell_exec()
  6. Final Cut Pro做拜年视频的basic lay out!
  7. nodeJS的管道流和链式流
  8. 关于PrintQueueCollection()类,跨线程调用错误“线程无法访问此对象,因为另一个线程拥有该对象”
  9. 如何处理错误消息Query XXX is invalid or contains errors
  10. sessionStorage 、localStorage 和 cookie 之间的区别(转)
  11. python在windows平台的多版本配置
  12. Java多线程共享变量控制
  13. c语言程序设计怎么改卷,C语言程序设计(B卷)教程.doc
  14. 我在b站上推荐一个看小电影的网站,结果被骂了
  15. 您选择的分区不支持无损调整容量操作
  16. 2020,好看视频的创作生态棋局
  17. 221007工作日志:SPSS logistic回归分析结果释读详解
  18. 注意力模型直观理解(Attention Model Intuition)
  19. 华为rstp配置实例
  20. OPTICS聚类以及python实现

热门文章

  1. 用户运营之push和短信
  2. ASIC设计开发流程
  3. FOTA安全升级不会用?手把手教学来啦
  4. WGS84到高斯投影的转化
  5. JavaSE_03面向对象-编程单词词汇
  6. 将100元兑换为1元、5元、10元的零钱,请问有多少种兑换方法?
  7. Vim snippet 小技巧
  8. MIT开源协议,多端适用的租房小程序,带完整的管理员后台
  9. 王润涵:如何用链脉名片开启电商新模式“新零售”
  10. c语言作业数据加密,C语言实现无规律数据加密、解密功能