php富文本中防止xss,允许用户做富文本编辑的站点要怎么防 XSS 呢

4

2019-03-12 10:26:10 +08:00

参考下

```java

// 预编译 XSS 过滤正则表达式

private static List xssPatterns = ListUtils.newArrayList(

Pattern.compile("(|))|(\\s*(script|link|style|iframe)\\s*>)", Pattern.CASE_INSENSITIVE),

Pattern.compile("\\s*(href|src)\\s*=\\s*(\"\\s*(javascript|vbscript):[^\"]+\"|'\\s*(javascript|vbscript):[^']+'|(javascript|vbscript):[^\\s]+)\\s*(?=>)", Pattern.CASE_INSENSITIVE),

Pattern.compile("\\s*on[a-z]+\\s*=\\s*(\"[^\"]+\"|'[^']+'|[^\\s]+)\\s*(?=>)", Pattern.CASE_INSENSITIVE),

Pattern.compile("(eval\\((.*?)\\)|xpression\\((.*?)\\))", Pattern.CASE_INSENSITIVE)

);

/**

* XSS 非法字符过滤,内容以开头的用以下规则(保留标签)

* @author ThinkGem

*/

public static String xssFilter(String text) {

String oriValue = StringUtils.trim(text);

if (text != null){

String value = oriValue;

for (Pattern pattern : xssPatterns) {

Matcher matcher = pattern.matcher(value);

if (matcher.find()) {

value = matcher.replaceAll(StringUtils.EMPTY);

}

}

// 如果开始不是 HTML,XML,JOSN 格式,则再进行 HTML 的 "、 转码。

if (!StringUtils.startsWithIgnoreCase(value, "") // HTML

&& !StringUtils.startsWithIgnoreCase(value, "<?xml ") // XML

&& !StringUtils.contains(value, "id=\"FormHtml\"") // JFlow

&& !(StringUtils.startsWith(value, "{") && StringUtils.endsWith(value, "}")) // JSON Object

&& !(StringUtils.startsWith(value, "[") && StringUtils.endsWith(value, "]")) // JSON Array

){

StringBuilder sb = new StringBuilder();

for (int i = 0; i < value.length(); i++) {

char c = value.charAt(i);

switch (c) {

case '>':

sb.append(">");

break;

case '

sb.append("<");

break;

case '\'':

sb.append("'");

break;

case '\"':

sb.append(""");

break;

// case '&':

// sb.append("&");

// break;

// case '#':

// sb.append("#");

// break;

default:

sb.append(c);

break;

}

}

value = sb.toString();

}

if (logger.isInfoEnabled() && !value.equals(oriValue)){

logger.info("xssFilter: {} <=<=<= {}", value, text);

}

return value;

}

return null;

}

// 预编译 SQL 过滤正则表达式

private static Pattern sqlPattern = Pattern.compile("(?:')|(?:--)|(/\\*(?:.|[\\n\\r])*?\\*/)|(\\b(select|update|and|or|delete|insert|trancate|char|into|substr|ascii|declare|exec|count|master|into|drop|execute)\\b)", Pattern.CASE_INSENSITIVE);

/**

* SQL 过滤,防止注入,传入参数输入有 select 相关代码,替换空。

* @author ThinkGem

*/

public static String sqlFilter(String text){

if (text != null){

String value = text;

Matcher matcher = sqlPattern.matcher(text);

if (matcher.find()) {

value = matcher.replaceAll(StringUtils.EMPTY);

}

if (logger.isWarnEnabled() && !value.equals(text)){

logger.info("sqlFilter: {} <=<=<= {}", value, text);

return StringUtils.EMPTY;

}

return value;

}

return null;

}

```

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值