好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

asp.net富文本提交

asp.net富文本提交

asp.net富文本提交(不使用2.0请求方式,不禁用页面检查)

异常详细信息: System.Web.HttpRequestValidationException:从客户端中检测到有潜在危险的 Request.Form 值

很熟悉有木有,相信只要做asp.net的得碰到过这个异常,但怎么解决呢?你会发现无论你是百度还是Google,解决方法都是validateRequest="false" ,以致于微软都实在看不过去了,在4.0中把XSS(跨站脚本攻击)给改成不能禁用了,可这并不能难倒咱们聪明的程序员,还可以在配置文件设置<httpRuntime requestValidationMode="2.0" ></httpRuntime>,结果就是整个项目为了用一个富文件都用2.0方式提交表单了。

注:网上有篇文章虽然提到了这个设置不安全,也给出了异常处理方式,但对于富文本却还是说不得不用validateRequest="false"方式。

 

个人对上面的做法评论是:“ 为了自己进出方便就把自家房门给拆了 ”。

 

那么有没有不降低安全性又能正确提交表单的呢?

当然有了。首先我们知道,造成出现这个异常的原是表单提交时不能含有"<",">"等字符,那么用一种可对称加密的方法将字符串编码后再传,后台接收后再解码不就可以绕过检查了么?

下面的代码是我从实际项目提取出来的,之所以用图片,一是因为我用的 为知笔记(Wiz) 做的笔记,对代码支持不是很好,还有个最大的原因,我不想看到这篇文章的人直接去拷代码,所谓“授人以鱼,不如授之以渔”,我只是提供一个解决问题的思路而已(代码只是用来告诉读者,这个思路是可以解决问题的)。

 

示例代码(百度UEditor,asp.net,C#,javaseript)

前台代码

前台提交按纽

后以赋值

后台取值 

 

Base64编解码

 

C#

 

JS文件

/*
编码规则

Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码。
它将需要编码的数据拆分成字节数组。
以3个字节为一组。按顺序排列24 位数据,再把这24位数据分成4组,即每组6位。
再在每组的的最高位前补两个0凑足一个字节。
这样就把一个3字节为一组的数据重新编码成了4个字节。
当所要编码的数据的字节数不是3的整倍数,
也就是说在分组时最后一组不够3个字节。
这时在最后一组填充1到2个0字节。
并在最后编码完成后在结尾添加1到2个 “=”。 

*/

//下面是64个基本的编码
var  base64EncodeChars  =   "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" ;
var  base64DecodeChars  =   new  Array(
- 1 ,  - 1 ,  - 1 ,  - 1 ,  - 1 ,  - 1 ,  - 1 ,  - 1 ,  - 1 ,  - 1 ,  - 1 ,  - 1 ,  - 1 ,  - 1 ,  - 1 ,  - 1 ,
- 1 ,  - 1 ,  - 1 ,  - 1 ,  - 1 ,  - 1 ,  - 1 ,  - 1 ,  - 1 ,  - 1 ,  - 1 ,  - 1 ,  - 1 ,  - 1 ,  - 1 ,  - 1 ,
- 1 ,  - 1 ,  - 1 ,  - 1 ,  - 1 ,  - 1 ,  - 1 ,  - 1 ,  - 1 ,  - 1 ,  - 1 ,  62 ,  - 1 ,  - 1 ,  - 1 ,  63 ,
52 ,  53 ,  54 ,  55 ,  56 ,  57 ,  58 ,  59 ,  60 ,  61 ,  - 1 ,  - 1 ,  - 1 ,  - 1 ,  - 1 ,  - 1 ,
- 1 ,  0 ,  1 ,  2 ,  3 ,  4 ,  5 ,  6 ,  7 ,  8 ,  9 ,  10 ,  11 ,  12 ,  13 ,  14 ,
15 ,  16 ,  17 ,  18 ,  19 ,  20 ,  21 ,  22 ,  23 ,  24 ,  25 ,  - 1 ,  - 1 ,  - 1 ,  - 1 ,  - 1 ,
- 1 ,  26 ,  27 ,  28 ,  29 ,  30 ,  31 ,  32 ,  33 ,  34 ,  35 ,  36 ,  37 ,  38 ,  39 ,  40 ,
41 ,  42 ,  43 ,  44 ,  45 ,  46 ,  47 ,  48 ,  49 ,  50 ,  51 ,  - 1 ,  - 1 ,  - 1 ,  - 1 ,  - 1 );

//编码的方法
function  base64encode(str) {
     var  out, i, len;
     var  c1, c2, c3;
    len  =  str.length;
    i  =   0 ;
    out  =   "" ;
     while  (i  <  len) {
        c1  =  str.charCodeAt(i ++ )  &  0xff;
         if  (i  ==  len) {
            out  +=  base64EncodeChars.charAt(c1  >>   2 );
            out  +=  base64EncodeChars.charAt((c1  &  0x3)  <<   4 );
            out  +=   "==" ;
             break ;
        }
        c2  =  str.charCodeAt(i ++ );
         if  (i  ==  len) {
            out  +=  base64EncodeChars.charAt(c1  >>   2 );
            out  +=  base64EncodeChars.charAt(((c1  &  0x3)  <<   4 )  |  ((c2  &  0xF0)  >>   4 ));
            out  +=  base64EncodeChars.charAt((c2  &  0xF)  <<   2 );
            out  +=   "=" ;
             break ;
        }
        c3  =  str.charCodeAt(i ++ );
        out  +=  base64EncodeChars.charAt(c1  >>   2 );
        out  +=  base64EncodeChars.charAt(((c1  &  0x3)  <<   4 )  |  ((c2  &  0xF0)  >>   4 ));
        out  +=  base64EncodeChars.charAt(((c2  &  0xF)  <<   2 )  |  ((c3  &  0xC0)  >>   6 ));
        out  +=  base64EncodeChars.charAt(c3  &  0x3F);
    }
     return  out;
}

//解码的方法
function  base64decode(str) {
     var  c1, c2, c3, c4;
     var  i, len, out;
    len  =  str.length;
    i  =   0 ;
    out  =   "" ;
     while  (i  <  len) {
         do  {
            c1  =  base64DecodeChars[str.charCodeAt(i ++ )  &  0xff];
        }  while  (i  <  len  &&  c1  ==   - 1 );
         if  (c1  ==   - 1 )
             break ;
         do  {
            c2  =  base64DecodeChars[str.charCodeAt(i ++ )  &  0xff];
        }  while  (i  <  len  &&  c2  ==   - 1 );
         if  (c2  ==   - 1 )
             break ;
        out  +=  String.fromCharCode((c1  <<   2 )  |  ((c2  &  0x30)  >>   4 ));
         do  {
            c3  =  str.charCodeAt(i ++ )  &  0xff;
             if  (c3  ==   61 )
                 return  out;
            c3  =  base64DecodeChars[c3];
        }  while  (i  <  len  &&  c3  ==   - 1 );
         if  (c3  ==   - 1 )
             break ;
        out  +=  String.fromCharCode(((c2  &  0XF)  <<   4 )  |  ((c3  &  0x3C)  >>   2 ));
         do  {
            c4  =  str.charCodeAt(i ++ )  &  0xff;
             if  (c4  ==   61 )
                 return  out;
            c4  =  base64DecodeChars[c4];
        }  while  (i  <  len  &&  c4  ==   - 1 );
         if  (c4  ==   - 1 )
             break ;
        out  +=  String.fromCharCode(((c3  &  0x03)  <<   6 )  |  c4);
    }
     return  out;
}

function  utf16to8(str) {
     var  out, i, len, c;
    out  =   "" ;
    len  =  str.length;
     for  (i  =   0 ; i  <  len; i ++ ) {
        c  =  str.charCodeAt(i);
         if  ((c  > =  0x0001)  &&  (c  < =  0x007F)) {
            out  +=  str.charAt(i);
        }  else   if  (c  >  0x07FF) {
            out  +=  String.fromCharCode(0xE0  |  ((c  >>   12 )  &  0x0F));
            out  +=  String.fromCharCode(0x80  |  ((c  >>   6 )  &  0x3F));
            out  +=  String.fromCharCode(0x80  |  ((c  >>   0 )  &  0x3F));
        }  else  {
            out  +=  String.fromCharCode(0xC0  |  ((c  >>   6 )  &  0x1F));
            out  +=  String.fromCharCode(0x80  |  ((c  >>   0 )  &  0x3F));
        }
    }
     return  out;
}

function  utf8to16(str) {
     var  out, i, len, c;
     var  char2, char3;
    out  =   "" ;
    len  =  str.length;
    i  =   0 ;
     while  (i  <  len) {
        c  =  str.charCodeAt(i ++ );
         switch  (c  >>   4 ) {
             case   0 :   case   1 :   case   2 :   case   3 :   case   4 :   case   5 :   case   6 :   case   7 :
                 // 0xxxxxxx
                out  +=  str.charAt(i  -   1 );
                 break ;
             case   12 :   case   13 :
                 // 110x xxxx   10xx xxxx
                char2  =  str.charCodeAt(i ++ );
                out  +=  String.fromCharCode(((c  &  0x1F)  <<   6 )  |  (char2  &  0x3F));
                 break ;
             case   14 :
                 // 1110 xxxx  10xx xxxx  10xx xxxx
                char2  =  str.charCodeAt(i ++ );
                char3  =  str.charCodeAt(i ++ );
                out  +=  String.fromCharCode(((c  &  0x0F)  <<   12 )  |
                               ((char2  &  0x3F)  <<   6 )  |
                               ((char3  &  0x3F)  <<   0 ));
                 break ;
        }
    }
     return  out;
}

////编码
//value = base64encode(utf16to8(src))

////解码
//value = utf8to16(base64decode(src))

上面的js的Base64编解码代码都是在网站摘的,原作者我也不知道是谁,有些小的修改。

 

当然编码不一定要用Base64,也可以用javascript的encodeURIComponent编码在后台用Server.UrlEncode 或 HttpUtility.UrlEncode解码,我一开始用的就是这个方法,但是提交后格式有些变动。

但个人认为Bases64编码能更好的还原格式,不然viewstate就不会用它了。



来自为知笔记(Wiz)Time=2013-06-05 17:36:49

【推荐】前端资源推荐

 

书籍类:

排名部分先后哈~~

林小志:书籍:《 css那些事儿 》
Demo: http://lab.linxz.de/ 曹刘阳:《 编写高质量代码:Web前端开发修炼之道 》 姬小光:《 精彩绝伦的CSS 》
Blog: http://44ux.com 汤母大叔:《 JavaScript编程精解 》
文章:  http://www.cnblogs.com/TomXu/archive/2012/10/22/2733027.html
文章:  http://www.cnblogs.com/TomXu/archive/2011/12/15/2288411.html 嗷嗷:《 Web标准设计 》
样章:  http://www.aoao.org.cn/book/web-standards-design/ 拔赤:《 基于MVC的JavaScript Web富应用开发 》

作品类:

排名部分先后哈~~

龙: 蒲公英 css3PPT 四叶草,水草,玻璃瓶 胡少睿: HoorayOS 破锣锅: in.js 其他: https://github.com/paulguo gdy : web app开发引擎  糖饼 : artDialog 勾三股四: html5 幻灯片 辣妈: 植物僵尸 鬼哥: 前端辅助工具 沙迦: http://www.cocos2d-x.org/projects/cocos2d-x/wiki/Html5 朝沐金风: node.js类 Welefen Lee : 作品: http://www.flkit.org/ 介绍: http://www.welefen.com/fl-introduce.html 斩梦人天天: http://beizhanyong.sinaapp.com/kor/demo.html 雨夜带刀: easyJS 月影、屈屈、JK(非鬼群)、好奇(非鬼群): qwrap  玉伯(射雕): seaJS  script: 使用css3绘制企鹅 Alloyteam: css3库 大漠: css3 案例 于涛: 团队:Alloyteam 作品: http://sz.chachaba.com http://web.qq.com http://alloyteam.github.com/JX http://CodeTank.alloyteam.com

Blog类: 神飞: 前端观察 司徒正美 大漠,为之 JUSTICE   Franky   一丝冰凉

其他

CJ: JavaScript视频教程

 

 

 

标签:  javascript

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于asp.net富文本提交的详细内容...

  阅读:42次