关于网站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>");
        }
    }
posted @   大侠酷裤马路  阅读(249)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
点击右上角即可分享
微信分享提示