Web安全问题及防范规范之SQL注入 B/S开发框架

Web站点为什么会遭受攻击?是为了恶作剧?损害企业名誉?免费浏览收费内容?盗窃用户隐私信息?获取用户账号谋取私利?总之攻击方式层出不穷,作为B/S开发框架来说,帮助开发者做好解决安全问题也是刻不容缓的,本篇文章来告诉大家怎么防范非法SQL注入。

web框架防攻击

适用范围

Web网站

攻击原理

若B/S开发框架后台SQL语句(包含存储过程)使用拼接方式输入参数,则可在Web参数中构造特殊的带SQL语句的参数进行攻击。


示例1:

后台SQL语句:

set @sql= 'select * from Table where id =' + @id

exec(@sql)

若id为int类型,正常情况下只能传数值型参数,此时SQL注入攻击无法进行。

但若id为string(varchar)类型时,可以人为构造特殊参数如下:

@id='1'' select * from Table1'

传入后则变为:

select * from Table1 where id = '1' select * from Table1

那么此时,后面的select语句将被执行。

原理:

此时起到关键作用的是''号,引号将字符串参数前面的引号闭合,导致后面的SQL语句作为真实语句执行。


示例2:

后台SQL语句:

set @sql='select * from Table1 where id in(' + @param + ')'

exec(@sql)

构造@param='1) select * from Table2 --'

传入后则变为:

select * from Table1 where id in(1) select * from Table2 --)

那么此时,后面的select语句将被执行。

原理:

此时起关键作用的是--号,先用)闭合前面的语句,然后将后面的语句--释掉,从而成为合法的SQL语句一起执行。

解决方案

应用程序处理

1、不使用SQL拼接参数,使用参数化的方式传入参数,包括代码中SQL语句和存储过程语句。

代码示例:

	string sql = "select * from Table1 where id=@id";
	SqlParameter[] pars = new[] {
	 new SqlParameter("@id",id),

};

存储过程示例:

	set @sql='select * from Tests where id=@id'
	exec sp_executesql @sql, N'@id int', @id


2、替换特殊符号和监视关键字

根据攻击原理,正常情况下,替换(注意必须是替换,不是过滤删除)掉特殊符号,例如引号',分号;,双减号--等,可减少此类注入发生。

同时监视特殊关键字,遇到则提示错误,例如declare

示例代码(适用于MVC或Web API):

public class SQLAntiInjectionFilterAttribute : System.Web.Http.Filters.ActionFilterAttribute
{
    public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext filterContext)
    {
        //对参数处理
        var actionParameters = filterContext.ActionDescriptor.GetParameters();

        foreach (var p in actionParameters)
        {
            if (p.ParameterType == typeof(string) && filterContext.ActionArguments[p.ParameterName] != null)
            {
                filterContext.ActionArguments[p.ParameterName] = FilterSQL(filterContext.ActionArguments[p.ParameterName].ToString());
            }

            else if (p.ParameterType == typeof(object))//BODY参数
            {
                JObject json = filterContext.ActionArguments[p.ParameterName] as JObject;

                if (json != null)
                {
                    foreach (var a in json)
                    {
                        if (a.Value.Type == JTokenType.String)
                        {
                            json[a.Key] = FilterSQL(a.Value.ToString());
                        }
                    }
                }
            }
        }
        base.OnActionExecuting(filterContext);
    }

    private const string StrKeyWord = @"declare |exec ";
    public string FilterSQL(string s)
    {
        if (string.IsNullOrEmpty(s)) return string.Empty;
        s = s.Trim().ToLower();
        string[] strTemp = StrKeyWord.Split('|');
        foreach (var a in strTemp)
        {
            if (s.IndexOf(a) >= 0)

            {
                throw new Exception("System Error!");
            }
        }

        s = s.Replace("=", "=");
        s = s.Replace("'", "''");
        s = s.Replace(";", ";");
        s = s.Replace("--", "——");
        return s;
    }
}

管理处理

使用第三方收费的Web应用防火墙,包括软件防火墙和硬件防火墙。

例如阿里云Web应用防火墙,或亚马逊AWS WAF等。

物理处理

网站&系统开发技术学习交流群:463167176

本站文章除注明转载外,均为本站原创或翻译,欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,共创和谐网络环境。
转载请注明:文章转载自:华晨软件-云微开发平台 » Web安全问题及防范规范之SQL注入
本文标题:Web安全问题及防范规范之SQL注入
本文地址:http://www.hocode.com/OrgTec/Back/0011.html

相关文章: 软件工程风险管理

电话
电话 18718672256

扫一扫
二维码