目录
全局属性(global attributes)----是所有元素都可以使用的属性,可以加在任意一个网页元素上面
2、限制&符 ---防止实体编码转义、把实体编码过滤了,没有&符实体编码就不成立
3、限制 \ ---因为Unicode编码一般 \u 、限制了 \ 则Unicode编码也转义不了
html5
网页元素的属性
网页元素的属性(attribute)可以定制元素的行为,不同的属性会导致元素有不同的行为、元素属性的写法是 HTML 标签内部的“键值对”
<html lang="en">
上面代码中,<html>
标签内部的键值对lang=“en”
,就称为html
元素的属性。属性名为lang
,属性值为en,此处的lang不区分大小写
全局属性(global attributes)----是所有元素都可以使用的属性,可以加在任意一个网页元素上面
常见的全局属性有:id、class、title、tabindex、accesskey、style、hidden、lang,dir、contenteditable、spellcheck、data-属性、事件处理属性
这里只对id、class做介绍
id----元素在网页内唯一标识符
<p id="p1"></p>
<p id="p2"></p>
<p id="p3"></p>
id的属性值必须全局唯一且属性的值不能包含空格
好处---便于在js中找到精准抓取元素
class---用来对网页元素进行分类
<p class="a"></p>
<p class="a"></p>
<p class="a1 a2 a3"></p>
第一个p和第二个是一类,class属性相同、
元素可以同时有多个 class,它们之间使用空格分隔
class是样式,定义一个样式可以重复使用
在js操作的时候抓取出来的是一个数组
tabindex
简单来说就是当你按下TAB的时候能不能选中这个元素(焦点在不在这个元素上)
<p tabindex="0"> --这段文字获得焦点
这样这段文字就可以获得焦点了
HTML字符编码/HTML实体编码
可以通过一些编码的形式来被html识别到
网页包含了大量的文字,浏览器必须知道这些文字的编码方法,才能把文字还原出来
字符的数字表示法:
字符的码点表示法是&#N;(十进制,N
代表码点)或者&#xN;(十六进制,N
代表码点)
这里是使用ASCII码,hello也可根据下面这个简单的推理出来(详细的可以查ASCII码表,常用的需要记忆)
<p>hello</p>
<p>hello</p> --十进制
<p>hello</p> --十六进制
Bin(二进制) Oct(八进制) Dec(十进制) Hex(十六进制) 缩写/字符 解释
0100 0001 0101 65 0x41 A 大写字母A
0110 0001 0141 97 0x61 a 小写字母a
字符的实体表示法:
HTML 为一些特殊字符,规定了容易记忆的名字,允许通过名字来表示它们,下面给大家列出几个常用的(详细的可以查阅资料)
<:<
>:>
":"
':'
空格:
html实体编码运用的例子:
这里是在img下输出的、GET是一个输入
replace在这把数组里的字符全都替换成空了,在输入的时候替换了
1、( )括号 --- 为了让xss漏洞不执行
这里可以看到在alert弹窗下,没有了括号便无法执行、
而 ` ` 可以绕过括号执行
2、限制&符 ---防止实体编码转义、把实体编码过滤了,没有&符实体编码就不成立
3、限制 \ ---因为Unicode编码一般 \u 、限制了 \ 则Unicode编码也转义不了
下图\u0061\u006c…………其实就是alert弹窗的转义,限制了 \ 则也无法转义
上面写了两个 \\ 是为了防止转义,写了两个再次转义将其变成了普通字符
4、限制大小于号
<script> ---可以正常执行
script ---限制了大小于号可见这是执行不了的
5、限制 ' (单引号) ---不让英文执行
alert(1) ---数字可以不用' '(单引号)
alert('abc') ---英文的时候就需要用' ' (单引号)
这里就把常见的能想到的都过滤掉了(实体编码、Unicode编码、<>、' '、()),这样要输出的东西是几乎很难很难成功的
img标签
img标签起到一个加载图片的一个作用(可以用相对路径或者绝对路径)
而里面有一个onerror的一个函数(是js里的一个函数),当前面加载出错的时候就自动出发后面的一个函数,例如下面,img写了一个没有的“1”,则加载错误后将自动触发后面的弹窗
img标签可以通过onerror触发xss漏洞,有一定危险性(危险性来自于img后面的onerror)
<img src="1" onerror=alert(1) alt="">
链接标签
允许用户在页面上,从一个网址跳转到另一个网址,从而把所有资源联系在一起
a
链接通过<a>
标签表示,用户点击后,浏览器会跳转到指定的网址。
href
href
属性给出链接指向的网址
支持js函数
跳转了,也弹窗了
svg
用于画图
但是他onload属性是支持js的,可以用于触发弹窗
<script>
还有下面一些其他属性,大部分跟 JavaScript 语言有关,可以参考相关的 JavaScript 教程。
async:该属性指定 JavaScript 代码为异步执行,不是造成阻塞效果,JavaScript 代码默认是同步执行。
defer:该属性指定 JavaScript 代码不是立即执行,而是页面解析完成后执行。
crossorigin:如果采用这个属性,就会采用跨域的方式加载外部脚本,即 HTTP 请求的头信息会加上origin字段。
integrity:给出外部脚本的哈希值,防止脚本被篡改。只有哈希值相符的外部脚本,才会执行。
nonce:一个密码随机数,由服务器在 HTTP 头信息里面给出,每次加载脚本都不一样。它相当于给出了内嵌脚本的白名单,只有在白名单内的脚本才能执行。
referrerpolicy:HTTP 请求的Referer字段的处理方法
网址的组成部分
https://www.example.com:80/path/to/myfile.html?key1=value1&key2=value2#anchor
URL 字符转义的方法
在这些字符的十六进制 ASCII 码前面加上百分号(%
)。下面是这18个字符及其转义形式
!
:%21
#
:%23
$
:%24
&
:%26
'
:%27
(
:%28
)
:%29
*
:%2A
+
:%2B
,
:%2C
/
:%2F
:
:%3A
;
:%3B
=
:%3D
?
:%3F
@
:%40
[
:%5B
]
:%5D
举例来说,有一个网页的 URL 是foo?bar.html
,即文件里面包含一个问号,那么需要写成foo%3Fbar.html
。
URL 的合法字符,其实也可以采用这种转义方法,但是不建议使用。比如,字母a
的十六进制 ASCII 码是61
,转义形式后就是%61
。因此,www.apple.com
又可以写成www.%61pple.com
,浏览器一样识别。
值得注意的是,空格的转义形式是%20
。对于那些包含空格的文件名,这个转义是必须的
https:http + tls / ssl
dns:www.example.com
对于网络方面的ping、我们发现同样是ping www.baidu.com的时候两个图的ttl值是不一样的,
首先学习过hcia知识的我们知道ttl值是Time To Live(生存时间)值,最大为255,每经过一个路由器将-1,到0后则自动丢弃,
window主机的ttl值一般为128
Linux主机的ttl值一般为64
Unix主机的ttl值一般为255
而下图却出现了128、难道百度服务器是window?还是百度服务器修改了ttl值?还是ttl值骗人了?如果说百度服务器是window,而ttl是128,那就是没有经过路由器,那百度服务器就架设在我们身边?
那当然不是上面的说法,我们也知道现在的服务器基本都是Linux,而基本没有使用window架设的服务器,百度也没有修改,没有骗人,而是因为我们的上网环境不用,第一张图是使用虚拟机ping的百度,我们的上网形式是nat,所以我们在ping百度的时候真正的是虚拟机找的我们的物理机(主机),我们的物理机去ping的百度,显示ttl=128是找的我们的物理机,我们的物理机是window、ttl是128
dns的工作原理
域名服务器dns几个记录类型
A:地址记录、将域名指向一个ip地址
NS:域名服务器记录,返回保存下一级域名信息的服务器地址,只能是域名地址,不能是ip地址
MX:邮件记录,返回接收电子邮件的服务器地址
CNMAE:规范名记录,也可以叫做是别名记录,用于将一个域名映射到另一个域名
为了清晰dns的查询过程,在网上找了一张图
递归查询和迭代查询
一、主机向本地域名服务器的查询一般都是采用递归查询
二、本地域名服务器向根域名服务器的查询的迭代查询
用dig解析一下百度就可以看到A记录,CNAME了
[root@localhost ~]# dig www.baidu.com
dns分级查询过程
[root@localhost ~]# dig +trace www.baidu.com
这里看到首先解析的是根域服务器
然后到com
最后baidu.com
然后baidu把解析的结果发送回本地
根域找com;com找baidu;baidu把解析结果发送给本地
谁来解析com呢
使用dig ns com可以看到这些会解析com
同样的道理,我们可以看看谁来解析cn、
本地的dns缓存查询方法
win+r输入cmd后
ipconfig /displaydns
请求路径:path/to/myfile.html
GET传参的一个参数:key1=value1
想要给后端传一个参数,用GET方式传参必须以地址栏的方式传输,host是form表单的方式传输
GET就必须写出key=value
这样就接到了,前端的key传什么,后端接什么
https原理--RSA密钥协商算法
HTTP 由于是明文传输,所谓的明文,就是说客户端与服务端通信的信息都是肉眼可见的,随意使用一个抓包工具都可以截获通信的内容。
http安全上存在以下三个风险
窃听风险:比如通信链路上可以获取通信内容,用户号容易没
篡改风险:比如强制植入垃圾广告,视觉污染
冒充风险:比如冒充淘宝网站,容易把用户的前骗了
https在http与tcp层之间加入了tls协议
以加密的方式来传输必须解决的问题
1、谁来加密 加密密钥
2、加密密钥如何从客户端安全传输到服务端
3、客户端如何识别服务端的合法性
4、传输信息如何高效进行
有了 TLS 协议,能保证 HTTP 通信是安全的了,那么在进行 HTTP 通信前,需要先进行 TLS 握手
TLS握手过程
让我们来抓包看看、以www.weibo.com来举例子
我们通过ping www.weibo.com 得到了微博的ip地址,然后打开wireshark,并在网页上访问微博
然后在wireshark里进行过滤找到49.7.37.76,可以找到一个TLSv1.2(tls版本1.2)的包
clientHello包---TLS的第一次握手
点进去我们可以看到这是一个tls的包
里面有tls的版本(Version)
随机数(Random)
密码套件
ServerHello包---TLS的第二次握手
里面也同样有版本号、密码套件,密码套件选择RSA(非对称加密) AES (对称加密)密钥
第二次握手选定了密码套件
密码摘要(哈希摘要算法):SHA256 另一种哈希摘要算法是MD5
md5加密算法:下图可以清晰的看到,md5加密和解密(只要密码足够复杂,就基本解密不了)
这种比较简单的密码就直接解密了,足够复杂就基本不能逆向解密了,比较安全
md5可以防止篡改、
可以比对前后的哈希数来看出数据有没有被篡改
我们创建了了一个aaa.txt,看到一个哈希值
[root@localhost ~]# md5sum aaa.txt
我们现在来对他进行修改
可以清晰的发现,我们篡改过后,两次哈希值已经完全不一样了,我们只需要把官方给的哈希值和现在的稍微进行比对,便可以知道数据有没有被篡改
server发完以后还会发一个证书(涉及到合法性的校验)
证书--验证服务端的合法性(他把公钥发给你了)
签名
私钥加密,公钥解密(私加公解叫签名)
加密
公钥加密,私钥解密(公加私解叫加密)
证书签名及客户端校验过程
1、用Hash把蓝色部分的经过Hash算法和CA私钥的加密签名(橙色部分)给客户端了
2、客户端拿到以后首先把蓝色部分内容用相同的Hash算法(前两步定好的密码套件)进行一次加密得到绿色部分的Hash Value H1
3、客户端通过CA公钥解密把CA签名的重新解密,得到了粉色部分的Hash Value H2
4、对比H1和H2,如果H1与H2不一样,那么直接通信结束,服务端已经被篡改,如果H1与H2相同,则证明了服务端具有合法性 ----解决了如何保证服务端合法性的问题
RSA密钥协商握手过程
上述已经讲述了校验证书的一些过程了,校验证书没问题过后,服务端就把公钥给取出来了
然后客户端又生成了一个密文:pre-master
客户端随机数+服务器随机数+pre-master最后算出一个会话密钥
这时候服务端还少一个pre-master,这时候直接用服务器的公钥进行加密,传递过去,因为任何人都没有服务器的私钥,没有办法进行篡改或查看
然后使用服务器的私钥解密把pre-master取出来,然后两边的三个元素就一致了
TLS的第三次握手
至此,客户端和服务端双方都共享了三个随机数,分别是 Client Random、Server Random、pre-master
双方根据已经得到的三个随机数 ,会算出一个会话密钥,这个会话密钥就是最终对称加密的密钥了,这就是TLS的第三次握手
这里面一共涉及到了:
1、签名 ---为了验证服务端的合法性
2、随机数的传递 ---算出会话密钥
算出会话密钥之后就开始了使用这一个密钥进行正常通信了
到这里https原理RSA密钥协商算法就已经差不多结束了下面来讲讲RSA算法的缺陷
RSA算法的缺陷
使用 RSA 密钥协商算法的最大问题是不支持前向保密。因为客户端传递随机数(用于生成对称加密密钥的条件之一)给服务端时使用的是公钥加密的,服务端收到后,会用私钥解密得到随机数。所以一旦服务端的私钥泄漏了,过去被第三方截获的所有 TLS 通讯密文都会被破解
于是就有了DH密钥协商算法,DH密钥协商算法跟RSA差不多,但区别在于DH 密钥交换过程中,即使第三方截获了 TLS 握手阶段传递的公钥,在不知道的私钥的情况下,也是无法计算出密钥的,而且每一次对称加密密钥都是实时生成的,实现前向保密
由于DH密钥协商算法每一次对称加密的密钥都是实时生成的,所以效率比较低下,所以并没有广泛使用
后面出现了 ECDHE 密钥协商算法,我们现在大多数网站使用的正是 ECDHE 密钥协商算法
还是以上面抓包的例子
可以看到确实是ECDHE密钥协商算法
GET和POST传参的区别
GET传参在url可以看到,所以不安全,我们来试一试
这里看到是用的GET传参,跟上面说的一样,传什么后端就接什么
我们可以看到他把我们传递的数据就先是在了url栏里了
如果使用POST传参
先改成post
然后后头也需要改成POST
可见url里没有出现我们传递的数据
状态码
Status Code
我们在c.php中GET、POST跳转都接收一下
301
我们也可以清楚的看到301跳转POST传参变成了GET传参了,方法变了
302
我们可以看到301和302是没有明显的变化的方法也是从POST转成了GET
但301会缓存,而302确实临时重定向,是不缓存的
303
我们看到302和303其实并没有很大的区别,也是改变了方法,也是不缓存的(临时重定向)
304
我们发现使用304的时候根本没有进行跳转,所以我们可以知道304不进行跳转,只使用缓存,只是告诉浏览器,资源没有修改,使用缓存就好了,并且不会返回任何相应主体,因此304并不跳
307
307属于临时重定向,我们可以看到POST还是POST,没有改变方法
308
我们可以看到307和308区别也不大,区别在于一个可以缓存(永久重定向)一个不缓存(临时重定向),307和308都可以方法保持
状态码总结
缓存(永久重定向) | 不缓存(临时重定向) | |
转GET | 301 | 302、303 |
方法保持 | 308 | 307 |
永久重定向
浏览器客户端会缓存此次重定向结果,下次如果有则直接从缓存读取,我们切换域名,将所有老域名的流量转入新域名,可以永久重定向
临时重定向
浏览器不会缓存,服务器临时升级,会使用临时重定向
方法保持
方法保持的意思是原请求和重定向的请求是否使用相同的方法,例如:POST提交一个表单,如果是301重定向的话,重定向的请求会转为GET重新提交,如果是308则会保持原来的POST请求不变
结论:
1、3xx开头的HTTP状态码都表示重定向的响应
2、301、308是永久重定向、302、303、307是临时重定向
302常用于前后台登录
502
网关错误,后端服务器tomcat没有起来
504
网关超时,一般计算机中超时就是配置错了,一般指nginx反向代理服务器时,所连接的服务器tomcat无响应导致的
从网络的角度,502已经与后端进行了连接,但超时
504与后端连接未建立,超时