数据验证之特殊字符处理

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

    一定要对用户可能输入的诸如引号,尖括号等特殊字符给予足够重视,它们可能引发严重的安全问题。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字符”,如将<转换为&lt;,将>转换为&gt;等等。
    在数据显示在页面上之前,可以用server.HTMLEncode()对其进行转换。但是该方法不会对回车,空格进行转换,这样就造成以下问题:如果用户是通过textarea控件输入的数据,输出时将不会保留原有格式,不仅没有回车换行,多个空格也只会显示为一个。为了解决这个问题,我们使用以下自定义函数:

    Rem 转换HTML非法字符,用于输出显示时
    function HTMLEncode(fString)
       if not isnull(fString) then
          fString = Replace(fString, ">", "&gt;")
          fString = Replace(fString, "<", "&lt;")
          fString = Replace(fString, CHR(34), "&quot;")             '双引号
          fString = Replace(fString, CHR(39), "&#39;")              '单引号    
          fString = Replace(fString, CHR(32)&CHR(32), "&nbsp; ")    '空格
          fString = Replace(fString, CHR(9), "&nbsp;")              '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(username) & """>
 
    否则,如果用户输入的是 '' onclick=javascript:.... ,以上代码将显示为:

    <input type=text name=uname value='' 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传递字符参数(只用此方式传递数值参数)

     [本文仅发表于www.netop.ccblog.csdn.net/netopsnetops.blogchina.com 若见于其它各处,皆为转载]

开发安全之:Cross-Site Scripting: Poor Validation 然而,这种解决方法在 Web 应用程序中通常是行不通的,因为许多字符对浏览器来说都具有特殊的含义,编码时这些字符必须被视为合法输入,例如,一个 Web 设计电子公告栏就必须接受其用户提供的 HTML 片段。针对 XSS 漏洞进行验证最安全的方式是,创建一份安全字符允许列表,允许其中的字符出现在 HTTP 内容中,并且只接受完全由这些经认可的字符组成的输入。由于 XSS 漏洞在应用程序的输出中包含恶意数据时出现,因此,合乎逻辑的方法是在数据流出应用程序的前一刻对其进行验证 阅读详情

相关推荐

sql验证特殊字符处理防止注入

sql注入 最好的方式是使用? 占位符 如果需要拼接参数的sql,需要验证特殊字符处理,防止注入 static String reg = "(?:')|(?:--)|(/\\*(?:.|[\\n\\r])*?\\*/)|" + "(\\b(select|update|and|or|delete|insert|trancate|char|into|substr|ascii|declare|exec|count|master|into|drop|execute)\\b)";

路人甲的博客 2217

input与textarea输入时特殊字符过滤

关于特殊字符过滤

qq_50957390的博客 746

文本框特殊符号验证

/*************************************文本框特殊符号验证*************************************/function checkAllTextValid(form){ if(form==null)  form=document.all("temp"); //记录不含特殊符号的文本框数量     var resultTag = 0

曹世超的专栏 2112

url转码和解码

转自: js中escape,encodeURI,encodeURIComponent三个函数的区别

Hello World! 1万+

对于特殊字符串的处理方法

对于特殊的字符串,我们对字符串进行特殊与非特殊两种,第一种字符串开头特殊字符提到末尾处理方法或者末尾字符串提到开头,总之先处理特殊的就OK了 开头提到末尾处理: #include "stdio.h" #include"stdlib.h" #include "conio.h" void fun(char*a) { int i=0,j=0; char *p=a; while(*p...

weixin_33675507的博客 273

数据验证特殊字符处理 [转]

一定要对用户可能输入的诸如引号,尖括号等特殊字符给予足够重视,它们可能引发严重的安全问题。SQL注入的基本手法之一,就是利用对单引号未加过滤的安全漏洞。用户的输入无非两个用途:对数据库操作或显示在页面上,下面分别对这两种情况下特殊字符处理加以说明。1. 对数据库操作用户输入的数据用于对数据库进行操作时,又分为两种情况,一是进行写库操作,二是作为查询条件。1.1 写库操作(insert及...

dengxiajuan5846的博客 657

ASP.NET Core MVC表单处理终极指南:从数据验证到文件上传的10个核心技巧 [特殊字符]

ASP.NET Core MVC表单处理是构建现代Web应用的关键技能。无论你是开发电商平台、内容管理系统还是企业级应用,掌握高效的**表单处理**技术都能显著提升开发效率和用户体验。本指南将带你深入理解ASP.NET Core MVC框架中表单处理的完整流程。 ## 为什么ASP.NET Core MVC表单处理如此重要? 🤔 在Web开发中,表单是用户与系统交互的主要方式。**ASP.N

gitblog_00878的博客 959

Live-Charts数据验证与边界处理:AxisLimits与CoreLimit的完整使用指南 [特殊字符]

Live-Charts是一个简单、灵活、交互性强且功能强大的.NET图表库,提供了丰富的数据可视化解决方案。在数据可视化过程中,正确的**数据验证**和**边界处理**对于确保图表显示准确性和用户体验至关重要。 ## 什么是AxisLimits与CoreLimit? 📊 **AxisLimits**和**CoreLimit**是Live-Charts库中负责处理图表坐标轴范围和数据边界的关键

gitblog_00629的博客 817

php 特殊字符替换,php 特殊字符处理函数

php 特殊字符处理函数但是我们可以用正则进行替换:复制代码 代码如下:function dhtmlspecialchars($string) {if(is_array($string)) {foreach($string as $key => $val) {$string[$key] = dhtmlspecialchars($val);}} else {$string = preg_rep...

weixin_31312621的博客 471

如何快速解决APOD-API常见问题:日期验证数据缺失与高并发处理方案 [特殊字符]

**APOD-API**(Astronomy Picture of the Day API)是NASA官方提供的每日天文图片API服务,允许开发者获取NASA每日发布的精美天文图片及相关数据。这个免费API服务广泛应用于天文教育、科普应用和创意项目中。然而,在实际使用过程中,开发者常常会遇到日期验证错误、数据缺失和高并发访问等常见问题。本文将为你提供完整的解决方案指南,帮助你快速解决这些技术难题,

gitblog_01021的博客 397

如何处理导入 Excel时 数据格式的验证和清理?

基于正则表达式的验证对于一些文本格式的数据,如邮箱地址,可以使用正则表达式进行验证。在监听器的invoke方法中对每一行数据进行验证。例如:= null &&!throw new RuntimeException("邮箱格式错误: " + user . getEmail());} // 其他数据处理 } @Override public void doAfterAllAnalyzed(AnalysisContext analysisContext) {

alankuo的专栏 1281

C# datatable中的数据不被转义

DataTable中的数据是以原始形式存储的,不会自动转义特殊字符。直接读取DataTable中的数据即可获取原始内容。如果需要确保反斜杠或其他特殊字符不被转义,可以使用逐字字符串字面量(如果数据是 JSON 或其他格式,使用相应的解析库进行处理。始终通过调试或日志验证数据的原始内容。

qq_25066151的博客 401

beatportdl项目中的文件名特殊字符处理问题分析

beatportdl项目中的文件名特殊字符处理问题分析 在音乐下载工具beatportdl的开发过程中,开发者发现了一个关于文件名特殊字符的有趣问题。这个问题涉及到2009年Beatport平台发布的一些音乐文件,它们的元数据中包含了制表符(tab)等特殊空白字符。 问题背景 当用户尝试下载特定专辑时,生成的文件名中出现了异常的空白字符。经过分析,发现这些异常字符实际上是制表符"\t&q...

gitblog_07491的博客 336

django登录注册验证之密码包含特殊字符,确认密码一致实现,Form验证

Form验证的原理 首先用户在注册界面提交表单,后台收到表单之后通过request.post取到数据然后传入已经写好的Form类 执行obj.is_valid()这里的obj为Form的实例,在Form类里面对字段一个一个进行验证先执行正则匹配然后执行clean方法 这里的clean方法就是一个钩子,但是不能在验证某个字段的时候调用其他字段,原因是这个时候其他字段不能确定是否验证完成了 需...

weixin_30399871的博客 1354

验证正则表达式 替换

var t_tPipeId = $("#tPipeId").val();t_tPipeId = $.trim(t_tPipeId); t_tPipeId = t_tPipeId.replace(/\-/g, "_n");//特殊字符除外"-" var t_tPipeLen = $("#tPipeLen").val();t_tPipeLen = $.trim(t_tPipeLen); var

xiwu1616的专栏 786

php常用表单验证类用法实例

<?php /** * 页面作用:常用表单验证类 * 作 者:欣然随风 * QQ:276624915 */ class class_post { //验证是否为指定长度的字母/数字组合 function fun_text1($num1,$num2,$str) { Return (preg_match("/^[a-zA-Z0-9]{".$num1.","....

diaobang0776的博客 142

正则:字符串中不能含有空格 & 不包含任一特殊字符

1、正则表达式语法,不允许在字符串的开头和结尾使用空格,但允许在字符串的中间使用空格 ^[^\s]+(\s+[^\s]+)*$ 2、字符中不能包括空格的正则表达式 ^\S*$ 3、不包含任一( ', /, *, -)特殊字符 ^((?![\\'\\/\\*\\-]).)*$ ...

qq_31217363的博客 2万+

js过滤特殊字符

//过滤特殊字符function CheckIfEnglish( String ){     var Letters = "(!@#$%^&*;':";     var i;     var c;      if(String.charAt( 0 )=='-') return false;      if( String.charAt( String.length - 1 ) == '-' )          return false; for( i = 0; i      {          c =

haipingint的专栏 310
上一篇: 数据验证之长度限制
下一篇: 数据验证之类型与格式
netops
博客等级 码龄22年 1粉丝 7原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值