网络安全——web
一、html基础标签
前情提要:学习了解相应的HTMl一些标签的特点是必不可少的
id属性是元素在网页内的唯一标识符
id属性的值不得包含空格
id属性的值还可以在最前面加上#,放到 URL 中作为锚点,定位到该元素在网页内部的位置。比如,用户访问网址https://foo.com/index.html#bar的时候,浏览器会自动将页面滚动到bar的位置,让用户第一眼就看到这部分内容。
-
<Class> 标签:
class属性用来对网页元素进行分类。如果不同元素的class属性值相同,就表示它们是一类的。
在HTML中,您可以使用"class"标签来为JavaScript事件处理提供标识。这使得安全相关的操作可以与其他类型的操作区分开来,以便在代码中进行相应的处理,例如验证用户输入或防止潜在的安全漏洞。
<form action="https://example.com/api" method="post">
<label for="POST-name">用户名:</label>
<input id="POST-name" type="text" name="user">
<input type="submit" value="提交">
</form>
上面代码就是一个表单,一共包含三个控件:一个 <label> 标签,一个文本输入框,一个提交按钮。其中,文本输入框的 name 属性是 user ,表示将向服务器发送一个键名为 user 的键值对,键值就是这个控件的 value 属性,等于用户输入的值。
用户在文本输入框里面,输入用户名,比如 foobar ,然后点击提交按钮,浏览器就会向服务器 https://example.com/api 发送一个 POST 请求,发送 user=foobar 这样一段数据。
<form> 有以下属性。
- action :服务器接收数据的 URL。
- name :表单的名称,应该在网页中是唯一的。注意,如果一个控件没有设置 name 属性,那么这个控件的值就不会作为键值对,向服务器发送。
注:还有些属性在这省略,关于以上属性信息更详细简绍请自行查找
-
<input> 标签:
<input> 标签用于在表单中创建输入字段,例如文本输入、密码输入、复选框等。对于 <input> 标签,安全性涉及到输入验证、输入长度限制和输入格式限制,以防止用户输入恶意数据或进行缓冲区溢出等攻击。
是一个行内元素,用来接收用户的输入。它是一个单独使用的标签,没有结束标志。
它有多种类型,取决于type属性的值,默认值是text,表示一个输入框。
<input>的属性非常多,有些属性是某个类型专用的,放在下文的“类型”部分介绍。这里介绍一些所有类型的共同属性。
- name:控件的名称,主要用于向服务器提交数据时,控件键值对的键名。注意,只有设置了name属性的控件,才会向服务器提交,不设置就不会提交。
- readonly:布尔属性,是否为只读。
- required:布尔属性,是否为必填。
- type:控件类型,详见下文。
- value:控件的值。
注:还有些属性在这省略,关于以上属性信息更详细简绍请自行查找
-
<a> 标签:
<a> 标签用于创建超链接,允许用户跳转到其他网页或资源。在网络安全中,恶意链接可能导致用户访问恶意网站,因此验证和过滤 <a> 标签的 href 属性非常重要,以防止钓鱼攻击和其他恶意行为。
-
<script> 标签:
<script> 标签用于包含客户端脚本,例如 JavaScript。恶意脚本可能会导致跨站脚本(XSS)攻击,因此在插入或接受用户输入的地方,应谨慎处理 <script> 标签和其内容,以避免安全漏洞。
-
<iframe> 标签:
<iframe> 标签用于嵌入其他网页或资源。但是,恶意的 iframe 可以用于点击劫持等攻击。对于 <iframe> 标签,应该注意源站点的信任性,并采取适当的安全措施,如添加 X-Frame-Options 标头,防止点击劫持攻击。
<iframe>标签生成一个指定区域,在该区域中嵌入其他网页。它是一个容器元素,如果浏览器不支持<iframe>,就会显示内部的子元素。
<iframe src="https://www.example.com"
width="100%" height="500" frameborder="0"
allowfullscreen sandbox>
<p><a href="https://www.example.com">点击打开嵌入页面</a></p>
</iframe>
上面的代码在当前网页嵌入`https://www.example.com`,显示区域的宽度是`100%`,高度是`500`像素。如果当前浏览器不支持`<iframe>`,则会显示一个链接,让用户点击。浏览器普遍支持`<iframe>`,所以内部的子元素可以不写。
注:属性在这省略,关于属性信息更详细简绍请自行查找
-
<meta> 标签:
<meta> 标签用于在 HTML 文档中提供元数据。其中包含的一些元数据,如字符集编码和内容安全策略 (Content Security Policy, CSP) 配置,对于确保文档的安全性至关重要。
-
<img> 标签:
<img> 标签用于在网页中嵌入图像。对于 <img> 标签,应注意验证和过滤 src 属性,以防止从不可信来源加载图片导致的安全问题。
- 对于 <img> 标签的验证和过滤 src 属性是非常重要的,因为从不可信来源加载图片可能导致以下安全问题:
- XSS(跨站脚本攻击): 恶意用户可能在 <img> 标签的 src 属性中插入恶意的代码。当其他用户访问包含这些恶意代码的页面时,浏览器会执行这些代码,导致跨站脚本攻击。攻击者可以窃取用户的登录凭据、会话信息,甚至在用户浏览器上执行任意恶意操作。
- URL欺骗: 恶意用户可能构造伪造的 URL 或使用相对路径来欺骗用户,让用户认为他们正在加载可信网站的图像,实际上却是加载了来自恶意网站的图像。这可能导致用户访问恶意站点,接受欺骗性内容或下载恶意文件。
- 为了避免上述安全问题,建议在使用 <img> 标签时采取以下安全措施:
- 验证 src 属性: 在服务器端或客户端对 <img> 标签的 src 属性进行验证,确保仅允许加载来自可信来源的图像。对于用户提供的任何输入,都应该进行合适的输入验证和过滤,防止恶意数据被插入到 src 属性中。
- 使用 HTTPS: 始终使用 HTTPS 协议加载图像,以确保图像传输是加密的,防止中间人攻击和数据窃取。
- 内容安全策略(CSP): 使用内容安全策略来限制允许加载的资源来源,包括图像。CSP 可以帮助防止恶意代码注入和执行,以及减轻 XSS 攻击的影响。
- 信任可信来源: 在加载图像时,确保只从可信的、已知的来源加载图像。不要加载来自未知或不受信任的源的图像,以防止 URL 欺骗和其他安全问题。
- HTTP 头安全设置: 使用适当的 HTTP 头设置,如 X-Content-Type-Options 和 Content-Security-Policy,来增强网页的安全性,防止恶意行为。
二、HTML 字符编码/HTML实体编码
-
字符的数字表示法
一般情况下,服务器向浏览器发送 HTML 网页文件时,会通过 HTTP 头信息,声明网页的编码方式。
网页可以使用不同语言的编码方式,但是最常用的编码是 UTF-8。UTF-8 编码是 Unicode 字符集的一种表达方式。这个字符集的设计目标是包含世界上的所有字符,目前已经收入了十多万个字符。每个字符有一个 Unicode 号码,称为码点(code point)。
HTML允许使用 Unicode 码点表示字符,浏览器会自动将码点转成对应的字符。
字符的码点表示法是&#N;(十进制,N代表码点)或者&#xN;(十六进制,N代表码点),浏览器会自动转换它们。
以下是一些常见的HTML数字编码示例:
- 小于号 "<": <
- 大于号 ">": >
- 和号 "&": &
- 空格字符(连续空格):
注意:HTML 标签本身不能使用码点表示,否则浏览器会认为这是所要显示的文本内容,而不是标签。比如,<p>一旦写成<p>或者<p>,浏览器就不再认为这是标签了,而会当作文本内容将其显示为<p>。
-
字符的实体表示法
数字表示法的不方便之处,在于必须知道每个字符的码点,很难记忆。为了能够快速输入,HTML 为一些特殊字符,规定了容易记忆的名字,允许通过名字来表示它们,这称为实体表示法(entity)。
实体的写法是&name;,其中的name是字符的名字。下面是其中一些特殊字符,及其对应的实体。
以下是一些常见的HTML实体编码示例:
- <:<
- >:>
- %:%
- 空格:
注意,上面最后一个特殊字符是空格,它也有对应的实体表示法。
字符的数字表示法和实体表示法,都可以表示正常情况无法输入的字符,逃脱了浏览器的限制,所以英语里面称为“escape”,中文翻译为“字符的转义”。
-
ASCII码
ASCII(American Standard Code for Information Interchange)是一种用于表示文本字符的编码标准。ASCII编码使用7位二进制数字(共128个不同的值)(1个字节)来表示字符,包括控制字符(如换行符和回车符)以及常见的英文字母、数字、标点符号和一些特殊符号。
注:具体ASCII表请自行查找
-
URL编码
URL编码(URL Encoding),也称为百分号编码(Percent Encoding),是一种在互联网传输中用于将特殊字符和非ASCII字符转换成特定格式的编码方式。
URL编码的规则是将每个字符转换成 % 加上两位十六进制数的形式。转换规则如下:
- 对于ASCII字符:除了字母、数字和一些特殊字符外,其余字符都需要进行编码。
- 对于非ASCII字符:使用UTF-8编码将字符转换成多个字节,然后将每个字节转换成 % 加上两位十六进制数的形式。
以下是一些常见字符的URL编码示例:
- 空格(空格在URL中通常编码为加号 "+" 或 "%20"),例如,"Hello World" 可以被编码为 "Hello+World" 或 "Hello%20World"。
- 斜杠 "/":"/" 在URL中被编码为 "%2F"。
- 问号 "?":"?" 在URL中被编码为 "%3F"。
- 等号 "=":"=" 在URL中被编码为 "%3D"。
-
Utf-8编码
UTF-8(Unicode Transformation Format - 8-bit)是一种变长字符编码,UTF-8编码的特点是使用1至4个字节来表示不同范围内的字符,从而实现对全球范围内所有字符的支持。
UTF-8编码的规则如下:
- 对于ASCII字符(码点范围:0x00 - 0x7F),UTF-8使用单个字节表示,与ASCII编码完全兼容。例如,英文字母、数字和常见的符号在UTF-8中都使用一个字节表示,与ASCII编码的相应字符相同。
- 对于Unicode字符的其他范围,UTF-8使用多个字节表示。其规则如下:
- 0x0080 - 0x07FF(128~2047) 范围字符使用两个字节表示。
- 0x0800 - 0xFFFF(2048~65535) 范围字符使用三个字节表示。
- 0x10000 - 0x10FFFF(65536~1114111) 范围字符使用四个字节表示。
三、DNS
DNS:域名解析服务器,把域名解析成IP地址
DNS(Domain Name System)解析过程是将域名转换为对应的IP地址的过程。当您在浏览器中输入一个网址时,浏览器需要将该域名解析为相应的IP地址,以便能够与服务器建立连接并获取网页内容。以下是DNS解析的简单过程:
- 浏览器缓存查询: 首先,浏览器会检查本地的DNS缓存,看是否已经有之前解析的记录。如果缓存中有对应的IP地址,浏览器将直接使用该IP地址完成解析过程,减少DNS查询的时间。
- 操作系统缓存查询: 如果在浏览器的缓存中未找到对应的IP地址,浏览器将向操作系统发起DNS查询请求。操作系统也会有自己的DNS缓存,检查是否有之前解析的记录。
- 本地DNS服务器查询: 如果在操作系统缓存中未找到对应的IP地址,操作系统将向本地DNS服务器发起查询请求。本地DNS服务器通常由Internet服务提供商(ISP)或网络管理员提供,它负责处理本地网络中的DNS解析请求。
- 根域名服务器查询: 如果本地DNS服务器在自己的缓存中未找到对应的IP地址,它将向根域名服务器发起查询请求。根域名服务器是DNS层次结构的最高级别,它知道所有顶级域名(如.com、.org、.net等)的IP地址。
- 顶级域名服务器查询: 根域名服务器将指示本地DNS服务器向对应的顶级域名服务器发起查询请求。例如,如果要查询的域名是example.com,则本地DNS服务器将联系.com顶级域名服务器。
- 权威域名服务器查询: 顶级域名服务器将指示本地DNS服务器向对应的权威域名服务器发起查询请求。权威域名服务器是负责管理特定域名的DNS记录的服务器。
- 返回IP地址: 权威域名服务器将包含与域名相关联的IP地址的DNS记录返回给本地DNS服务器。本地DNS服务器将缓存这个记录,并将IP地址返回给操作系统和浏览器。
- DNS缓存更新: 本地DNS服务器会将收到的IP地址缓存起来,以便将来的查询可以更快地进行解析。同样,操作系统和浏览器也会更新自己的DNS缓存。
- 建立连接: 现在,浏览器获得了域名对应的IP地址,它可以使用该IP地址与服务器建立连接,并获取所需的网页内容。
四、HTTPS
HTTPS(HyperText Transfer Protocol Secure)是一种通过加密传输数据的安全协议,用于保护在网络上传输的敏感信息。以下是HTTPS加密过程的简要步骤:
- 客户端请求: 客户端(通常是浏览器)向服务器发送HTTPS请求。该请求使用"https://"作为URL的前缀,指示客户端希望通过HTTPS与服务器进行通信。
- 服务器证书: 服务器收到客户端的HTTPS请求后,会向客户端发送服务器证书。服务器证书包含公共密钥、服务器的域名和证书颁发机构(CA)的签名,用于验证服务器的身份。
- 客户端验证: 客户端收到服务器证书后,会验证证书的有效性。验证包括检查证书是否由受信任的CA签名,是否过期以及是否与服务器域名匹配。如果证书验证失败,客户端会发出警告,提示用户存在潜在的安全风险。
- 生成会话密钥: 如果服务器证书有效并通过验证,客户端将使用服务器的公共密钥加密一个随机的会话密钥,并将其发送回服务器。这样,客户端和服务器都拥有了相同的会话密钥,用于后续通信的对称加密。
- 握手过程: 通过公共密钥加密和解密,客户端和服务器进行握手过程来确认彼此的能力和同意使用的加密算法。在此过程中,他们还协商了用于加密和解密通信的对称加密算法和其他相关参数。
- 数据传输: 一旦握手过程完成,客户端和服务器之间的数据传输将使用约定的对称加密算法进行加密和解密。这意味着在传输过程中,通过HTTPS传输的数据将以加密的形式在网络上传输,从而保护敏感信息免受窃听和篡改。
- 终止连接: 当客户端和服务器的通信结束时,他们可以选择终止连接或保持连接以进行后续的请求和响应。如果连接被终止,会话密钥将被丢弃,这样每个会话都会使用新的会话密钥,增加安全性。