`

谨防 url 传递参数未编码(转码)产生的陷阱

    博客分类:
  • java
阅读更多

谨防 url 传递参数未编码(转码)产生的陷阱

      在最近的项目中,碰到些因为 url 传递参数时未编码(转码)所引起的一些“莫名其妙”的错误,特此记下来,以免大家再像我一样走弯路。 

      我们知道,web项目总少不了参数传递的情况,如 http://www.google.cn/search?hl=zh-CN&q=%E5%95%8A,这就带了hl 与 q 两个参数,并且 q 是经过编码的(中文为 “啊”)。但在项目中,我们有时候传递参数却会忘记对参数进行编码(解码、转码),这样,会产生什么样的陷阱呢?

      1、公司原有的OA(asp开发,文件编码:gb2312)与刚开发的内部业务系统(asp.net开发,文件编码:uft-8)进行集成,登陆OA,将用户名写入cookie(cookies["user_name"]),然后在业务系统中读取此 cookie,死活都读取不到,为什么?文件编码不同,导致业务系统里面cookie的名称已经变成了 “user%5Fname”!

      2、业务系统(文件编码:uft-8)内部调用外部的一个php文件(编码:gb2312)发送短信:http://sms.XXX.cn/index.php?controller=BoSends&action=sendSms&username=某公司&password=password&mobile=139********&content=Hello,也是一样发送不成功!看看php文件的编码,才知道是 gb2312,当username 和 password 传递过去的时候,系统里面找不到相关资料,因为username("某公司")已经发生改变了!

      在这两种情况下,我们就必须对文件进行转码了:如2、HttpUtility.UrlEncode("某公司",System.Text.Encoding.GetEncoding("gb2312")),当然我们可以写一个方法:

      

<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->    /// <summary>
    
/// 指定编码
    
/// </summary>
    
/// <param name="str"></param>
    
/// <param name="codingType"></param>
    
/// <returns></returns>
    public string StrEncoding(string str, string codingType)
    {
        
return HttpUtility.UrlEncode(str, System.Text.Encoding.GetEncoding(codingType));
    }



      再有就是在系统内部页面传递参数进行编码:

      3、老板很气愤:XXX,你过来,这个统计系统是你做的吗?
                           我:是的!有什么问题吗?
                       老板:怎么回事?这个链接明明有统计数据的,怎么查询它的详细数据就没有呢?连统计图也看不见!
                           我:我看下...
      
      经检查发现:老板是正确的,那个链接确实有统计数据,但点击查看这个链接的详细数据却没有了! ???

      回到办公桌前,赶紧再试那个链接 http://www.XXX.com/admins/DayChart.aspx?un=ABC&ul=http://p.yiqifa.com/servlet/handleClick?sid=a7e226f4bb8f1a18&pid=221&wid=232

      这个链接需要传递两个参数:un 与 ul,其中,un=ABC ,ul=http://p.yiqifa.com/servlet/handleClick?sid=a7e226f4bb8f1a18,但在参数传递之后,ul 变成了什么?也许你已经发现了:ul=http://p.yiqifa.com/servlet/handleClick?sid=a7e226f4bb8f1a18&pid=221&wid=232。是的,ul 已经变成了 http://p.yiqifa.com/servlet/handleClick?sid=a7e226f4bb8f1a18 ,pid 与 wid 被当成了 DayChart.aspx 的参数了!

      4、统计某页面所有的链接及图片点击,1分钟内重复点击不入库,采用cookie保存用户点击数据,静态页面采用脚本异步向服务器传递数据。在本机运行应用程序实现需求,但在服务器上就出现问题了:点击 N 多不同的链接,只会录入前两条数据!

      难道是域名的问题?服务器的应用程序使用了域名,而本机还是localhost。于是修改了host文件,给本机模拟域名,问题重现了,本机和服务器出现的问题一模一样,只插入两条数据!

      看看代码,考虑到对cookie的操作较特殊,于是每次点击将 Cookie 写入文本文件,再进行检查,检查发现:写入的cookie值与预期的不一样...

      cookie需要写入客户端的,有可能是文件的编码产生的问题吗?嗯!于是在写入cookie之前,对字符串进行编码,获取cookie之后,再对 cookie 内的字符串进行解码。问题解决了,服务器上可以正常插入数据了...

      但为什么采用域名会出现那样的错误呢???(期待...)

      3、4采用的编码、解码:HttpUtility.UrlEncode(str) 、HttpUtility.UrlDecode(str)

      另外附下:js脚本提交页面时,注意中文参数的传递 (escape(str))
      SomeOne:啊???这个也附上来...  地球人都知道啊!        
      我: 哈哈...啰嗦下! 

      以上只是项目中遇到的编码问题,记录下来,希望对大家有所帮助,同时,不正确的地方希望大家告知,谢谢!
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics