html注入

转自: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 {

       '<':'&lt;','>':'&gt;','&':'&amp;','"':'&quot;'

        }[c];

});

}


作者:壁花girl
来源:CSDN
原文:https://blog.csdn.net/qq_34357835/article/details/78601201
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值