网络安全 Web 应用程序
Web 应用程序几乎是我们所做的一切的组成部分,无论是访问互联网还是远程控制您的割草机。在本入门课程中,我们将介绍 Web 应用程序安全的基础知识。
HTTP 协议
HTTP 是一个承载协议,它允许我们的浏览器和应用程序接收 HTML(“超文本标记语言”)、CSS(“层叠样式表”)、图像和视频等内容。
URL、查询参数和协议
要访问 Web 应用程序,我们需要使用 URL(“统一资源定位符”),例如:https://www.google.com/search?q=w3schools+cyber+security&ie=UTF-8
google.com 的 URL 包含一个域名、一个正在访问的脚本和查询参数。
我们正在访问的脚本称为 /search。/ 表示它位于提供文件的服务器的顶级目录中。? 表示脚本的输入参数,& 分隔不同的输入参数。在我们的 URL 中,输入参数是
- q,值为 w3schools cyber security
- ie,值为 UTF-8
这些输入的含义由 Web 服务器的应用程序决定。
有时您只会看到 / 或 /?,表示已设置脚本以响应此地址。通常,此脚本是像 index 文件这样的东西,它会捕获所有请求,除非指定了特定脚本。
协议定义了要使用的协议。在我们的例子中,它是 URL 的第一部分:https。当 URL 中未定义协议时,它允许应用程序自行决定使用哪个协议。协议可以包括一整套协议,例如
- HTTP
- HTTPS
- FTP
- SSH
- SMB
HTTP 标头
HTTP 协议使用许多标头,有些是应用程序自定义的,有些则被技术广泛接受和定义。
请求 http://google.com 的示例
GET /search?q=w3schools+cyber+security&ie=UTF-8 HTTP/1.1
Host: google.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36
Accept: image/avif,image/webp,image/apng,image/*,*/*;q=0.8
Referer: https://w3schools.com/
Accept-Encoding: gzip, deflate
Cookie: cookie1=value1;cookie2=value2
请求标头指定了客户端希望在目标 Web 服务器上执行的操作。它还包含有关是否接受压缩、访问客户端的类型以及服务器告诉客户端呈现的任何 cookie 的信息。HTTP 请求标头在此处进行了解释
Header | Explanation |
---|---|
GET /search... HTTP/1.1 | GET 是我们用于访问应用程序的动词。在 HTTP 动词部分有详细解释。我们还看到了路径、查询参数和 HTTP 版本 |
Host: google.com | 此标头指示我们要使用的目标服务。服务器可以拥有多个服务,如 VHOSTS 部分所述。 |
User-Agent | 客户端应用程序(大多数情况下是浏览器)可以识别自己,包括版本、引擎和操作系统 |
Accept | 定义客户端可以接受的内容 |
Referer: https://w3schools.com/ | 如果客户端从其他网站点击了链接,则会使用 Referer 标头来说明客户端来自何处 |
Accept-Encoding: gzip, deflate | 内容可以被压缩或编码吗?这定义了我们可以接受什么 |
Cookie | Cookie 是服务器在前几次请求中发送的值,客户端在每个后续请求中都会将其发送回来。在 State 部分有详细解释 |
通过此请求,服务器将使用标头和内容进行响应。下面的示例标头
HTTP/1.1 200 OK
Content-Type: text/html
Set-Cookie: <cookie value>
<website content>
响应标头和内容决定了我们将在浏览器中看到的内容。HTTP 响应标头解释如下
Header | Explanation |
---|---|
HTTP/1.1 200 OK | HTTP 响应代码。在 HTTP 响应代码部分有详细解释 |
Content-Type: text/html | 指定返回内容的类型,例如 HTML、JSON 或 XML |
Set-Cookie | 客户端应记住并在下一个请求中返回的任何特殊值 |
HTTP 动词
访问 Web 应用程序时,客户端会收到如何将数据发送到 Web 应用程序的指示。应用程序可以接受许多动词。
!动词 | 用于 |
---|---|
GET | 通常用于通过查询参数检索值 |
POST | 用于通过发送到 Web 服务器的请求正文中的值将数据发送到脚本。通常涉及创建、上传或发送大量数据 |
PUT | 通常用于将数据上传或写入 Web 服务器 |
DELETE | 指示应删除的资源 |
PATCH | 可用于使用新值更新资源 |
这些根据 Web 应用程序的要求使用。Restful (REST) Web 服务特别擅长使用完整的 HTTP 动词数组来定义后端应执行的操作。
HTTP 响应代码
Web 服务器上的应用程序可以根据服务器端发生的情况返回不同的代码。以下是 Web 服务器将向客户端发出的常见响应代码,安全专业人员应了解这些代码
代码 | Explanation |
---|---|
200 | 应用程序正常返回 |
301 | 服务器要求客户端永久记住重定向到客户端应访问的新位置 |
302 | 临时重定向。客户端无需保存此回复 |
400 | 客户端发出了无效请求 |
403 | 客户端无权访问此资源。需要授权 |
404 | 客户端尝试访问不存在的资源 |
500 | 服务器在尝试满足请求时出错 |
REST
REST 服务,有时称为 RESTful 服务,利用 HTTP 动词和 HTTP 响应代码的全部功能来促进 Web 应用程序的使用。RESTful 服务通常使用 URL 的一部分作为查询参数来确定 Web 应用程序上发生的事情。REST 通常由 API(“应用程序编程接口”)使用。
REST URL 将根据 URL 的不同元素调用功能。
示例 REST URL:http://example.com/users/search/w3schools
此 URL 将在 URL 的一部分而不是查询参数中调用功能。我们可以将 URL 解析为
参数 | 注释 |
---|---|
users | 访问 users 功能部分 |
search | 访问搜索功能 |
w3schools | 要搜索的用户 |
会话和状态
HTTP 中没有内置的方法可以让服务器识别返回的访问者。要让 Web 服务器识别用户,必须在每个请求中与客户端之间传递一个秘密值。这通常通过标头中的 Cookie 来完成,但其他方式也很常见,例如通过 GET 和 POST 参数或其他标头。不建议通过 GET 参数传递状态,因为这些参数通常会在服务器或代理等中间件中记录。
以下是一些常见的 Cookie 示例,允许 Web 服务器上的应用程序控制会话和状态
- PHPSESSID
- JSESSIONID
- ASP.NET_SessionID
这些值代表服务器上的特定状态,通常称为会话。此状态表示例如
- 您已登录为哪个用户
- 权限和授权
重要的是,发送给客户端的会话值不能轻易被猜到或被他人识别。如果可以,攻击者就可以冒充 Web 应用程序上的其他用户。
状态也可以保存在客户端。这涉及到服务器将所有状态发送给客户端,并依赖客户端将所有项目发回。此类实现依赖于加密来检查客户端声称的状态的完整性。下面列出了使用此实现的示例
- JWT(“JSON Web Tokens”)
- ASP.Net ViewState
您正在使用 Cookie 来学习本课程!您可以通过打开浏览器的开发者工具来检查这些 Cookie。这是通过在浏览器中按 F12
来完成的,这将打开开发者工具窗口。在此窗口中,您应该能够找到存储 Cookie 的正确位置。
在 Google Chrome 中,Cookie 在上面的 Application 标签中进行了标识。
虚拟主机
一个 Web 服务器可以通过虚拟主机(通常缩写为 Vhosts)处理许多应用程序。为了方便访问其他虚拟主机,Web 服务器通常会读取客户端请求的 Host 标头,并根据此值将请求发送到正确的应用程序。
URL 编码
为了使应用程序能够安全地在服务器和客户端之间传输内容,必须对某些字符进行编码,以确保它们不会影响协议。为了保持通信的完整性,使用了 URL 编码。
URL 编码使用 % 和两个十六进制数字替换不安全字符。例如
- 百分号替换为 %25
- 空格替换为 %20
- 引号替换为 %22
一个进行文本分析和运行 URL 解码等操作的优秀工具是 CyberChef。您可以在此处尝试在浏览器中打开它:https://gchq.github.io/CyberChef/
JavaScript
为了支持动态内容,浏览器使用脚本语言 JavaScript。这使得开发人员能够编写在客户端运行的解决方案,从而实现更具交互性和“活泼”的 Web 内容。
JavaScript 也涉及许多针对 Web 应用程序和客户端应用程序(如浏览器)的攻击。
使用 TLS 进行加密
HTTP 协议不支持传输中数据的加密,因此在 HTTP 外部添加了包装器以支持加密。这通过 HTTP 后面的 S 来表示,即 HTTPS。
以前使用 SSL(“安全套接字层”),但此后已被弃用。通常使用 TLS(“传输层安全”)来强制执行加密。