怎样提防XSS和CSRF?

间隔上一次引见XSS与CSRF已过去了漫长了两个月,事变较忙,文章姗姗来迟。
小小回忆一下终究什么是XSS和CSRF:https://segmentfault.com/a/11… 《用大白话谈谈XSS与CSRF》。

那末,我们来谈谈怎样提防它。
CSRF依赖于XSS,防住XSS基础也就防住了CSRF让我们明白我们的目标,实在就是不让用户踏入XSS的坑,那我们有两个要领防备用户入坑,一个是对外部输入举行彻彻底底的敏感字符过滤,一个是在显现的时刻做一些特别处置惩罚不让敏感代码顺遂实行。
前者主要由前端与后端协力完成,后者的话一般就是由前端零丁去完成的。

理论上只需有输入数据进口的处所,XSS破绽就会存在,js代码能够由林林总总的形式注入到数据库中(明文或许编码),所以在中小项目中我们先明白一个认识即可,我们开辟人员要有平安处置惩罚的认识,不求百分百的过滤掉不法字符,然则基础的,罕见的过滤掉即可,剩下的就交给平安工程师去做吧。

中心思想:统统的统统外部泉源数据,毕竟经由我们服务端代码的过滤,才能让他展现到页面上,也就是说,统统外部数据都是不法的,肯定要做好过滤,尤其是WEB端。(毕竟种种js防不胜防)。
所以像以下这类直接把页面掌控权交给了用户的代码,是绝对不能写的:

<?php
$name = $_GET["name"];
$name = htmlspecialchars($name);
?>
<input type='text' value='<?php echo $name?>'>

下面的案例用世界上最好的言语来演示:

不法字符有两类,明文:<script>alert(‘我是xss,你有麻烦了’)</script>,如许的明文传到服务端,假如让他就这么入库的话,我们的数据库就被XSS注入了,所以我们须要对明文的很好过滤,htmlspecialchars后即可把script标签过滤成平安字符 <script> ,那末明文的能够简朴的就过滤掉了。

明文易档,编码难防,

编码:u0026u006cu0074u003bu0073u0063u0072u0069u0070u0074u0026u0067u0074u003bu0061u006cu0065u0072u0074u0028u0026u0023u0033u0039u003bu6211u662fu0078u0073u0073uff0cu4f60u6709u9ebbu70e6u4e86u0026u0023u0033u0039u003bu0029u0026u006cu0074u003bu002fu0073u0063u0072u0069u0070u0074u0026u0067u0074u003b

假如不怀好意的人不必明文,却用这类unicode体式格局,那末易如反掌就能够超出htmlspecialchars的戍守,然后入库,然后展现的时刻html编码会将这类unicode自动转回明文(也就是变成实在的注入代码),伤害就来了!

同比类推,既然unicode能够充任注入的东西,那末其他编码我置信也是能够的。所以在这里也强调一下只管将页面的字符编码设置为unicode(utf-8),然后我们一致处置惩罚unicode编码注入和明文注入的状况就好
以上注入代码只是简朴的注入并不会有本质伤害,然则假如是相似于document.cookie这类猎取隐私cookie,然后把这段cookie发送到外部服务器存储起来,那末在这段cookie的有用期内,我能够直接拿这份cookie去登录账号了!

怎样提防以上这些恐惧的事变呢?返来开首我说的,输入过滤,输出过滤:
看到了在 @月之领主LM 在他的问题中已总结了,那我就直接站在伟人的肩膀上吧!

PHP直接输出html的,能够采纳以下的要领举行过滤:

1.htmlspecialchars函数
2.htmlentities函数
3.HTMLPurifier.auto.php插件
4.RemoveXss函数(百度能够查到)

PHP输出到JS代码中,或许开辟Json API的,则须要前端在JS中举行过滤:

1.只管运用innerText(IE)和textContent(Firefox),也就是jQuery的text()来输出文本内容
2.必需要用innerHTML等等函数,则须要做相似php的htmlspecialchars的过滤(参照@eechen的答案)

别的的通用的补充性防备手腕

1.在输出html时,加上Content Security Policy的Http Header
(作用:能够防备页面被XSS进击时,嵌入第三方的剧本文件等)
(缺点:IE或低版本的浏览器能够不支持)
2.在设置Cookie时,加上HttpOnly参数
(作用:能够防备页面被XSS进击时,Cookie信息被偷取,可兼容至IE6)
(缺点:网站自身的JS代码也没法操纵Cookie,而且作用有限,只能保证Cookie的平安)
3.在开辟API时,磨练要求的Referer参数
(作用:能够在肯定程度上防备CSRF进击)
(缺点:IE或低版本的浏览器中,Referer参数能够被捏造)

固然,这一块的平安处置惩罚也只能处置惩罚冰山一角,我置信照样有其他体式格局能够举行xss注入进击的,然则实际上作为开辟人员我以为,我们只需阻拦了大部分罕见进击即可了。

一样平常开辟中须要带有平安认识,WEB端或许APP服务端都不信托外部的任何输入,任何!

参考文章 :

https://www.owasp.org/index.p…《XSS (Cross Site Scripting) Prevention Cheat Sheet 》

http://www.cnblogs.com/yangxi…《【前端平安】JavaScript防http挟制与XSS》
https://segmentfault.com/q/10…《PHP的防备XSS注入的最终解决方案【信息平安】【Hack】》

    原文作者:大菌说事
    原文地址: https://segmentfault.com/a/1190000007766732
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞