防SQL注入解决方案(1)

   防止 SQL Injection 解决方案

问题的提出:
(1)    科技厅项目库系统
通过注入方式, 只需输入帐号.
(2)    KJXM 
通过注入 删除存储过程.
(3) ANDES
 
 
1.       验证所有客户端输入.
始终通过测试类型, 长度, 格式和范围来验证用户输入. 实现对恶意输入的预防. 不能让不安全的代码可能被复制到安全的环境中. 以下建议几种最佳做法.
(1)    对接受到的客户端数据实施有效的数据检测, 不对该数据做出任何有关大小 , 类型或内容的假设. 例如,在一个输入查询条件的TextBox中输入了 10MB的文字或MPEG文件将会导致SQL缓冲区溢出. 再如 在该TextBox中输入了 drop 语句,将会导致严重结果.
有效做法是 限制输入长度, 类型.
(2)    测试字符串变量的内容, 只接收所需的值. 拒绝包含二禁止数据, 转义序列和注释字符的输入内容. 将有助与防止脚本注入, 防止某些缓冲区溢出攻击.
(3)    根据架构对输入数据进行验证, 按照正常的验证程序 不会允许用户输入单引号 注释符等, 但在特定情况下需要包含这些字符的数据, 例如 XML数据. 这种情况就决定了客户端输入验证不能同一化.
(4)    尽量不要使用 SQL语句和字符串连而成的 查询, 例如.
String sql=”SELECT * FROM [table] WHERE 主持单位=’”+master_com+”’”;
(5)    在多层结构中, 所有数据都应该在验证之后才允许进入可信区域 (如: 数据访问层).未通过验证的数据应当被拒绝, 并向客户端返回一个错误.
(6)    实现多层验证. 简单的输入验证 只能防止简单的脚本注入. 一旦攻击者突破这个防线就可能不受限制地访问系统.
(7)    有可能构造文件名的字段中 (如: 文件上传输入的文件名), 不接收下列字符串: AUX, CLOCK$, COM, CON, CONFIG$, LPT, NUL以及PRN.
(8)    拒绝接收包含下列字符的输入.
 ;                查询分割符.
                    字符数据字符串分隔符.
--           注释分隔符.
/* ….*/    注释分隔符.
Xp_         用于目录扩展存储过程的名称的开头, 如xp_cmdshell.
 
(9)    使用类型安全的SQL参数.
例如:
(一): 直接传参.
string  constr  =  ConfigurationManager.
ConnectionStrings[
" ConnectionString " ].ConnectionString;
    SqlConnection cn 
=   new  SqlConnection(constr);
cn.Open();
    
string  sql  =   " SELECT [姓名],[密码] FROM [user] WHERE ([登录名] = @login_name) " ;
    SqlCommand cm 
=   new  SqlCommand(sql, cn);
    cm.Parameters.Add(
new  SqlParameter( " @login_name " , SqlDbType.VarChar,  16 ));
cm.Parameters[
" @login_name " ].Value  =  TextBox2.Text.Trim();
SqlDataReader dataReader 
=  cm.ExecuteReader();
   ( 二): 使用SQLHelper
SQLHelper helper =   new  SQLHelper();
//  void RunSQL(string cmdText, SqlParameter[] prams, out SqlDataReader dataReader)    
string  sql  =   " SELECT [姓名],[密码] FROM [user] WHERE ([登录名] = @login_name) " ;
SqlParameter[] para 
=   new  SqlParameter[ 1 ];
para[
0 =  helper.CreateInParam( " @login_name " ,SqlDbType.VarChar, 16 , TextBox2.Text.Trim());
SqlDataReader dataReader;
helper.RunSQL(sql,para, 
out  dataReader);
(10) 筛选输入.
    
筛选输入可以删除转义字符, 也可以有效防止SQL注入. 但” 有问题字符 ” 数量比较多, 也不是一种可靠的方法. 如果预先定义了 “ 危险字符集 ” ,就是另外一种情况了, 如:
   private   string  SafeString( string  sql, string [] Dangers)
        
{
            
for(int index=0;index<Dangers.Length;index++)
            
{
                sql 
= sql.Replace(Dangers[index],"");
            }

            
return sql;
     }

       (11) 特殊SQL语句转义.
 
使用(10)中的方法. 将会替换掉所有SQL字符串中的危险字符. 但这些危险字符又有可能出现于SQL语句中. 例如 前面说过的 – 注释符, % 等 在 LIKE子句的查询中就有可能会用到, 这时需要特殊对待.进行转义.
sql  =  sql.Replace( " % " , " [%] " );
sql 
=  sql.Replace( " _ " , " [_] " );
sql 
=  sql.Replace( " [ " , " [[] " );
     private   string  SafeString( string  sql)
        
{
            
return sql.Replace("'","''");
 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值