zoukankan      html  css  js  c++  java
  • 关于网站SQL注入的问题,以及解决办法

    最近发现我们公司的ASP.NET的代码有拼接SQL语句的习惯!这是非常危险的。以下我举例说明一下

    例子1:

    statement := "SELECT * FROM users WHERE name = '" + userName + "'; "

    将用户名变量(即username)设置为:

    a' or 't'='t,此时原始语句发生了变化:

    SELECT * FROM users WHERE name = 'a' OR 't'='t';

    如果这种代码被用于一个认证过程,那么这个例子就能够强迫选择一个合法的用户名,因为赋值't'='t永远是正确的。

    例子2:
    a'; DROP TABLE users; SELECT * FROM data WHERE name LIKE '%

    这就将最终的SQL语句变成下面这个样子:

    SELECT * FROM users WHERE name = 'a'; DROP TABLE users; SELECT * FROM DATA WHERE name LIKE '%';

    将会造成数据库表被删除的严重后果。

    所以强烈建议大家停止SQL语句拼接(特别是网站应用),采用带参数化存储过程。

    对于已经完成的ASP.NET网站应用,设计修改代码太多的,可以考虑加入如下代码处理一下,避免被严重注入攻击。可以通过在Global.asax.cs文件中添加过滤关键字的方法来实现 防止 sql 注入攻击(sql injection),代码如下。

        ///  <summary>
        /// 当有数据时交时,触发事件
        ///  </summary>
        ///  <param name="sender"> </param>
        ///  <param name="e"> </param>
        protected void Application_BeginRequest(Object sender, EventArgs e)
        {
            //遍历Post参数,隐藏域除外
            foreach (string i in this.Request.Form)
            {
                if (i == "__VIEWSTATE") continue;
                this.goErr(this.Request.Form.ToString());
            }
            //遍历Get参数。
            foreach (string i in this.Request.QueryString)
            {
                this.goErr(this.Request.QueryString.ToString());
            }
        }
        ///<summary>
        ///SQL注入过滤
        ///  </summary>
        ///  <param name="InText">要过滤的字符串 </param>
        ///  <returns>如果参数存在不安全字符,则返回true </returns>
        public bool SqlFilter(string InText)
        {
            string word = "and |exec |insert |select |delete |update |chr |mid |master |or |truncate |char |declare |join |cmd | |' |--";//这里加要过滤的SQL字符
            if (InText == null)
                return false;
            foreach (string i in word.Split(' |'))
            {
                if ((InText.ToLower().IndexOf(i + " ") > -1)  | | (InText.ToLower().IndexOf(" " + i) > -1))
                {
                    return true;
                }
            }
            return false;
        }
        ///  <summary>
        /// 校验参数是否存在SQL字符
        ///  </summary>
        ///  <param name="tm"> </param>
        private void goErr(string tm)
        {
            if (SqlFilter(tm))
            {
                Response.Write(" <script>window.alert('参数存在不安全字符');"+" </"+"script>");
            }
        }
  • 相关阅读:
    交换排序------冒泡法 及其优化
    [编程题]最大和子矩阵
    [编程题] N阶楼梯上楼问题
    2017年东北大学计算机专业考博 面试编程题(某教授 实验室)
    幸运的袋子 (牛客网 16年网易内推 编程题)
    OpenvSwitch代码分析之bridge和port
    阅读书籍---程序员必读系列
    嵌入式开发之davinci--- 8168 电源调试总结
    嵌入式开发之davinci--- 8148/8168/8127 中的添加算饭scd 场景检测 文档简介
    嵌入式开发之davinci--- 8148/8168/8127 中的图像缩放sclr、swms之后出现图像视频卡顿、屏幕跳跃的问题
  • 原文地址:https://www.cnblogs.com/tzy080112/p/1594520.html
Copyright © 2011-2022 走看看