【浏览器原理】XSS攻击和CSRF攻击
XSS
- XSS(Cross-Site Script),跨站脚本攻击。XSS 是为了与CSS区分开。
- XSS 指的是一种代码注入攻击,攻击者通过各种方式在网站的
HTML文件中或者DOM中注入恶意脚本。假若网站没有对恶意代码进行过滤,恶意代码就会与正常的代码混合在一起,而浏览器无法分辨哪些代码是可信,从而导致了恶意代码的运行,也就形成了XSS攻击。
XSS 存在的原因
- XSS存在的根本原因是因为网站没有对URL中的参数或者用户提交输入的地方没有做充分的过滤,因此导致有一些不合法的参数或者输入内容能到达我们的Web服务器,最后用户访问网站的时候就有可能把不合法的代码重新拉回来执行一遍,进而导致了XSS攻击
XSS攻击的危害
假如我们的网站被攻击者注入了恶意脚本,这些恶意脚本可以对我们的网站做些什么:
- 窃取页面数据,如用户的
cookie等。而用户的cookie被窃取之后,攻击者可以在其他电脑上模拟用户的登录状态,进而威胁到用户的隐私安全。 - 进行DDOS攻击,不断发送一些合理的请求,去占用服务器的资源,从而使用户无法正常使用服务器。
- 在我们页面内形成浮窗,严重影响用户体验。
- 通过修改 DOM 来破坏页面结构。
- 监听用户的行为,例如使用
addEventListener来监听用户键盘事件。
恶意脚本的注入
XSS 攻击是如何产生的呢,一般的 XSS 攻击有三种形式
-
反射型XSS攻击(非持久形)
- 反射型XSS攻击一般是攻击者通过特定手法,诱使用户去访问一个包含恶意代码的URL,当受害者点击这些专门设计的链接的时候,恶意代码会直接在受害者主机上的浏览器执行。此类XSS攻击通常出现在网站的搜索栏、用户登录口等地方,常用来窃取客户端Cookies或进行钓鱼欺骗。
-
存储型XSS攻击(持久形)
- 攻击者事先将恶意代码上传或者储存到漏洞服务器中,只要受害者浏览包含此恶意代码的页面就会执行恶意代码。这意味着只要访问了这个页面的访客,都有可能会执行这段恶意脚本,因此存储型XSS攻击的危害会更大。此类攻击一般出现在网站留言、评论、博客日志等交互处,恶意脚本存储到客户端或者服务端的数据库中。
-
DOM-base攻击
- 客户端的脚本程序可以动态地检查和修改页面内容,而不依赖于服务器端的数据。例如客户端从URL中提取数据并在本地执行,如果用户在客户端输入的数据包含了恶意的JavaScript脚本,而这些脚本没有经过适当的过滤或者消毒,那么应用程序就可能受到DOM-based型XSS攻击。
XSS的防范
-
对输入(包括URL参数)进行过滤,对动态输出展示的进行编码让恶意脚本无法在浏览器中执行,把Cookie设置成http-only
-
输入处理
- 用户输入、URL参数、POST请求参数、Ajax
- 黑名单、白名单过滤
-
输出处理
-
对所有动态输出的代码进行转义
- 例如 < 转义成 <
-
-
Cookie 设置为http-only
- 使JS脚本无法读取到cookie
-