转自:https://blog.csdn.net/qq_32923745/article/details/78286335
https://blog.csdn.net/qq_34357835/article/details/78601201
大部分的网站一般都有评论功能或留言功能,或类似可以让用户写东西的地方。
如果后台不经过处理,又把数据返回前端,这就会出问题了。网页解析器会把用户的信息也当成html代码给解析了。
如果用户写的是一些恶意的 js 脚本这是很危险的。专业术语叫:XSS 攻击
一、举个例子:假设后台和前台都没有对用户的信息,进行处理。我们输入如下的代码:
1
2
3
4
5
6
7
页面就会变成这样的
整个页面被整个图片覆盖掉
如果是其他的恶意攻击,是可以入侵到你的服务器然后获取到shell 。
二、解决方法:
1、前端过滤
(a)、javascript 原生方法
//转义 元素的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;
}
1
2
3
4
5
6
7
8
9
10
11
12
(b)、JQuery 方法
function htmlEncodeJQ ( str ) {
return $(’’).text( str ).html();
}
function htmlDecodeJQ ( str ) {
return $(’’).html( str ).text();
}
1
2
3
4
5
6
7
调用方法
var msg1= htmlEncodeJQ(‘’);
//结果变成:<script>alert(‘test’);</script>
1
2
3
2、后端过滤
我这里是JAVA 的,其他的另百度
(a)、java 一些框架自动工具类,
比如:org.springframework.web.util.HtmlUtils
public static void main(String[] args) {
String content = “”;
System.out.println(“content=”+content);
content = HtmlUtils.htmlEscape(content);
System.out.println(“content=”+content);
content = HtmlUtils.htmlUnescape(content);
System.out.println(“content=”+content);
}
1
2
3
4
5
6
7
8
但这样有个问题,就是它全部的html标签都不解析了。
可能这不是你想要的,你想要的是一部分解析,一部分不解析。好看下面。
(b)、自己用正则来完成你的需求
下面给你demo ,根据你自己的需求来改就好了。
package top.lrshuai.blog.util;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
*
- @author lrshuai
- @since 2017-10-13
- @version 0.0.1
/
public class HTMLUtils {
/* - 过滤所有HTML 标签
- @param htmlStr
- @return
*/
public static String filterHTMLTag(String htmlStr) {
//定义HTML标签的正则表达式
String reg_html="<[^>]+>";
Pattern pattern=Pattern.compile(reg_html,Pattern.CASE_INSENSITIVE);
Matcher matcher=pattern.matcher(htmlStr);
htmlStr=matcher.replaceAll(""); //过滤html标签
return htmlStr;
}
/**
- 过滤标签,通过标签名
- @param htmlStr
- @param tagName
- @return
/
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(""); //过滤html标签
return htmlStr;
}
/**
- 过滤标签上的 style 样式
- @param htmlStr
- @return
/
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(""); //过滤html标签
return htmlStr;
}
/**
-
替换表情
-
@param htmlStr
-
@param tagName
-
@return
*/
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, “”);
}
}
return htmlStr;
}public static void main(String[] args) {
”;
String html = “
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);
}
}
下班了,哪天有空再补充
参考自: http://blog.csdn.net/taoerchun/article/details/50778799
正文到此结束,谢谢观看,觉得有用,点个赞可好!!!
博客:http://www.lrshuai.top/blog
在编写代码中,如何防止html注入?我们可以把输入的html便签转换为空字符串
var content=$("#content").val();
//防止html注入,标签转空字符串
var content1=content.replace(/<[^<>]+?>/g,’’);
也可以把html标签直接转码
//HTML标签转码
function html2Escape(sHtml) {
return sHtml.replace(/[<>&"]/g,function©{
return {
'<':'<','>':'>','&':'&','"':'"'
}[c];
});
}
作者:壁花girl
来源:CSDN
原文:https://blog.csdn.net/qq_34357835/article/details/78601201
版权声明:本文为博主原创文章,转载请附上博文链接!