Web安全(2)

HTTP

  • HTTP(HyperText Transfer Protocol,超文本传输协议):是访问万维网使用的核心通信协议
  • HTTP使用一种基于消息的模型:客户端发送一条请求消息,而后服务器返回一条响应消息
  • 该协议基本不需要连接,虽然HTTP使用有状态的TCP协议作为它的传输机制,但每次请求与响应交换都自动完成,并且可能使用不同的TCP连接

HTTP请求

所有HTTP消息(请求与响应)中都包含一个或几个单行显示的消息头(header),然后是一个强制空白行,最后是消息主体(可选)

GET请求

//请求方法(get)+空格+url()+空格+协议版本(HTTP/1.1)
//常用的HTTP版本为1.0和1.1,1.1版本必须使用Host请求头
//GET请求没有消息主体,因此在消息头后的空白行中没有其他数据
GET https://testrail-tools.trendmicro.com/portal/admin/getTimerInitStatus HTTP/1.1    

//从第二行开始到第十行(Accept-Cookie)都是请求头部
//Accept:表示客户端接受的内容类型,按照先后顺序表示客户端接收数据的先后次序
Accept: application/json, text/javascript, */*; q=0.01
//以x开头的是非http标准,一般是某种技术的出现而定义的;这里是用来判断是http请求还是ajax请求。
X-Requested-With: XMLHttpRequest
//Referer消息头用于表示发出请求的原始URL
Referer: https://testrail-tools.trendmicro.com/portal/admin/toLicenseTimerConfig?id=7

//客户端接受内容返回优先选择的语言
Accept-Language: zh-CN

//客户端可以接受的服务器对返回内容进行编码压缩的格式。
Accept-Encoding: gzip, deflate

//客户端运行的浏览器类型信息
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko

//Host消息头用于指定出现在被访问的完整URL中的主机名称
Host: testrail-tools.trendmicro.com

//表示是否需要持续连接
Connection: Keep-Alive

//Cookie消息头用于提交服务器向客户端发布的其他参数
Cookie: _ga=GA1.2.1909963682.1524537669; _gid=GA1.2.563928490.1529501401
//空行
//消息主体

注:消息头会在下文进行详细解释

GET请求的响应

//状态行
//使用的HTTP版本+空格+请求结果的数字状态码+空格+原因短语
//200是最常用的状态码,它表示成功提交了请求,正在返回所请求的资源
HTTP/1.1 200 OK

//包含处理请求的服务器信息,包含多个产品注释和标识。
Server: Apache-Coyote/1.

//告知缓存机制是否可以缓存和类型,private是只能当前用户,不能被共享。
Cache-Control: private

//响应过期时间
Expires: Wed, 31 Dec 1969 16:00:00 PST

//application配置,这里表示读取的是application-prod.properties
X-Application-Context: application:prod

//返回数据的类型和字符编码格式
Content-Type: application/json;charset=UTF-8

//告知接收端,报文采取了何种编码,chunked表示服务器无法确定消息大小,一般比如下载等,就采用chunked。
Transfer-Encoding: chunked

//返回消息的时间
Date: Wed, 20 Jun 2018 15:00:16 GMT

//空行

//响应正文
{"advancewarn":"1","userstatus":"1","ldap":"1","licensealarm":"1","deltempzipfile":"1","sctmlicense":"0","user":"1"}

HTTP方法

GET方法

  • GET方法的作用在于获取资源
  • 可以用URL查询字符串的形式向请求的资源发送参数(URL中?后的部分为查询字符串)。这使用户可将一个包含动态资源的URL标注为书签,。
  • 用户或其他用户可重复利用该书签来获取等价的资源。
  • URL显示在屏幕上并记录在许多地方,因此,请勿使用查询字符串传送任何敏感信息。

POST方法

  • POST方法的主要作用是执行操作。
  • 使用此方法可以在查询字符串和消息主体中发送请求参数。
  • 仍然可以将URL标注为书签,但书签中不包含消息主体发送的任何参数。

HEAD方法

  • 与GET方法类似
  • 与GET方法不同之处在于服务器不会在响应中返回消息主体。
  • 服务器返回的信息头应与对应GET请求返回的消息头相同。
  • 这种方法可用于检查某一资源在向其提交GET请求之前是否存在。

TRACE方法

  • 这种方法主要用于诊断
  • 服务器应在响应主体中返回其收到的请求消息的具体内容。
  • 这种方法主要用于检测客户端和服务器之间是否存在任何操纵请求的代理服务器

OPTIONS方法

  • 这种方法要求服务器报告对某一特殊资源有用的HTTP方法
  • 服务器通常返回一个包含Allow消息头的响应,并在其中列出所有有效方法。

PUT方法

  • 这个方法试图使用包含在请求主体中的内容,向服务器上传指定的资源。
  • 如果激活这个方法,渗透测试员就可以利用它来攻击应用程序

URL

URL格式解析:
http:\host[:port][abs_path][:parameters][?query]#fragment

例如:http://www.abc.com:80/WebApplication1/WebForm1.aspx?name=tom&;age=20#resume

  • http表示要通过HTTP协议来定位网络资源。
  • host表示合法的因特网主机域名或者IP地址。
  • port用于表示在传输层上交换信息的进程端口号,http协议默认端口号为80,当然采用不同的协议默认端口号不同。
  • abs_path指定请求资源的URI(统一资源定位符)。
  • parameters参数用于指定特殊参数的可选项。
  • ?query可选,用于给动态网页(使用PHP/JSP等制作的网页)传递参数,可以有多个参数,用“&”符号隔开,每个参数的键值之间用‘=’隔开。

在上述实例中
http是协议,www.abc.com 是服务器,80是HTTP协议默认端口号,/WebApplication1/WebForm1.aspx是服务器上存放该资源的路径, query=”name=tom&;age=20#resume”是动态网页查询

### REST
表述性状态转移(REST)是分布式系统的一种体系架构,在这类体系架构中,请求和响应包含系统资源当前状态的表述。万维网,包括HTTP协议和URL格式中使用的核心技术,均符合REST体系架构的风格。
“REST风格的URL”一词通常指在URL文件路径而非查询字符串中包含参数的URL。
包含查询字符串的URL

http://wahh-app.com/seacher?make=ford&model=pinto

REST风格参数的URL:

http://wahh-app.com/seacher/ford/pinto

HTTP消息头

常用消息头

  • Connection 这个消息头用于告诉通信的另一端,在完成HTTP传输后是关闭TCP连接还是保持连接开放以接收其他信息。
  • Content-Encoding 这个消息头为消息主体中的内容指定编码形式(如gzip),一些应用程序使用它来压缩响应以加快传输速度
  • Content-Length 这个消息头用于规定消息主体的字节长度(HEAD的响应语法例外,它在对应的GET请求的响应中指出主体长度)
  • Content-Type 这个消息头用于规定消息主体的内容类型,如HTML文档的内容类型为text/html
  • Transfer-Encoding 这个消息头指定为方便其通过HTTP传输而对消息主体使用的任何编码。如果使用这个消息头,通常用它指定块编码。

请求消息头

  • Accept 告诉服务器端客户端愿意接受哪些内容。如图像类型、办公文档格式等。
  • Accept-Encoding 告诉服务器客户端愿意接受哪些内容编码
  • Authorization 用于为一种内置HTTP身份验证向服务器提交证书
  • Cookie 用于向服务器提交它以前发布的cookie
  • Host 用于指定出现在所请求的完整URL中的主机名称。
  • If-Modified-Since 说明浏览器最后一次收到所请求的资源的时间,如果自那以后资源没有发生变化,服务器就会发出一个带状态码304的响应,指示客户端使用资源的缓存副本
  • Origin 这个消息用在跨域Ajax请求中,用于只是提出请求的域
  • If-None-Match 用于指定一个实体标签,实体标签是一个说明消息主体内容的标识符,当最后一次收到所请求的资源时,浏览器提交服务器发布的实体标签。服务器可使用实体标签确定浏览器是否使用资源的缓存副本。
  • Referer 用于指示提出当前请求的URL
  • User-Agent 提供浏览器或生成请求的其他客户端软件有关的信息

响应消息头

  • Access-Control-Allow-Origin 用于指示可否通过跨域AJax请求获取资源
  • Cache-Control 用于向浏览器传送缓存指令
  • ETag 用于指定一个实体标签。客户端可在将来的请求中提交这个标识符,获得和If-None-Match消息头中相同的资源,通知服务器浏览器当前缓存中保存的是哪个版本的资源。
  • Expires 用于向浏览器说明消息主体内容的有效时间,在这个时间之前,浏览器可以使用这个资源的缓存副本。
  • Location 用于在重定向响应(那些以状态码3开头的响应)中说明重定向的目标
  • Prama 用于向浏览器传送缓存指令
  • Server 提供所使用的Web服务器软件的相关信息
  • Set-Cookie 用于向浏览器发布cookie,浏览器会在随后的请求中将其返回给服务器
  • WWW-Authenticate 用在带401状态码的响应中,提供服务器所支持的身份验证类型有关信息。
  • X-Frame-Options 指示浏览器框架是否及如何加载当前响应。
  • cookie是大多数Web应用程序所依赖的HTTP协议的一个关键组成部分,攻击者常常通过它来利用Web应用程序的漏洞。
  • 服务器使用cookie机制向客户端发送数据,客户端保存cookie并将其返回给服务器。
  • 与其他类型的请求参数不同(存在于URL查询字符或消息主体中)不同,无须应用程序或用户采取任何特殊措施,随后的每一个请求都会继续重新向服务器提交cookie。

服务器使用Set-Cookie响应消息头发布cookie

Set-Cookie: tracking=tI8rk7joMx44S2Uu85nSWc

然后,用户的浏览器自动将下面的消息头添加到随后返回的同一服务器的请求中

Cookie: tracking=tI8rk7joMx44S2Uu85nSWc

如上所示,cookie一般由一个名/值对构成,但也可以包含任何不含空格的字符串,可以在服务器响应中使用几个Set-Cookie消息头发布多个cookie,,并可在同一个Cookie消息头中用分号分隔不同的cookie,将它们全部返回给服务器。

cookie可选属性

除cookie的实际值外,Set-Cookie消息头还可包含以下任何可选属性,用它们控制浏览器处理cookie的方式

  • expires 用于设定cookie的有效时间,这样会使浏览器将cookie保存在永久性的存储器中,在随后的浏览器会话中重复利用,直到到期时间为止。如果没有设定这个属性,那么cookie仅用在当前浏览器会话中
  • domain 用于指定cookie的有效域,这个域必须和收到cookie的域相同,或者是它的父域。
  • path 用于指定cookie的有效URL路径
  • secure 如果设置这个属性,则仅在HTTPS请求中提交cookie
  • HttpOnly 如果设置这个属性,将无法通过客户端javascript直接访问cookie

状态码

每条HTTP响应消息都必须在第一行中包含一个状态码,说明请求结果,根据代码的第一位数字,可将状态码分为以下5类:

  • 1xx 提供信息
  • 2xx 请求被成功提交
  • 3xx 客户端被重定向到其他资源
  • 4xx 请求包含某种错误
  • 5xx 服务器执行请求时遇到错误

渗透测试员常见状态码

下面列出渗透测试员在攻击Web应用程序时最有可能遇到的状态码及相关的原因短语

  • 100 Continue 当客户端提交一个包含主体的请求时,将发送这个响应,该响应表示已收到请求消息头,客户端应继续发送主体,请求完成后,再由服务器返回一个响应。
  • 200 ok 表示已成功提交请求,且响应主体中包含请求结果
  • 201 Created PUT请求的响应返回这个状态码,表示请求已成功提交。
  • 301 Moved Permanetly 本状态码将浏览器永久重定向到另一个在Location消息头中指定的URL,以后客户端应使用新的URL替换旧的URL。
  • 302 Found 将浏览器暂时重定向到另一个Location的消息头中指定的URL。
  • 304 Not Modified 指示浏览器使用缓存中保存的所请求资源的副本
  • 400 Bad Request 表示客户端提交了一个无效的HTTP请求
  • 401 Unauthorized 服务器在许可请求前要求HTTP进行身份验证
  • 403 Forbidden 不管是否通过身份验证,禁止任何人访问被请求的资源
  • 404 Not Found 表示所请求的资源不存在
  • 405 Method Not Allowed 表示指定的URL不支持请求中使用的方法
  • 413 Request Entity Too Large 如果在本地代码中探查缓冲器溢出漏洞并就此提交超长数据串,则本状态码表示请求主体过长,服务器无法处理
  • 414 Request URI Too Long 表示请求中的URL过长,服务器无法处理
  • 500 Internal Server Error 服务器在执行时遇到错误
  • 503 Service Unavailable 表示尽管Web服务器运转正常,并且能够响应请求,但服务器访问的应用程序还是无法作出响应。

HTTPS

HTTP使用普通的非加密TCP作为其传输机制。HTTPS本质上与HTTP一样,都属于应用层协议,但HTTPS通过安全传输机制——安全套接层(Secure Socket Layer,SSL)——传送数据。这种机制可保护通过网络传送的所有数据的隐秘性和完整性,显著降低非入侵性拦截攻击的可能性。不管是否使用SSL进行传输,HTTP的请求与响应都以完全相同的方式工作。

HTTP代理

  • HTTP代理服务器是一个协调客户端浏览器与目标Web服务器之间访问的服务器。
  • 当配置使用代理服务器时,它会将所有的请求提交到代理服务器,代理服务器再将请求转送给相关Web服务器,并将响应返回给浏览器
  • 大多数代理还使用其他服务,如缓存、验证与访问机制
    如果使用代理服务器,HTTP的工作机制会出现两方面的差异
  1. 当浏览器向代理服务器发送HTTP请求时,它会将完整的URL(包括前缀http://与服务器主机名称,在非标准URL中,还包括端口号)插入请求中,代理服务器将提取主机名称和端口,并使用这些信息将请求指向正确的目标Web服务器
  2. 当使用HTTPS时,浏览器无法与代理服务器进行SSL握手,因为这样会破坏安全隧道,使通信易于遭受拦截攻击。因此,浏览器必须将代理作为一个纯粹的TCP级中继,由它传递浏览器与目标Web浏览器之间的所有网络数据,并与浏览器进行正常的SSL握手。浏览器使用CONNECT方法向代理服务器提交一个HTTP请求,并指定URL中的目标主机名称与端口号,从而建立这种中继。如果代理允许该请求,它会返回一个含200状态码的HTTP响应,一直开放TCP连接,从此以后作为目标Web服务器的纯粹TCP级中继

注:从某种程度上说,攻击Web应用程序时最有用的工具是一个处在浏览器与目标Web站点之间的专用代理服务器,使用它可以拦截并修改所有使用HTTPS的请求和响应。

HTTP身份验证

HTTP拥有自己的用户身份验证机制,使用不同的身份验证方案。

  • Basic 这是一种非常简单的身份验证机制,它在请求消息头中随每条消息以Base64编码字符串的形式发送用户证书
  • NTML 这是一种质询-响应式机制。它使用某个Windows NTML协议版本
  • Digest 这是一种质询-响应式机制。它随用户证书一起使用一个随机值MD5校验和。

注:“基本身份验证并不安全”这种观点是错误的,可以使用HTTPS作为传输机制,防止任何HTTP消息收到窃听攻击。

Web功能

服务器端功能

  • 静态资源:Web站点有相当数量的静态资源,当用户提交请求时,只需将它们加载到Web服务器,再传送给用户即可。(只由静态资源组成的Web站点,每次用户请求某个特殊的资源时,服务器都会返回相同的内容),如HTML页面与图片。
  • 动态资源:如今的Web应用程序主要向用户提供动态生成的内容,当用户请求一个动态资源时,服务器会动态建立响应,每个用户都会收到满足其特点需求的内容。
  • 动态内容:动态内容由在服务器上执行的脚本或其他代码生成。在形式上,这些脚本类似于计算机程序,它们收到各种输入,并处理输入,然后向用户返回输出结果。
  • 当用户的浏览器提出访问动态资源的请求时,它并不仅仅是要求访问该资源的副本。通常,它还会随请求提交各种参数。正是这些参数保证了服务器端应用程序能够生成适合各种用户的需求的内容。HTTP请求使用的3种主要方式向应用程序传送参数:
  1. 通过URL查询字符串
  2. 通过REST风格的URL的文件路径
  3. 通过HTTPcookie
  4. 通过在请求主体中使用POST方法

Web应用程序在服务器端使用大量的技术实现其功能,这些技术包括:

  • 脚本语言,如PHP,VBScript,Perl
  • Web应用程序平台,如ASP.NET和Java
  • Web服务器,如Apache、IIS和Netscape Enterprise
  • 数据库,如Oracle和MySQL
  • 其他后端组件,如文件系统、基于SOAP的Web服务和目录服务

#### Java平台

专业术语解释
  • Enterprise Java Bean(EJB)是一个相对重量级的软件组件,它将一个特殊业务功能的逻辑组合到应用程序中
  • 简单传统的java对象(Plain Old Java Object,POJO)是一个普通的Java对象
  • Java Servelt是应用程序服务器中的一个对象,它接收客户端的HTTP请求并返回HTTP响应。
  • Java Web容器是一个为基于java的Web应用程序提供运行时环境的平台和引擎Apacha属于Web容器
Java Web应用程序

许多Java Web应用程序在定制代码中使用第三方与开源组件。关键应用程序功能常用的组件包括:

  • 身份验证:JAAS,ACEGI
  • 表示层:SiteMesh,Tapestry
  • 数据库对象关系映射:Hibernate
  • 日志:Log4J

ASP.NET

  • ASP.NET是Microsoft开发的一种Web应用程序框架
  • ASP.NET使用Microsoft的.NET Framework,提供一个虚拟机[CLR]与一组强大的API。因此,ASP.NET可以用任何.NET语言来写(C#,VB.NET)

PHP

PHP为常用的应用程序功能提供了现成的解决方案,并将其整合到应用更加广泛的定制应用程序中,如:

  • 公告牌:PHPBB,PHP-Nuke
  • 管理前端:PHPMyAdmin
  • Web邮件:SquirrlMain,IlohaMail
  • 相册:Gallery
  • 购物车:osCommerce,ECW-Shop
  • 维客:Media Wiki,Wakka Wikki

Ruby On Rails

主要侧重于模型-视图-控制器体系架构。Rails的主要优势在于,使用它能够以极快的速度创建成熟的数据驱动应用程序

SQL

结构化查询语句(SQL)用于访问Qracle,MySQL等数据库中的数据。目前,绝大多数的Web应用程序都将基于SQL的数据库作为它们后端的数据库

XML

可扩展标记语言(XML)是一种机器可读格式的数据编码规范,其语法与HTML类似,XML之所以可扩展,是因为它可以使用任意数量的标签和属性名。

Web服务

实际上,许多应用程序就是一组后端Web服务的GUI前端。Web服务使用简单对象访问协议(SOAP)来交换数据。通常SOAP使用HTTP协议来传送消息,并使用XML格式表示数据,服务器端应用程序使用它与各种非后端系统进行通信。

一个典型的SOAP请求:

POST /InStock HTTP/1.1
Host: www.example.org
Content-Type: application/soap+xml; charset=utf-8
Content-Length: nnn
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">

  <soap:Body xmlns:m="http://www.example.org/stock">
    <m:GetStockPrice>
      <m:StockName>IBM</m:StockName>
    </m:GetStockPrice>
  </soap:Body>
</soap:Envelope>

客户端功能

服务器端应用程序要接收用户的输入与操作,并向用户返回其结果,它必须提供一个客户端用户界面。由于所有Web应用程序都通过Web浏览器进行访问,因此这些界面共享一个技术核心。客户端技术如下:

HTML

HTML是建立Web界面所需的核心技术。这是一种用于描述浏览器所显示的文档结构的基于标签的语言

超链接

客户端与服务器之间的大量通信都由客户单击超链接驱动。Web应用程序中的超链接通常包括预先设定的请求参数,这些数据项不需要用户输入,而是由服务器将其插入用户单击的超链接的目标URL中,以这种形式提交。比如

<a href="?redit=/updates/update29.html">What's happening?</a>

当用户单击这个链接时,浏览器会提出以下请求

GET /news/8/?redit=/updates/update29.html HTTP/1.1
Host: mdsec.net 

服务器收到查询字符串中的参数(newsid),并使用它的值决定向用户返回什么内容

表单

虽然基于超链接的导航方法负责客户端与服务器之间的绝大多数通信,但许多Web应用程序还是需要采用更灵活的形式收集输入。HTML表单是一种常见的机制,允许用户通过浏览器提交任意输入。以下是一个典序的HTTP表单:

<form action="/secure/login.php?app=quotations" method="post">
username: <input type="text" name="username"><br>
password: <input type="password" name="password">
<input type="hidden" name="redit" value="/secure/home.php">
<input type="submit" name="submit" value="log in">
</form>

当用户在表单中输入值并单击“提交”按钮时,浏览器将提出以下请求:

POST /secure/login.php?app=quotations HTTP/1.1
Host: wahh-app
Content-Type: application/x-www-form-urlencoded
Content-Length: 39
//包含一个Cookie(SESS)参数,服务器在早先的响应中将其发布给浏览器,该参数可用于控制服务器端的处理过程
Cookie: SESS=GTnrpx2ss2tSWSnhXJGyG0LJ47MXRsjcFM6Bd 

username=daf&password=foo&redit=/secure/home.php&submit=log+in
多部分编码

上述的消息主体中的内容类型为 x-www.form-urlencoded ,这表示和URL查询字符串一样,消息主体的参数也以名/值对表示。multipart/form-data是提交表单时的另一种数据类型的内容。使用方法为:

  • 在表单标签的enctype属性中要求浏览器使用多部分编码
  • 使用这种编码形式,请求的Content-Type消息头还会指定一个随机字符串,用它来分隔请求主体中的参数
POST /secure/login.php?app=quotations HTTP/1.1
Host: wahh-app.com
Content-Type: multipart/form-data; boundary:------------7d71385d0a1a
Content-Length: 369
Cookie: SESS=GTnrpx2ss2tSWSnhXJGyG0LJ47MXRsjcFM6Bd
//空行
-------------7d71385d0a1a
Content-Disposition: form-data; name="username"

daf
------------7d71385d0a1a
Content-Disposition: form-data; name="password"

foo
---------------7d71385d0a1a
Content-Disposition: form-data;name="redit"

/secure/home.php
--------------------7d71385d0a1a
Content-Disposition: form-data;name="submit"

log in
--------------------7d71385d0a1a

CSS(层叠样式表)

CSS是一种描述以标记语言编写的文档的表示形式的语言。在Web应用程序中,CSS用来指定HTML在屏幕上的呈现方式

JavaScript

超链接和表单用于建立能够轻易接收大多数Web应用程序所需输入的丰富用户界面。许多应用程序使用一种更加分布式的模型,不仅用客户端提交用户数据和操作,还通过它进行具体的数据处理。JavaScript常用于执行以下任务:

  • 确认用户输入的数据,然后将其提交给服务器,避免因数据包含错误而提交不必要的请求
  • 根据用户操作动态修改用户界面
  • 查询并更新浏览器内的文档对象模型(DOM)

VBScript

VBScript可用于替代Internet Explorer浏览器才支持的JavaScript

文档对象模型(DOM)

  • 文档对象模型是可以通过其API查询和操作的HTML文档的抽象表达形式。
  • DOM允许客户端脚本根据id访问各个HTML元素并以编程的方式访问这些结构
  • DOM还可以读取和更新当前URL和Cookie等数据
  • DOM还包括一个事件模型,以便于代码钩住各种事件,如鼠标点击、通过超链接导航等
  • 浏览器DOM操纵是基于Ajax的应用程序采用的关键技术

Ajax

  • Ajax是一组编程技术,用于在客户端创建旨在模拟传统桌面应用程序的流畅交互和动态行为的用户界面。
  • 最早的Web应用程序基于完整的页面,每个用户操作,如单击链接或提交表单,都会启动窗口级别的导航事件,导致服务器加载新页面。
  • 使用Ajax,一些用户操作将由客户端脚本代码进行处理,并且不需要重新加载页面。例如,在基于Ajax的购物应用程序中,用户点击“添加购物车”按钮,应用程序将启动一个后台请求,在服务器更新用户的购物车记录,随后,一个轻量级响应会更新用户屏幕上显示的购物车中的商品数量,但是,浏览器中的整个页面基本保持不变。
  • Ajax使用的核心技术为XMLHttpRequest,这种技术现在转化为一个本地的JavaScript对象,客户端可以通过该对象提出后台的请求,而无须窗口级别的导航事件。XMLHttpRequest允许在请求中发送以及在响应中接收任意数量的内容

JSON

  • JavaScript对象表示法(JSON)是一种可用于对任意数据进行序列化的简单数据交换的格式。

  • JSON可直接由JavaScript解释器处理,Ajax应用程序常使用JSON以替换最初用于数据传输的XML格式

  • 如果用户执行某个操作,客户端JavaScript使用XMLHttpRequest将该操作传送到服务器,服务器则返回一个包含JSON格式的数据的轻量级响应。然后,客户端脚本将处理这些数据,并对用户界面进行相应的更新

  • 一个例子:
    基于Ajax的Web邮件应用程序可能提供显示所选联系人详细资料的功能,如果用户单击某位联系人,浏览器将使用XMLHttpRequest检索所选联系人的详细资料,并使用JSON返回这些资料

    {
      "name":"Alice",
      "id":"111111",
      "email":"123@qq.com"
    }
  • 应用程序还将JSON用于封装传统上位于请求参数上的数据,如果用户更新联系人的资料,可将以下请求将新信息传送给服务器

POST /contacts HTTP/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 89

Contact={"name":"Alice","id":"111111","email":"123@qq.com"}
&submit=update

同源策略

同源策略是浏览器实施的一种关键机制,主要用于防止不同来源的内容相互干扰。从一个网站收到的内容可以读取和修改从该站点收到的其他内容,但不得访问从其他站点收到的内容。同源策略的特点如下:

  • 一个域的页面可以向另一个域的页面提交任意数量的请求(eg.通过提交表单或加载图像),但该页面本身无法处理上述请求返回的数据
  • 一个域的页面可以加载来自其他域的脚本并在自己的域内运行这个脚本。这是因为脚本被假定为包含代码,而非数据,因此跨域访问不会泄露任何敏感信息。
  • 位于一个域的页面无法读取或修改属于另一个域的cookie或其他DOM数据

编码方案

URL编码

  • URL只允许使用US-ASCII字符集中的可打印字符(也就是ASCII代码在0x20~0x7e范围内的字符),由于其在URL方案或HTTP协议内具有特殊含义,这个范围内的一些字符也不能使用。
  • URL编码方案用于对扩展ASCII字符集中任何有问题的字符进行编码,使其可通过HTTP传输
  • 任何用URL编码的字符都以%为前缀,其后是该字符的两位十六进制ASCII代码
    %3d 代表"="
    %25 代表"%"
    %20 代表空格
    %0a 代表新行
    %00 代表空字节

注:编码字符加号(+)代表URL编码的空格(与%20一样)

Unicode编码

  • 16位的Unicode编码的工作原理与URL编码类似
  • 为通过HTTP进行传输,16位的Unicode编码字符以%u为前缀,其后是这个字符的十六进制Unicode码
    %u2215 表示/
  • UTF-8是一种长度可变的编码标准,它使用一个字节或几个字节表示每个字符
  • 为通过HTTP传输,UTF-8编码的多字节字符以%为前缀,其后用十六进制表示每个字节
    %e2%89%a0代表≠

HTML编码

  • HTML编码是一种用于表示问题字符以将其安全并入HTML文档的方案
  • HTML编码定义了大量HTML实体来表示特殊的字面量字符
    &quot; 代表"
    &apos; 代表'
    &amp; 代表&
    &lt; 代表<
    &gt; 代表>
  • 任何字符都可以使用它的十进制ASCII码进行HTML编码
    &#34; 代表"
    #39; 代表'
  • 或者可以使用十六进制的ASCII码(以x为前缀)
    &#x22; 代表"
    &#x27; 代表'

Base64编码

  • Base64仅用一个可打印的ASCII字符就可安全转换成任何二进制数据
  • Base64编码将输入数据转换为3个字节块,每个块被划分为4段,每段6个数据位。这6个数据位有64种不同的排列组合,因此每个段可使用一组64个字符表示
  • 如果最后输入数据块不能构成3段输出数据,就用一个或两个等号(=)补足输出

十六进制编码

许多应用程序在传送二进制数据时直接使用十六机制编码,用ASCII字符表示十六进制数据块,例如对cookie中用户名daf进行十六进制编码,其结果如下:

646166

   转载规则


《Web安全(2)》 fightingtree 采用 知识共享署名 4.0 国际许可协议 进行许可。
  目录