注册本站  论坛  繁體中文

电脑技巧
手机 | MP3 | MP4 | 显卡 | 主板 | 显示器 | 光存储 | 笔记本 | 网络设备 | 移动存储 | 数码相机
键鼠 | CPU | 音箱 | GPS | 电视 | 服务器 | 投影机 | 机箱电源 | 品牌电脑 | 办公打印 |
| 网站首页 | Cisco | Windows | Linux | Java | Dotnet | Oracle | 网页设计 | 平面设计 | 安全 | 软件应用 | 电脑维修 | 办公维修 |
您现在的位置: 电脑技巧 >> Dotnet >> ASP编程 >> Dotnet正文

SQL关于特殊字符处理的基本方法

文章来源:网页教学网 作者:佚名 更新时间:2008-3-20 14:12:06 【 】 【加入收藏
一定要对用户可能输入的诸如引号,尖括号等特殊字符给予足够重视,它们可能引发严重的安全问题。SQL注入的基本手法之一,就是利用对单引号未加过滤的安全漏洞。

用户的输入无非两个用途:对数据库操作或显示在页面上,下面分别对这两种情况下特殊字符的处理加以说明。

1. 对数据库操作
用户输入的数据用于对数据库进行操作时,又分为两种情况,一是进行写库操作,二是作为查询条件。

1.1 写库操作
(insert及update都视为写库操作,这果以insert为例说明,update的处理相同)
一般采用insert语句或AddNew方法两种方式进行写库操作,我们先来看insert语句:

以SQL Server为例,使用这种方式写库,如果username中含用单引号('),会出错。使用下面的自定义函数,可以将单引号进行转换:

exit function
end if
SQLEncode=replace(fString,"'","''")
end function
以上函数将一个单引号转换为两个连续的单引号,数据库能够接受,并以一个单引号写入。SQL语句改为:

再来看AddNew方法:

使用这种方式写库时,不必调用SQLEncode()对单引号进行转换,数据库会自行处理。

对于存储过程的的参数,同样不必进行单引号的转换。

建议大家利用存储过程进行操作,好处嘛,我在《ASP与存储过程》一文中已做了阐述。否则,建议使用AddNew方法写库,好处不仅仅在于避免对单引号进行处理,本文对此不作深入探讨。

1.2 用户输入做为查询条件
如果用户输入的数据作为查询条件出现在where子句中,不论该where子句属于update语句、delete语句还是select语句,都要对单引号进行转换。

2. 用户输入的数据作为输出,显示在页面上
我们这里只讨论不允许用户使用HTML代码的情况,也就是说,即使用户输入了HTML代码,这些数据也不会以HTML代码的形式显示。至于允许用户使用HTML代码的情况,比较复杂,以后专文探讨。

用户输入的数据是绝对不可以不加处理,原样显示的。如果其中包含HTML或js代码,使你的页面混乱不堪倒是小事,甚至可以格掉你的硬盘。

输出显示在页面上的数据,有可能是用户的直接输入,或是取自数据库。可以看到以上在入库时的处理只是转换了单引号,对尖括号,双引号等特殊字符并未处理,我们放在输出的时候再进行处理。

ASP中的server.HTMLEncode()方法可以将许多字符转换为“HTML字符”,如将<转换为<,将>转换为>等等。

在数据显示在页面上之前,可以用server.HTMLEncode()对其进行转换。但是该方法不会对回车,空格进行转换,这样就造成以下问题:如果用户是通过textarea控件输入的数据,输出时将不会保留原有格式,不仅没有回车换行,多个空格也只会显示为一个。为了解决这个问题,我们使用以下自定义函数:

调用以上函数,输出通过textarea控件输入的数据,会得到满意的结果。

如果数据输出在表单控件中,不论是何种控件,都可利用server.HTMLEncode()方法转换字符,即使是对于textarea控件,也不会产生问题。虽然回车空格没有被转换,但在该控件中可以被识别。但是,server.HTMLEncode()方法不转换单引号。所以,控件的值一定要使用双引号:

否则,如果用户输入的是 '' onclick=javascript:.... ,以上代码将显示为:

而javascript命令可以做的事情实在是太多了。

以上,通过用户输入数据的两种用途,对特殊字符的处理做了大概的说明。还有一种情况:用户的输入作为GET请求的参数值。比如通过以下URL向服务器发送请求:test.asp?username=MyName

我一般只把数值型的数据做此类提交,并在接收时对数据类型做验证。若是字符型的数据,如何处理特殊字符呢?有兴趣的朋友思考一下吧,呵呵。

有些朋友喜欢用JAVAScript过滤特殊字符,而且限制输入的字符很多。我不建议这么做,一是JAVAScript是客户端运行的,不可靠。要知道,对服务器的请求是可以伪造的,伪造者可不会加上你的JAVAScript代码;二是JAVAScript不太友好;三者,实际上没有必要限制那么多字符,限制太多,用户会害怕的。

总结一下我对特殊字符处理的经验吧:

1. 对接收到的数据类型进行验证;
2. 尽量通过存储过程对数据库进行操作;
3. 如上一点不可行,尽量使用AddNew方法写库;
4. 对作为查询条件的数据,使用自定义函数SQLEncode()转换单引号;
5. 表单控件的值,一定要用双引号引起来;
6. 在表单控件中显示数据时,使用server.HTMLEncode()方法转换字符;
7. 对于通过textarea提交的数据,使用自定义函数HTMLEncode()转换字符并保持格式;
8. 尽量避免使用Request()接收数据,应使用Request.Form()或Request.QueryString();
9. 尽量避免通过URL传递字符参数(只用此方式传递数值参数)
  • 上一篇Dotnet:

  • 下一篇Dotnet:
  • 最 新 热 门
     ASP关于类的Let,Set和Get的用法的异同
     ASP对XML文档中文本的增加、删除、修改、查…
     ASP实例:读取xml文件的程序
     ASP实例:是否支持XmlHttp组件的判断
     XMLHTTP实时进行表单数据的校验
     SQL关于特殊字符处理的基本方法
     ASP教程:Expires 属性的介绍
     ASP教程:ASP关于数组的应用技巧
     详细的关于ASP缓存类的教程
     ASP是不是值得学习呢?
    最 新 推 荐
     ASP关于类的Let,Set和Get的用法的异同
     ASP对XML文档中文本的增加、删除、修改、查…
     ASP实例:读取xml文件的程序
     ASP实例:是否支持XmlHttp组件的判断
     XMLHTTP实时进行表单数据的校验
     SQL关于特殊字符处理的基本方法
     ASP教程:Expires 属性的介绍
     ASP教程:ASP关于数组的应用技巧
     详细的关于ASP缓存类的教程
     ASP是不是值得学习呢?
    相 关 文 章

    ASP完美转化ACCESS为SQL数据库连接
    ASP动态网站制作中使用MYSQL的分析
    如何编写通用的ASP防SQL注入攻击程序
    提高SQL的执行效率的ASP的五种做法
    ASP、Request对象与SQL注入
    查询某个字段没有值的所有记录的SQL语句
    用ASP和SQL语句动态的创建Access表
    解析ASP与SQL server互操作的时间处理
    ASP读sql数据时出现乱码问题的解决方法
    精华文章:ASP中SQL语句参考及记录集对象

    | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 网站公告

     

    Copyright 2006-2008 pcjx.com All Rights Reserved
    电脑技巧 版权所有 粤ICP备06059145号 地图
    本网站所有内容未经许可不得转载或做其他使用