• 防止SQL注入


    原文地址:http://hi.baidu.com/%BC%D9%BA%EC%D2%B6%CE%E8%CE%F7%B7%E7/blog/item/81f35da209e287abcbefd005.html

    1. 什么是SQL注入
    所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。通过递交参数构造巧妙的SQL语句,从而成功获取想要的数据。


    2. SQL注入的种类
    从具体而言,SQL注入可分为五大类,分别是:数字型注入、字符型注入、搜索型注入(like)、in型的注入、句语连接型注入。从应用来说,要特别注意IP、搜索、批量删除、从数据库转到数据库等地方的SQL注入。


    3. 如何防止SQL注入
    3.1 SQL注入产生的原因
    看下面检查登陆的SQL语句:

    SQL代码
    SqlCommand cmd = new SqlCommand("SELECT * FROM PE_USERS WHERE UserName = '"
    + UserName + "' AND UserPassword = '" + PassWord + "'", conn);

    由于没有对UserName和PassWord进行任何验证,如果UserName=” admin’ OR 1=1--“
    所执行的SQL语句就成了:

    SQL代码
    SELECT * FROM PE_USERS WHERE UserName=’admin’ OR 1=1—‘ AND UserPassword=’’

    这就造成了SQL注入,条件永远为真,也就不用密码也能登陆成功。
    3.2主要防御方式
    防御手段一:参数化查询
    保护级别:★★★★★
    描述:
    使用参数化查询的好处:可以防止sql注入式攻击,提高程序执行效率。
    例如:

    SQL代码
    const string strSql = "SELECT * FROM [PE_Users] WHERE UserName = @UserName";
    Parameters parms = new Parameters("@UserName", DbType.String, userName);

    中有一个参数@UserName, 使用Prarmeter对象,通过它把参数添加到Command对象上,
    这样就获得参数化查询。
    14
    14 安全开发手册
    如上述语句,ADO.NET 会向SQL Server 发送下面的SQL语句:

    SQL代码
    Exec sp_executesql N ‘select * from [pe_users] where username=@username ‘,N
    ‘@username nvarchar(20) ‘,@username=N ‘name’

    SQL Server 把@username 替换成字符串”name”,然后再执行查询.
    假设有下面的输入:

    SQL代码
    ‘ union select @@version,null,null—

    生成的SQL语句如下所示:

    SQL代码
    Exec sp_executesql N ‘select * from [pe_users] where username=@username ‘,N
    ‘@username nvarchar(20) ‘,@username=N ‘’’ union select @@version,null,null--’

    可以看到ADO.NET转义了输入。


    .net代码
    public SqlParameter Add(string parameterName, SqlDbType sqlDbType, int size);

    DbTye或SqlDbType可以是多种数据类型。
    可根据你的数据类型来选择。
    在某些地方,也可似指定参数的长度:int size。这样也能有效防止数据库溢出和SQL注
    入的可能性。
    优点:有效地防止了SQL注入的产生。
    缺点:有些地方不能应用,如 in 。
    应用举例:
    动易SiteFactory系统中,对于比较固定的地方,我们采用比较安全的存储过程来
    实现。系统中所有SQL语句,能用参数化查询的所有部份都使用了参数化查询。所有操
    作数据库的地方,都能在命名空间 PowerEasy.SqlServerDal下找到。
    防御手段二:过滤与转换
    保护级别:★★★★
    15
    15 安全开发手册
    描述:
    对于数据型要强制转换成数字Clng,对于字符型,要通过函数过滤。如:

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

    对于搜索的地方LIKE 子句,要注意,如果要使用 LIKE 子句,还必须对通配符字
    符进行转义:

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

    对于in类型,要转换成规格的数字串或字符串。
    要尽量少用语句连接形式写SQL语句,要用到的地方要确保连接语句的安全性,或
    在白名单内,或限制很短的长度,以防止SQL语句构造的危险。
    优点:有效地防止了SQL注入,实现简单。
    缺点:容易遗漏,对于某些地方还是不能过滤,如 order by + 变量
    应用举例:
    动易SiteFactory系统中,对于不能使用参数化查询的部份,我们使用过滤函数处
    理,过滤函数在命名空间PowerEasy.Framework.Common中的DataSecurity类下,如:
    FilterBadChar函数。这函数主要用于业务逻辑层的过滤,对于数据库,我们还使用了
    强制转换函数,在命名空间 PowerEasy.SqlServerDal 下的 DBHelper 类 ,如:
    ToValidId 函数等,主要用于数据库无出错的处理操作。
    防御手段三:白名单
    保护级别:★★★★
    描述:
    对于一些已知的参数范围,可用白名单的形式处理,能有交防止SQL注入和查询出
    错,如:order by +列名,列名以参数形式传入时,可制定一个白名单,先判断一下参
    数是否在白名单内,再进行查询,否则出错处理。
    优点:安全可靠
    缺点:应用范围小
    16
    16 安全开发手册
    3.3 辅助防御方式
    防御手段一:严格过滤
    保护级别:★★★☆
    描述:
    对于不能参数化查询或者无法限制变量类型和范围的情况,使用过滤的手段来处理。
    对于数据库中读取的数量要进入查询语句,在不确定数据是否安全的情况下,要对其进入
    过滤。这种SQL注入比较隐蔽,所以要特别注意。
    优点:能用于不能参数化而又难过滤的地方,如 order by +变量
    缺点: 过滤过于严格。
    应用举例:
    动易SiteFactory系统中,对于不能使用参数化查询的部份,我们使用过滤函数处理,
    过滤函数在命名空间PowerEasy.Framework.Common中的DataSecurity类下,如:
    FilterBadChar函数。
    防御手段二:限定URL传递参数的数据类型和范围
    保护级别:★★★
    描述:
    限定URL的传递参数类型、数量、范围等来防止通过构造URL进行恶意攻击。参见MSDN
    杂志
    优点:在一定的程序上有效地防止通过URL方式的注入。
    缺点:容易遗忘正常需要的参数。
    应用举例:
    动易SiteFactory系统中,需要在Config/QueryStrings.config配置文件中增加相应的
    配置项来控制URL的参数传入,有效控制每个页面的参数数量和参数类型。
    防御手段三:全局过滤SQL关键字过滤
    保护级别:★★★
    描述:
    在某些地方进行全局过滤SQL关键字过滤,如对标签的解释。(可能存在过滤不完全和
    限制程序开发的问题)
    优点:能用于不能参数化而又难过滤的地方,如 table的连接。
    17
    17 安全开发手册
    缺点: 过滤过于严格。
    应用举例:
    动易SiteFactory系统中,对于不能使用参数化查询的部份,我们使用过滤函数处理,
    过滤函数在命名空间PowerEasy.Framework.Common中的DataSecurity类下,如:
    FilterSqlKeyword函数,主要应用在标签参数的传入的地方。

  • 相关阅读:
    Redis系统管理
    Redis简介和安装
    在Azure中搭建Ghost博客并绑定自定义域名和HTTPS
    ML:单变量线性回归(Linear Regression With One Variable)
    PRML Chapter4
    Windows+Idea安装Hadoop开发环境
    包装类
    认识J2SE
    Spark基本原理
    SQL总结
  • 原文地址:https://www.cnblogs.com/luofuxian/p/2377457.html
Copyright © 2020-2023  润新知