个人随笔
目录
Web开发富文本安全问题解决办法
2021-09-24 11:34:34

背景

Web开发,表单提交,不可避免的需要接收用户的输入,用户可能会输入一些js脚本导致XSS攻击等安全问题,那怎么解决呢?

方案1:黑名单法

在过滤器中拦截常用的危险字符,比如SCRIPT、ALERT等,如果有这些字符就进行过滤或者返回提示非法操作。

存在问题:WEB攻击漏洞多种多样,可能用户用的是img的属性,或者其他你完全没有考虑到的标签和格式,比如

  1. <p onclick=alert(1)>

那么你就要拦截onclick,但是用户可能会换成

  1. <p onmouseover=alert(1)>

那么你又要去拦截onmouseover,用户可能又会换其它的触发方式,所以这种方法不可取,那有人可能会说,直接拦截<,>就可以了吧,是可以,但是我们富文本肯定会带有一些html标签的,比如

  1. <p>
  2. <span>
  3. <pre>

等等,这些是需要放行的,所以直接一棒子打死也不可以。

方案2:黑名单+白名单法

我们先直接用黑名单一棒子打死拦截script,alert,<,>,’,”等字符,这样,所有有js可能漏洞的内容都将报错,然后我们再用白名单放行富文本中需要可以提交的内容,比如

  1. <span>|</span>|<p>|</p>|<br/>|<strong>|</strong>|<em>|</em>|<li>|</li>|<ol>|</ol>

上面这些标签,我们的富文本不仅仅上面那些标签,还有颜色背景颜色等相关属性,那么我们可以再加一些放行的规则,比如

  1. style="(.*?)"

这样后续如果有新的要放行的属性,如果经过判断该属性不涉及安全,加上即可。

伪代码如下

  1. String value = "<p style=\"\" onclick=alert>";
  2. String attribute = "style=\"(.*?)\"|href=\"(.*?)\"";
  3. String label = "<span>|</span>|<p>|</p>|<br/>|<strong>|</strong>|<em>|</em>|<li>|</li>|<ol>|</ol>|<a>|</a>";
  4. //1、判断该属性是否是富文本
  5. if(是富文本){
  6. //2、去掉白名单属性
  7. value = value.replaceAll(attribute,"");
  8. //3、去除空格
  9. value = value.replaceAll(" ","");
  10. //4、去除标签
  11. value = value.replaceAll(label,"");
  12. }
  13. //5、检查黑名单
  14. if(check(value)){
  15. return "有特殊字符,非法操作";
  16. }
 27

啊!这个可能是世界上最丑的留言输入框功能~


当然,也是最丑的留言列表

有疑问发邮件到 : suibibk@qq.com 侵权立删
Copyright : 个人随笔   备案号 : 粤ICP备18099399号