防止XSS漏洞攻击常用解决方案

漏洞通用描述

跨站脚本攻击(Cross Site Scripting),简称XSS漏洞

该页面直接将用户在 HTML 页面中的输入(通常是参数值)加载到前端页面,没有预先加以清理。 如果脚本在响应页面中返回由 JavaScript 代码组成的输入,浏览器便可以执行此输入。 因此,有可能形成指向站点的若干链接,且其中一个参数包含恶意的 JavaScript 代码。 该代码将在站点上下文中(由用户浏览器)执行,这使得该代码可以直接访问用户当前cookie,继而使用各种方法发送到攻击者服务器,从而盗取用户账号。

任何存在输入/输出方法(包括GET与POST)的页面皆可能存在XSS漏洞,如留言回复、在线聊天、内容发布等。

攻击依照下列方式继续进行:攻击者诱惑合法用户单击攻击者生成的链接。 用户单击该链接时,便会生成对于 Web 站点的请求,其中的参数值含有恶意的 JavaScript 代码。 如果 Web 站点将这个参数值嵌入在响应的 HTML 页面中(这正是站点问题的本质所在),恶意代码便会在用户浏览器中运行。

常见修复方案

注: 修复时请不要只针对测试用例中的关键字进行屏蔽(如: 只过滤alert)

如果是 json 或 jsonp 接口出现XSS问题,请检查一下header头中的Content-type是否已设置为application/json,正常情况下Content-type为json的页面不会引起XSS攻击

XSS修复原理:

过滤用户输入的内容,检查用户输入的内容中是否有非法内容。如<>(尖括号)、"(引号)、 '(单引号)、%(百分比符号)、;(分号)、()(括号)、&(& 符号)、+(加号)等,如果参数为int类型,则严格限定只允许0-9的整型数字。

JAVA语言的业务 可以使用基础安全部开发的WAQ安全库来修复XSS漏洞

  1. HTML编码:WAQ.forXSS().filterHTML
  2. URL编码:WAQ.forXSS().filterURL
  3. Javascript转义 WAQ.forXSS().filterJS
  4. 富文本过滤 WAQ.forXSS().filterRichText

PHP语言,无富文本需求的业务 可以使用下面这些函数对xss漏洞的参数进行过滤

  1. htmlspecialchars() 函数,用于转义处理在页面上显示的文本。
  2. htmlentities() 函数,用于转义处理在页面上显示的文本。
  3. strip_tags() 函数,过滤掉输入、输出里面的恶意标签。
  4. header() 函数,使用header("Content-type:application/json"); 用于控制 json 数据的头部,不用于浏览。
  5. urlencode() 函数,用于输出处理字符型参数带入页面链接中。
  6. intval() 函数用于处理数值型参数输出页面中。

PHP语言、有富文本需求的业务

如要使用一些常用的 html 标签,以美化页面显示,如留言、小纸条。那么在这样的情况下,要采用白名单的方法使用合法的标签显示,过滤掉非法的字符。

Node.js语言的业务

使用node-validator,具体可参考nodejs官网手册

Python语言的业务

一般框架会自带一些XSS防御方法,Django 在模板输出时会默认对文本进行HTML实体编码,默认不会触发XSS问题,如果发生XSS请检查html模板变量输出处是否主动使用了safe filter。

未使用web框架可使用 cgi.escape() 对参数进行过滤

你可能感兴趣的:(xss漏洞,xss)