XSS处理方法

package cn.com.klec.sgmysql.web.action.util;


import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


/**
 * Created by mini on 16/3/2.
 */
public class XssStringFilter {

//默认的过滤规则
final static String regEx = "[`~!%^&*{}#\"'\\[\\]<>?]";

private XssStringFilter() {


}


public static String stringFilter(String str) {
if (str == null || "".equals(str)) {
return str;
}
// "[`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~!@#¥%……&*()——+|{}【】‘;:”“’。,、?]";
Pattern pattern = Pattern.compile(regEx);
Matcher matcher = pattern.matcher(str);
return matcher.replaceAll("").trim();
}

public static String[] stringFilter(String[] str){
if(str==null|| "".equals(str)){
return str;
}
if(str.length>1000){//该处的判断并没有很大的实际意义,只是为了防止由于过多的循环而导致的系统拒绝访问
str = Arrays.copyOfRange(str, 0, 1000);
}
for (int i = 0; i < str.length; i++) {
str[i] = stringFilter(str[i]);
}
return str;
}

//在默认的过滤基础上,允许某个特殊字符也通过筛选
public static String stringSubFilter(String str,String reg){
if("".equals(reg) || str==null || "".equals(str) || reg ==null ){
return stringFilter(str);
}
reg = regEx.replaceAll(reg, "");
Pattern pattern = Pattern.compile(reg);
Matcher matcher = pattern.matcher(str);
return matcher.replaceAll("").trim();
}


//使用特定的regEx进行过滤
public static String stringFilter(String str, String regEx) {
if ("".equals(regEx) || str == null || "".equals(str)||regEx == null)
return stringFilter(str);
Pattern pattern = Pattern.compile(regEx);
Matcher matcher = pattern.matcher(str);
return matcher.replaceAll("").trim();
}


/**
* 对整个model中的String类型参数进行安全过滤,去除特殊符号,其中regEx使用的是默认
* @param model 传入要进行过滤的model
* @return
*/
@SuppressWarnings("unchecked")
public static <T> void stringFilterOfModel(T model) { 
Class<T> clazz = (Class<T>) model.getClass();
Method getMethod = null;
Method setMethod = null;
Field[] fields = clazz.getDeclaredFields();
String strNameUpp;
String strValue;
for (Field f : fields) {
strNameUpp = f.getName().substring(0, 1).toUpperCase() + f.getName().substring(1);
try {
getMethod = clazz.getDeclaredMethod("get" + strNameUpp);
if (f.getType().isAssignableFrom(String.class)) {
strValue = (String) getMethod.invoke(model);
} else {
continue;
}
setMethod = clazz.getDeclaredMethod("set" + strNameUpp,String.class);
if (getMethod.invoke(model) == null || "".equals(strValue))
continue;
setMethod.invoke(model, stringFilter(strValue));
} catch (Exception e) {
e.printStackTrace();
}
}
}

/**
* 对stringFilterOfModel进行了重载,使regEx可以自定义
* @param model 过滤的model
* @param regEx 过滤的规则
*/
public static <T> void stringFilterOfModel(T model, String regEx){
if("".equals(regEx) || regEx == null){
stringFilterOfModel(model);
}
@SuppressWarnings("unchecked")
Class<T> clazz = (Class<T>) model.getClass();
Method getMethod = null;
Method setMethod = null;
Field[] fields = clazz.getDeclaredFields();
String strNameUpp;
String strValue;
for (Field f : fields) {
strNameUpp = f.getName().substring(0, 1).toUpperCase() + f.getName().substring(1);
try {
getMethod = clazz.getDeclaredMethod("get" + strNameUpp);
if (f.getType().isAssignableFrom(String.class)) {
strValue = (String) getMethod.invoke(model);
} else {
continue;
}
setMethod = clazz.getDeclaredMethod("set" + strNameUpp,String.class);
if (getMethod.invoke(model) == null || "".equals(strValue))
continue;
setMethod.invoke(model, stringFilter(strValue,regEx));
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 测试使用
* @param args
*/
// @SuppressWarnings("unused")
// public static void main(String[] args) {
// String hell = "/><script>%20\"/abc";
//
// System.out.println(stringSubFilter(hell, "%"));
//
// System.out.println(stringFilter(hell));
// class Model{
// private String name;
// private String garder;
// private Date age;
// String salary;
// public Model(){
// name = "maoludong!&";
// age = new Date();
// salary = "8000{{";
// }
//
// public String getName() {
// return name;
// }
// public void setName(String name) {
// this.name = name;
// }
// public String getGarder() {
// return garder;
// }
// public void setGarder(String garder) {
// this.garder = garder;
// }
//
// public Date getAge() {
// return age;
// }
// public void setAge(Date age) {
// this.age = age;
// }
// public String getSalary() {
// return salary;
// }
// public void setSalary(String salary) {
// this.salary = salary;
// }
//
// @Override
// public String toString() {
// return "Model [name=" + name + ", garder=" + garder + ", age=" + age + ", salary=" + salary + "]";
// }
//
// }
//
// Model model = new Model();
// stringFilterOfModel(model);
// System.out.println(model);
// }


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在nginx中处理XSS(跨站脚本攻击),可以采取以下措施: 1. Content-Security-Policy(CSP):通过设置CSP头来限制浏览器执行恶意脚本。在nginx配置文件中添加以下代码: ``` add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'"; ``` 这将允许只从同一域名下加载脚本,并阻止内联脚本的执行。 2. 输入过滤和验证:使用nginx的HttpLuaModule模块或HttpHeadersMoreModule模块,对用户输入的内容进行过滤和验证。可以使用正则表达式或其他方法过滤掉可能包含恶意脚本的内容。 3. 输出编码:确保在向客户端发送响应时,对输出的内容进行适当的编码,以防止恶意脚本的注入。这可以通过使用适当的编码函数或库来实现。 4. HTTP Only Cookie:在设置Cookie时,将其标记为HTTP Only,以防止JavaScript访问和操作Cookie。可以在nginx配置中添加以下代码: ``` location / { ... add_header Set-Cookie "cookie_name=cookie_value; HttpOnly"; ... } ``` 5. 静态文件处理:确保通过nginx提供的静态文件服务时,不会执行任何恶意脚本。这可以通过正确配置nginx的静态文件服务来实现。 6. 安全更新和配置:定期更新nginx软件版本,以获取最新的安全修复和功能改进。同时,确保正确配置nginx的安全选项,例如限制访问权限、禁用不必要的模块等。 需要注意的是,这些措施只是一些常见的防御措施,无法完全消除XSS攻击的风险。因此,还应该综合考虑其他安全措施,如输入验证、输出编码和错误处理等。同时,定期审查和更新安全策略以适应新的安全威胁和漏洞。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值