数据验证之特殊字符处理

数据

 一定要对用户可能输入的诸如引号,尖括号等特殊字符给予足够重视,它们可能引发严重的安全问题。SQL注入的基本手法之一,就是利用对单引号未加过滤的安全漏洞。
    用户的输入无非两个用途:对数据库操作或显示在页面上,下面分别对这两种情况下特殊字符的处理加以说明。
    1. 对数据库操作
    用户输入的数据用于对数据库进行操作时,又分为两种情况,一是进行写库操作,二是作为查询条件。
    1.1 写库操作
    (insert及update都视为写库操作,这果以insert为例说明,update的处理相同)
    一般采用insert语句或AddNew方法两种方式进行写库操作,我们先来看insert语句:
   
    DIM username,sqlstr
    username = trim(Request.Form("uname"))
    sqlstr = "insert into [userinfo] (username) values ('"& username &"')"
    以SQL Server为例,使用这种方式写库,如果username中含用单引号('),会出错。使用下面的自定义函数,可以将单引号进行转换:

    Rem 转换SQL非法字符
    function SQLEncode(fString)
        if isnull(fString) then
            SQLEncode = ""
            exit function
        end if
        SQLEncode=replace(fString,"'","''")
    end function

    以上函数将一个单引号转换为两个连续的单引号,数据库能够接受,并以一个单引号写入。SQL语句改为:

    sqlstr = "insert into [userinfo] (username) values ('"& SQLEncode(username) &"')"

    再来看AddNew方法:

    DIM username
    username = trim(Request.Form("uname"))
    'MyRst为Recordset对象,MyConn为Connection对象
    MyRst.open "[userinfo]",MyConn,0,3
    MyRst.AddNew
    MyRst("username").Value = username
    MyRst.Update
    MyRst.Close
 
    使用这种方式写库时,不必调用SQLEncode()对单引号进行转换,数据库会自行处理。
    对于存储过程的的参数,同样不必进行单引号的转换。
    建议大家利用存储过程进行操作,好处嘛,我在《ASP与存储过程》一文中已做了阐述。否则,建议使用AddNew方法写库,好处不仅仅在于避免对单引号进行处理,本文对此不作深入探讨。
   
    1.2 用户输入做为查询条件
    如果用户输入的数据作为查询条件出现在where子句中,不论该where子句属于update语句、delete语句还是select语句,都要对单引号进行转换。

    2. 用户输入的数据作为输出,显示在页面上
    我们这里只讨论不允许用户使用HTML代码的情况,也就是说,即使用户输入了HTML代码,这些数据也不会以HTML代码的形式显示。至于允许用户使用HTML代码的情况,比较复杂,以后专文探讨。
    用户输入的数据是绝对不可以不加处理,原样显示的。如果其中包含HTML或js代码,使你的页面混乱不堪倒是小事,甚至可以格掉你的硬盘。
    输出显示在页面上的数据,有可能是用户的直接输入,或是取自数据库。可以看到以上在入库时的处理只是转换了单引号,对尖括号,双引号等特殊字符并未处理,我们放在输出的时候再进行处理。
    ASP中的server.HTMLEncode()方法可以将许多字符转换为“HTML字符”,如将<转换为<,将>转换为>等等。
    在数据显示在页面上之前,可以用server.HTMLEncode()对其进行转换。但是该方法不会对回车,空格进行转换,这样就造成以下问题:如果用户是通过textarea控件输入的数据,输出时将不会保留原有格式,不仅没有回车换行,多个空格也只会显示为一个。为了解决这个问题,我们使用以下自定义函数:

    Rem 转换HTML非法字符,用于输出显示时
    function HTMLEncode(fString)
       if not isnull(fString) then
          fString = Replace(fString, ">", ">")
          fString = Replace(fString, "<", "<")
          fString = Replace(fString, CHR(34), """)             '双引号
          fString = Replace(fString, CHR(39), "'")              '单引号    
          fString = Replace(fString, CHR(32)&CHR(32), "  ")    '空格
          fString = Replace(fString, CHR(9), " ")              'tab键值
          fString = Replace(fString, CHR(10), "<br>")               '换行
          fString = Replace(fString, CHR(13), "")                   '回车
          HTMLEncode = fString
       end if
    end function
   
    调用以上函数,输出通过textarea控件输入的数据,会得到满意的结果。
    如果数据输出在表单控件中,不论是何种控件,都可利用server.HTMLEncode()方法转换字符,即使是对于textarea控件,也不会产生问题。虽然回车空格没有被转换,但在该控件中可以被识别。但是,server.HTMLEncode()方法不转换单引号。所以,控件的值一定要使用双引号:

    <input type=text name=uname value=""" & server.HTMLEncode(user

时间: 2024-08-31 18:43:15

数据验证之特殊字符处理的相关文章

实用Javascript 传值, 数据验证, 事件触发总结

javascript|数据 实用Javascript  传值, 数据验证, 事件触发总结 1. 和JSP传值问题: 1)普通提交form 的数据验证传值 html页面输入: <form name ="form1"> <input-..> </form> Javascript 获得值并处理: <script language="javascript "> function checkForm1(text1) { if(t

ZenTaoPHP框架的数据验证机制

项目中数据验证在web应用中尤其显得重要.下面来给大家介绍下ZenTaoPHP框架的数据验证机制. 一.首先来确定一个问题,即验证的规则放在什么地方? mvc程序中,每一层都可以放验证规则.比如很多的表单验证,会自动根据用户的输入进行验证,然后给予提示.那么数据验证放在哪一层呢?这个问题网络上大家有很多的争议.有的人主要放在view这一层,有的则主张放在control层.禅道框架选择了model层. 为什么这样做呢?因为model层是最低的一层,所有的数据操作,都要经过model来进行处理.那么

ASP.NET AJAX:数据验证(模拟检测用户名是否存在)

数据验证涉及到很多方面的东西,在当前的技术领域里,从技术上来看可以说是分为传统的验证(同 步方式)和Ajax(异步方式)验证.如果从功能验证上来看的话就包罗万象了.比如非空验证,对等验证 ,格式验证等等.在.NET里还有专门用于验证的的几个常见验证控件,RequiredFieldValidator, RangeValidator,RegularExpressionValidator,CompareValidator,CustomValidator以及 ValidationSummary等,这里不

C++中正则表达式 的 子表达式(subexpressions) 的数据验证

子表达式(subexpressions)的 数据验证(data validation), 可以通过括号"()"分解正则表达式的子表达式; 然后使用下标标示符[], 输出相应的子表达式, "0"代表全体, "1"代表第一个括号, 依次递加; 通过对于问号项?是否匹配, 验证正则表达式的匹配式; 代码: #include <iostream> #include <string> #include <boost/regex

在Silverlight应用程序中进行数据验证

概述 众所周知,在ASP.NET应用程序中,我们可以使用验证控件进行数据输入的验证,遗憾的是在 Silverlight中并没有提供任何验证控件,但Silverlight对于双向数据绑定还是提供了一些基本的数据验 证支持,我们可以在set设置器中定义验证规则,并对于不合法数据抛出异常,最后通过捕获验证错误事 件来实现数据的验证. 本文将介绍在Silverlight应用程序中如何进行数据验证. 准备知识 Silverlight中如下两种情况下,将会触发验证错误: 1.在绑定引擎中执行数据转换时抛出异

在Silverlight中进行基本的数据验证

Silverlight 2支持基本的数据验证功能.在Silverlight 2中,当我们把数据绑定到某个UI控件的时 候,该数据所具有的有效性规则也自动被绑定到了该UI控件上. 比如某个数据字段被设置为整数型,当我们用非整数型数据对该字段进行更新的时候就会发生错误. 我们就可以利用这个规则在UI中对输入数据进行验证.要做到这点,我们只要设置两个XAML属性,并在所 定义的事件中实现我们所期望的UI行为就可以了. 比如下面的XAML代码定义了一组控件,用户通过TextBox对数据进行更新: ﹤St

Silverlight3系列(六)数据验证 Data Validation

本篇我们讨论SL3中的数据验证相关知识. 数据验证只会发生双向绑定的情况下,因为实体类需要实现INotifyPropertyChanged接口.在SL中数据绑定的时候如果遇到没有验证的数据,通常会忽略它.下面的表中,列出在双向绑定的时候,三种类型的错误: 1.不正确的数据.例如:本来是应该数字类型的,不应该输入字符或者其他字符,同时,也不能超出最大值. 2.对象属性的set异常.例如:在属性Id的set中有一个判断,如果有问题就抛出异常. 3.只读属性,你不能进行赋值操作. 如果是上面的错误,你

Swing通用数据验证模块

这段时间真是忙得要死,一方面要开发公司项目的系统框架,要将项目分成不同的子项目,编写核心 代码:另一方面要将极限编程(XP)引入团队开发,部署各类 XP需要的服务例如subversion啦,ant+ivy 啦,Hudson啦等等.顺便说句题外话,ubuntu还真是不是一般的好用,建议有能力的全部转到ubuntu上去 开发. 我目前开发的这个框架的客户端是具肥的客户端,也就是Swing客户端了.Swing应用相对于Web应用有 很多优势,因为它更肥.数据验证就是其中一个.当然现在的Web应用通过使

ASP.NET MVC入门 8、ModelState与数据验证

ViewData有一个ModelState的属性,这是一个类型为ModelStateDictionary的 ModelState类型的字典集合.在进行数据验证的时候这个属性是比较有用的.在 使用Html.ValidationMessage()的时候,就是从ViewData.ModelState中检测是否 有指定的KEY,如果存在,就提示错误信息.例如在前一篇文章ASP.NET MVC 入门 7.Hellper与数据的提交与绑定中使用到的UpdateModel方法: 我们在View中使用Html.