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>");
            }
        }
  • 相关阅读:
    C/C++多文件之间的变量定义
    PKU POJ 2186 Popular Cows 强连通分量
    重载函数
    ZOJ 2763 Prison Break
    201357 训练赛总结
    hdu 4467 Graph 构造
    201356 训练赛总结
    201353 NEERC 2012, Eastern subregional contest
    2013512 CF 183 总结
    一道动态规划
  • 原文地址:https://www.cnblogs.com/tzy080112/p/1594520.html
Copyright © 2011-2022 走看看