URL编码背景

在URI的最初设计时,希望能通过书面转录,比如写在餐巾纸上告诉另外一人,因此URI的构成字符必须是可写的ASCII字符。在这些可书写的字符里,由于一些字符在不同操作系统的编码有不同的解析,被包含在“不安全字符”之中,要格外注意。

(不安全字符)

在URI的构成字符中,最安全的方案是正确使用“保留字符” 和 “非保留字符”的并集
保留字符: 在URL中起到职能型的字符,比如 & ,? 。所以被URL规则给“保留”了。

(保留字和非保留字)

重点:percent encode

何谓percent encode呢?意指百分号编码,借助%来进行有效编码。URL encode的实质就是正确的使用percent encode.

percent encode = % 十六进制

什么时候,对哪些内容,采用何种过滤原则,以及如何生成percent编码?

  在WWW最初时,做法是将字符流转换成字节流,按照ASCII字符与字节一一对应可相互转换,使用对应ASCII字符的整型值作为%的后两个16进制字符,构成percent编码。后来出现了多种percent编码生成方法,导致了URI的难以识别。
  目前做法,指定或系统默认的使用UTF8转成字节流,每个字节编成一个percent编码,例如:中文“网易”的URL编码为%e7%bd%91%e6%98%93,而其UTF8字节流为e7 bd 91 e6 93,可以看出其一一对应关系
  那么percent编码是在对非法字符采用某种编码(约定为UTF8)转成字节流后,逐字节加上%构成percent编码。
  由于不同scheme或协议对URI格式有不同的要求,RFC关于对哪些内容编码,采用何种过滤原则不做硬性规定。而将决定权延后到执行时由开发者根据需要决定。

重点:URL编码需要遵守的原则:

  • 不要对Unreserved Characters做percent encode编码。

  • 除了保留字符和非保留字符外的所有字符,必须使用percent encode进行编码。

  • 保留字符不用于URI分隔符,而是用于其它位置,比如query部分的value时,要对这时用到的保留字符做percent encode编码。

  • 不应当对”保留字”在作为”保留字的使用场景”时使用percent encode编码。比如“http://gulfstream.ptmobile.dev.sankuai.com/schedule?project=AIMT”中的?此时就是作为保留字来使用的,不应当被percent encode。当两个URI的字符几乎对等,区别只在于一个对某些字符用的原有字符,另一个URI对这些字符做了percent encode时。绝大部分情况下,这两个URI应当被认为是不同的两个URI。

不正确的URL encode可能导致的问题

禁止对URI中的保留字作编码,比如&字符。

  • 比如http://www.baidu.com做编码后变成了http%3a%2f%2fwww.baidu.com%2findex.htm,将不能正常访问。

如果url参数值带有保留字符,encode之。

  • 当构建参数传入{“name” : ”namepart1&namepart2”,“id” : “kk”}。
    此时拼接字符串编成了http://www.baidu.com?name=namepart1&namepart2&id=kk,那么如何解析得到”name”字段“namepart1&namepart2”的实际value值,以及id字段的值”kk”?

潜在的语义攻击风险

  • 当构建参数传入{“name” : ”Mitty&isLogin=true”}。此时拼接字符串编成了http://www.baidu.com?name=Mitty&isLogin=true,如果isLogin真的是有意义的queryKey时,直接造成服务器接收了额外的参数。当然关于URL的攻击有很多,比如semantic attack, 这里不做讨论。

【网络基础】为什么要对url进行encode呢?相关推荐

  1. 【网络基础】URI 和 URL 的纠缠

    名词解释: URI (uniform resource identifier) 统一资源标志符: URL(uniform resource location ) 统一资源定位符(或统一资源定位器): ...

  2. Java网络编程详解——网络基础知识介绍、IP和端口介绍、URL和URLConnection介绍

    网络基础知识--计算机网络介绍.通信协议与网络结构模型 一. 计算机网络就是把分布在不同地理区域的计算机与专门的外部设备,用通信线路互连成一个网络系统,从而使众多的计算机可以互相传递信息,共享资源. ...

  3. Java网络编程(网络基础(IP端口号网络通信协议)、TCP编程、UDP编程和URL编程原理以及常用方法的实例)

    网络编程 网络基础概述 计算机网络:   把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大.功能强的网络系统,从而使众多的计算机可以方便地互相传递信息.共享硬件.软件.数据信息等 ...

  4. 网络基础知识(二) HTTP

    网络基础知识(二) HTTP 黑发不知勤学早,白首方悔读书迟. 内容参考:https://www.runoob.com/http/http-content-type.html HTTP协议是Hyper ...

  5. 北大网络教育计算机作业,北大网络教育(计算机专业)网络基础作业答案.doc

    北大网络教育(计算机专业)网络基础作业答案 北大网络教育(计算机专业)计算机网络基础作业答案 1.从逻辑结构上看,计算机和路由器分别属于资源子网和通信子网. 2. 大型广域网常采用的拓扑结构是网络拓扑 ...

  6. HTTP精简教程一:Web网络基础

    使用 HTTP 协议访问 Web Web浏览器根据地址栏中制定的 URL 从 Web 服务器获取文件资源(resource)等信息,从而显示出Web页面. 超文本传输协议(HTTP,HyperText ...

  7. Python3 与 C# 网络编程之~ 网络基础篇

    最新版本查看:https://www.cnblogs.com/dotnetcrazy/p/9919202.html 入门篇 官方文档:https://docs.python.org/3/library ...

  8. 网络基础相关知识内容

    day29 1.网络基础相关的知识 1.1 架构 1.1.1  C/S 架构   服务器/客户端 优势:能够充分发挥PC机的性能 1.1.2  B/S 架构  服务器/浏览器 (隶属于C/S架构) 优 ...

  9. Web的诞生和网络基础 | 读《图解HTTP》

    当今互联网的由来 蒂姆·伯纳斯·李在1989年的时候提出一种设想,借助多文档之间的相互关联形成的超文本(HyperText),连成可相互参阅的WWW(World wide web,万维网). 对于这个 ...

  10. 【前端词典】进阶必备的网络基础(下)

    前言 在上一篇我提到了前端面试频率较高的几个网络基础知识,这一篇我会把上一篇遗留的五个尽力讲清楚.如果还没有来得及看上一篇,那么现在可以一起看. 目录 接下来我会讲以下内容: 五类 IP 地址 跨域的 ...

最新文章

  1. python拆分列表元素_Python将列表拆分为一个元素 - python
  2. UA MATH636 信息论7 高斯信道简介
  3. linux语法错误 未预期的文件结尾,centos shell运行报语法错误: 未预期的文件结尾...
  4. 常见电脑字符编码总结
  5. Python、C++ lambda 表达式
  6. 《转》完美解决微信video视频隐藏控件和内联播放问题
  7. 【Tensorflow】更新后报错 numpy.core.umath
  8. TensorFlow 中 identity 函数理解
  9. 无法启动此程序,因为计算机中丢失msvcrtd.dll,手把手还原win7系统打开程序提示丢失msvcrtd.dll的处理步骤...
  10. 在php里面找出有用的代码,如何在多个源代码文件中 找到某段代码?
  11. mysql读写分离(PHP类)
  12. 打标工具labelme或者labelimg遇到图片闪退的完美解决方案
  13. 10M/S!百度网盘偷偷更新,终于实现下载免费不限速了!
  14. 英雄联盟数据分析专题(一)
  15. win7如何关闭uac(图文详解)
  16. fluent linux运行算例,在linux环境下运行fluent,case文件中带有udf的话,jou文件应该做什么改变呢?...
  17. 灵悟礼品网上专卖店——客户端的登录功能开发
  18. python第五章总结
  19. 网站空间与服务器的区别,网站空间与服务器的区别
  20. java优化方法_JAVA程序性能优化的10个简单方法

热门文章

  1. cytoscape使用方法_信号通路分析工具教程——Cytoscape及OmniPath插件
  2. Kubernetes的共享GPU集群调度
  3. Advanced Auto Layout:Programmatically Creating Constraints
  4. Atitit. 数据库-----catalog与schema的设计区别以及在实际中使用 获取数据库所有库表 java jdbc php  c#.Net...
  5. 十字消源码分享(基于libgdx开发)
  6. 安卓入门笔记之Activity
  7. iOS使用多线程提高数据并发访问 之七
  8. GNS3关联SecureCRT的配置。
  9. SharePoint中修改密码的WEB Part之终极版:即可以修改AD,又可以修改本机用户密码的Web Part!!...
  10. opencv 图片读取和视频读取(一)