大部分的网站一般都有评论功能或留言功能,或类似可以让用户写东西的地方。 如果后台不经过处理,又把数据返回前端,这就会出问题了。网页解析器会把用户的信息也当成html代码给解析了。 如果用户写的是一些恶意的 js 脚本这是很危险的。专业术语叫:XSS 攻击
一、举个例子:假设后台和前台都没有对用户的信息,进行处理。我们输入如下的代码: 1 2 3 4 5 6 7 <script> var body= document.body; var img = document.createElement("img"); img.setAttribute('style','width:100%;height:100%;z-index:99999;position:fixed;top:0px;') img.src = "https://www.baidu.com/img/bd_logo1.png"; body.appendChild(img); </script>
整个页面被整个图片覆盖掉 如果是其他的恶意攻击,是可以入侵到你的服务器然后获取到shell 。 二、解决方法: 1、前端过滤 (a)、javascript 原生方法 1 2 3 4 5 6 7 8 9 10 11 12 //转义 元素的innerHTML内容即为转义后的字符 function htmlEncode ( str ) { var ele = document.createElement('span'); ele.appendChild( document.createTextNode( str ) ); return ele.innerHTML; } //解析 function htmlDecode ( str ) { var ele = document.createElement('span'); ele.innerHTML = str; return ele.textContent; }
(b)、JQuery 方法 1 2 3 4 5 6 7 function htmlEncodeJQ ( str ) { return $('<span/>').text( str ).html(); } function htmlDecodeJQ ( str ) { return $('<span/>').html( str ).text(); }
调用方法 1 2 3 var msg1= htmlEncodeJQ('<script>alert('test');</script>'); var msg1= htmlEncode('<script>alert('test');</script>'); //结果变成:<script>alert('test');</script>
2、后端过滤
我这里是JAVA 的,其他的另百度
(a)、java 一些框架自动工具类, 比如:org.springframework.web.util.HtmlUtils 1 2 3 4 5 6 7 8 public static void main(String[] args) { String content = "<script>alert('test');</script>"; System.out.println("content="+content); content = HtmlUtils.htmlEscape(content); System.out.println("content="+content); content = HtmlUtils.htmlUnescape(content); System.out.println("content="+content); }
但这样有个问题,就是它全部的html标签都不解析了。 可能这不是你想要的,你想要的是一部分解析,一部分不解析。好看下面。 (b)、自己用正则来完成你的需求
下面给你demo ,根据你自己的需求来改就好了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 package top.lrshuai.blog.util;import java.util.regex.Matcher;import java.util.regex.Pattern;public class HTMLUtils {public static String filterHTMLTag (String htmlStr) { String reg_html="<[^>]+>" ; Pattern pattern=Pattern.compile(reg_html,Pattern.CASE_INSENSITIVE); Matcher matcher=pattern.matcher(htmlStr); htmlStr=matcher.replaceAll("" ); return htmlStr; } public static String filterTagByName (String htmlStr,String tagName) { String reg_html="<" +tagName+"[^>]*?>[\\s\\S]*?<\\/" +tagName+">" ; Pattern pattern=Pattern.compile(reg_html,Pattern.CASE_INSENSITIVE); Matcher matcher=pattern.matcher(htmlStr); htmlStr=matcher.replaceAll("" ); return htmlStr; } public static String filterHTMLTagInStyle (String htmlStr) { String reg_html="style=('|\")(.*?)('|\")" ; Pattern pattern=Pattern.compile(reg_html,Pattern.CASE_INSENSITIVE); Matcher matcher=pattern.matcher(htmlStr); htmlStr=matcher.replaceAll("" ); return htmlStr; } public static String replayFace (String htmlStr) { String reg_html="\\[em_\\d{1,}\\]" ; Pattern pattern = Pattern.compile(reg_html,Pattern.CASE_INSENSITIVE); Matcher matcher=pattern.matcher(htmlStr); if (matcher.find()) { matcher.reset(); while (matcher.find()) { String num = matcher.group(0 ); String number=num.substring(num.lastIndexOf('_' )+1 , num.length()-1 ); htmlStr = htmlStr.replace(num, "<img src='/face/arclist/" +number+".gif' border='0' />" ); } } return htmlStr; } public static void main (String[] args) { String html = "<script>alert('test');</script><img src='/face/arclist/5.gif' border='0' /><div style='position:fixs;s'></div><style>body{color:#fff;}</style><Style>body{color:#fff;}</Style><STYLE>body{color:#fff;}</STYLE>" ; System.out.println("html=" +html); html = HTMLUtils.filterTagByName(html, "style" ); System.out.println("html=" +html); html = HTMLUtils.filterTagByName(html, "script" ); System.out.println("html=" +html); html = HTMLUtils.filterHTMLTagInStyle(html); System.out.println("html=" +html); } }
下班了,哪天有空再补充
您的打赏,是我创作的动力!不给钱?那我只能靠想象力充饥了。
打赏
微信支付
支付宝