一、浅谈CSRF 攻击
其原理是攻击者构造网站后台某个功能接口的请求地址,诱导用户去点击或者用特殊方法让该请求地址自动加载。即https://xxxx.com/gift/send?target=someone&giftId=ab231
用户在登录状态下,就能给名为someone
的用户赠送礼品ab231
不过有没有一种办法让用户只要看到即使不点击该网站也能自动送礼物给用户?
可以利用图片标签可添加链接属性的特征,将该url加入src=""里实现这种诱导,即:
<img src="https://xxxx.com/gift/send?target=someone&giftId=ab231" alt="">
但是礼物虽然小,但赠送都是有历史记录的,用户查看历史记录肯定会起疑心,能不能帮用户删除这条赠送记录呢?经过测试,发现删除赠送记录的接口地址:https://xxxx.com/gift/deleteRecord
。其中,接口类型为post
,请求参数为{ giftId:”ab231″}
构造一个可触发该删除赠送记录接口地址的表单页面
<form action = "https://xxxx.com/gift/deleteRecord"
id="form" method="post"
target="hiddenIframe">
</form>
其中,用户请求的网址为:https://xxxx.com/gift/deleteRecord
这个请求被服务端接收后,会被误以为是用户合法的操作。对于 GET 形式的接口地址可轻易被攻击,对于POST形式的接口地址也不能保证百分百安全,攻击者可诱导用户进入带 Form 表单可用POST方式提交参数的页面。
设置以下代码触发跳转原始首页功能,
<script>
document.getElementById('form').submit();
location.href = "http://xxxx.com";
</script>
即跳转到http://xxxx.com
,这样用户既在不知情的情况下赠送了礼品,又在不知情的情况下删除了赠送记录。
二、题外话
type=hidden
隐藏域的作用,结合 CSRF 攻击来说明。
type=hidden
隐藏域,作为校验该用户信息的一个隐藏值(判断标准)。当用户打开页面后是看不见type=hidden
相应的值,填写用户信息之后点击提交时,用户信息的数据(包括type=hidden
值)随即提交后台,打开后台则会展示代码type=hidden
所写的相应元素属性值。后台校验type=hidden
相应值如果是正确,即用户提交为安全。
埋点(保护的参数)——浏览器提交后台有该参数作为校验标准参考——若显示错值或无值,服务器也将不承认所提交的数据;若为正确值,则说明该用户获取权限,即为合法用户,可防止CSRF攻击
如图所示:二、XSS攻击
XSS攻击需要注意的:
- 所有用户输入的地方都不安全(任何数据不允许放在页面中任意设置)
- 所有展示用户输入的地方都不安全
- js 里不要用 eval(即把一个字符串在全局环境中当做js运行)
- 不要用 innerHTML
如何构造一个xss攻击
js代码一旦执行会导致cookie的产生,所以只要用户提交的信息变成html去运行,就会造成XSS攻击
假设需要将一些评论进行渲染,那么可以创建一个dom节点,通过dom节点中的innerText将用户输入的信息提交上去,这样一来任何提交信息都会作为html展示在页面上,安全性大大提交
用eval方式解析服务器传来的json数据
三、https
1、还记得提交表单中涉及到的post和get的提交方式吗?
但从安全性上,只要是http请求都不安全
2、数据安全性体现在几个方面:
- 我发的数据,不该看的人看不懂
- 我发的数据,不该看的人不能伪造或者修改(修改后接收方可察觉)
- 我发的数据,过期之后不该看的人不能偷偷拿过来继续用
3、https如何保证数据传输的安全?
几种数据加密的方式:
- 对称加密 : 加密和解密数据使用同一个密钥。这种加密方式的优点是速度很快,常见对称加密的算法有 AES;
- 非对称加密: 加密和解密使用不同的密钥,叫公钥和私钥。数据用公钥加密后必须用私钥解密,数据用私钥加密后必须用公钥解密。一般来说私钥自己保留好,把公钥公开给别人,让别人拿自己的公钥加密数据后发给自己,这样只有自己才能解密。 这种加密方式的特点是速度慢,CUP 开销大,常见非对称加密算法有 RSA;
- Hash: hash 是把任意长度数据经过处理变成一个长度固定唯一的字符串(如将这篇文章也可加密成一个字符串),但任何人拿到这个字符串无法反向解密成原始数据(解开你就是密码学专家了),Hash 常用来验证数据的完整性。常见 Hash 算法有 MD5(已经不安全了)、SHA1、SHA256
比如将登录注册的信息通过Hash算法中的SHA1、SHA256进行加密保存在数据库中
4、https原理
浏览器将用户信息加密(AES加密),此时如果只是浏览器和服务器进行数据交流,则可以通过对称加密的形式。服务器发送公钥,浏览器得到公钥后会生成一个对称加密AES的密钥,浏览器加密后的密钥发给服务器,收到后用服务器的私钥解密,得到浏览器和服务器约定好的对称加密密钥,然后二者用这个只有二者知道的对称密钥加密数据进行交流
假如中间人提供假公钥对浏览器进行攻击。
此时为了中间人破坏,可以采用服务器的公钥信息和公证人背书做成一个信用证书,通过hash(sh256)处理之后,用公证人的私钥进行加密,生成一个信用证书。
浏览器得到信用证书后,先用公证人的公钥对证书上被公证人私钥加密后的字段进行解密,得到元素数据的 Hash。浏览器 再对元素数据进行 Hash和刚刚解密的 Hash 进行比对。如果比对成功表示证书上的信息无误,且是由公证人担保的。这时候浏览器确信证书上的公钥就是服务器的。
即申请https的时候就需要进行信息补充(公司名称、域名),申请后会给你生成证书
若不知道公证人的公钥申请https则造成无人担保的局面,即用https打开页面时会造成一个不安全的私密链接。如12306网站就是实例。