闪亮滴眼露

Nothing impossible

原创 防SQL注入解决方案(1)收藏

新一篇: 读"软件工程思想"(1) | 旧一篇: SQL 注入原理

   防止 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("'","''");
 }

发表于 @ 2007年02月01日 20:57:00|评论(loading...)|收藏

新一篇: 读"软件工程思想"(1) | 旧一篇: SQL 注入原理

评论

#billgates130 发表于2008-05-25 23:46:42  IP: 124.115.230.*
SQL注入的解决方案在
http://blog.mdcsoft.cn/archives/200805/46.html 关于mdcsoft-ips (插件)
mdcsoft-ips(Web应用防护系统)是一款保护Web站点和应用免受来自于应用层攻击的Web防护系统。它内置于Web服务器软件中,通过分析应用层的用户请求数据,区分正常用户访问Web和攻击者的恶意行为,对诸如SQL注入式攻击、非法脚本执行、跨站提交攻击等应用攻击行为进行实时阻断和报警。
mdcsoft-ips使用的Web服务器核心内嵌技术,在请求数据尚未被Web服务器软件处理之前(更在应用系统处理之前)即进行检查,确保所有攻击行为被拒之门外。它可以防范篡改数据库和网页、绕过身份认证和假冒用户、窃取用户和系统信息等严重危害网站内容安全的行为。
mdcsoft-ips作为Web系统软件的一部分完全透明地工作,与具体的Web网站结构和Web应用系统无关。部署mdcsoft-ips后,无须对现有Web应用的代码作任何修改
#csdn 发表于2008-05-27 23:22:20  IP: 124.115.230.*
还可以
#张朝 发表于2008-05-28 23:36:57  IP: 124.115.230.*
哪个是不错,可是收费的啊
#张力 发表于2008-05-29 21:09:20  IP: 124.115.230.*
哎。可是也花了我几百银子呢
#陈鹏 发表于2008-06-11 08:46:09  IP: 124.114.168.*
那软件还可以吧
#周永明 发表于2008-08-25 01:00:54  IP: 124.115.230.*
mdcsoft-ips (插件)
这个东西是的确不错,我也购买了,但作者不应该把自动更新设置成每天检测更新,这样每天都会弹出更新的窗口,很麻烦的,
还有WEB管理界面登陆有时很卡,
#周永明 发表于2008-08-25 01:01:01  IP: 124.115.230.*
mdcsoft-ips (插件)
这个东西是的确不错,我也购买了,但作者不应该把自动更新设置成每天检测更新,这样每天都会弹出更新的窗口,很麻烦的,
还有WEB管理界面登陆有时很卡,
#周明 发表于2008-08-25 01:01:52  IP: 124.115.230.*
mdcsoft-ips (插件)
这个东西是的确不错,我也购买了,但作者不应该把自动更新设置成每天检测更新,这样每天都会弹出更新的窗口,很麻烦的,
还有WEB管理界面登陆有时很卡,
#扬子 发表于2008-09-05 11:33:04  IP: 124.115.230.*
是好东西。我现在4台机器上全部部署了MDCSOFT-IPS。目前还没遇到攻击,
发表评论  


登录
Csdn Blog version 3.1a
Copyright © baker