文章导航PC6首页软件下载单机游戏安卓资源苹果资源

pc软件新闻网络操作系统办公工具编程服务器软件评测

安卓新闻资讯应用教程刷机教程安卓游戏攻略tv资讯深度阅读综合安卓评测

苹果ios资讯苹果手机越狱备份教程美化教程ios软件教程mac教程

单机游戏角色扮演即时战略动作射击棋牌游戏体育竞技模拟经营其它游戏游戏工具

网游cf活动dnf活动lol周免英雄lol礼包

手游最新动态手游评测手游活动新游预告手游问答

您的位置:首页技术开发数据库教程 → SQL 注入式攻击策略

SQL 注入式攻击策略

时间:2010/1/28 13:47:00来源:本站整理作者:我要评论(0)

SQL 注入式攻击是指利用设计上的漏洞, 在目标服务器上运行 SQL 命令以及进行其他方式的攻击, 动态生成 SQL 语句时没有对用户输入的数据进行验证. SQL 注入式攻击是一各常规性的攻击, 可以允许一些不法用户检索他人的数据或改变服务器的设置或者在他人不小心的时候破坏其服务器. SQL 注入式攻击不是 SQL Server 问题, 而是不适当的程序.
   要防范 SQL 注入式攻击, 应该注意以下几点:
   (1). 检查输入的 SQL 语句的内容, 如果包含敏感字符, 则删除敏感字符, 一般敏感字符包括: ', >, <=, !, -, +, *, /, |, 空格等.
   (2). 不要在用户输入过程中构造 WHERE 子句, 应该利用参数来使用存储过程.
        因为 SQL 注入一般出现在程序开发构造一个 WHERE 子句伴随着用户输入的时候.
   过滤非法字符的两种方法:
   (1). 在 ASP.NET 可以自定义一个方法过滤非法字符, 效率较底, 但对敏感字符的过滤比较彻底. 实现如下:
    ///<summary>
    ///防止 SQL 注入式攻击
    ///</summary>
    ///<param name="inputString">用户输入字符串</param>
    public string ConvertSql(string inputString)
    {
        inputString = inputString.Trim(); //去空格
        inputString = inputString.Replace("'", ""); //去单引号
        inputString = inputString.Replace(";", ""); //去分号
        inputString = inputString.Replace("=", ""); //去等号
        inputString = inputString.Replace("or", ""); //去 or
        inputString = inputString.Replace("and", ""); //去 and
        inputString = inputString.Replace("like", ""); //去 通配符

        //............用户可以根据需要定义任何敏感字符
        return inputString;
    }
  
   (2).由于上面这种枚举的方法对程序效率显然有影响, 因此并不是最有效的途径.
       其实最佳途径可以通过  SqlCommandParameners 属性的参数传值实现, 将非法字符过滤.
       原理是SQL 语句在传送过程中参数(用户输入的内容)是不可见的. 自然失去了攻击的机会.
       以登录为例, 实现如下:
      public int checkLogin(string loginName, string loginPwd)
     {
        SqlConnection con = new SqlConnection("Server=***;database=***;Uid=sa;Pwd=***");
        SqlCommand myCommand = new SqlCommand("select count(*) from user where userName=@loginName and userPwd=@loginPwd", con);
        myCommand.Parameters.Add(new SqlParameter("@loginName", SqlDbType.NVarChar, 20));
        myCommand.Parameters["@loginName"].Value = loginName;
        myCommand.Parameters.Add(new SqlParameter("@loginPwd", SqlDbType.NVarChar, 20));
        myCommand.Parameters["@loginPwd"].Value = loginPwd;
        myCommand.Connection.Open();
        int i = (int)myCommand.ExecuteScalar();
        myCommand.Connection.Close();
        return i;
     }
     
    (3).最实用的方法: 建议大家多写存储过程, 它的作用不再仅仅是大家认为的那样起到提供一个接口, 提高执行速度等作用, 当今系统对性能和安全的要求已上升到主要位置.不用担心过多的建立存储过程会给服务器带来负担, 也不要认为书写存储过程麻烦, 当一个庞大的系统把大量的时间花在 SQL 语句的维护与解析和对系统安全的防范时, 这种麻烦完全是值得的. 最明显的优点是当你多建一个存储过程, 少一句前台 SQL 语句时: 便可兼得提高效率与防 SQL 注入式攻击, 何乐而不为呢?

相关视频

    没有数据

相关阅读 Mac OS X 系统上如何升级 Mysql 数据库?PLSQL Developer怎么导出数据库PLSQL Developer配置Oralce11g连接plsql developer怎么使用 plsql developer使用教程plsql developer怎么连接数据库 plsql developer连接数据库教程SQL2008全部数据导出导入两种方法mysql数据库root密码忘记的修改方法SQL报表错误“未能为SSL/TLS安全通道建立信任关系”解决方法

文章评论
发表评论

热门文章 oracle10g安装图解(wi

最新文章 数据库流行度排行2019oracle10g安装图解(wi SQL2008全部数据导出导入两种方法SQL2005新建复制“找不到存储过程 错误:28Dos远程登录mysql数据库详细图文教程mysql怎么开启远程登录功能

人气排行 mysql自动定时备份数据库的最佳方法-支持wiVisual Foxpro 6.0安装向导图文教程SQL Server 2008 安装图文教程SQL2008全部数据导出导入两种方法SQL 2000/2005/2008 的收缩日志方法,和清理mysql出 Can't connect to MySQL server onoracle10g安装图解(win7)sql2005安装图解_(sql server2005)安装教程