解决提交表单时Xss攻击的问题

来源:互联网 发布:马尔科夫转移矩阵法 编辑:程序博客网 时间:2024/06/03 09:24

之前一直做内网系统,都是局域网,对安全问题一直考虑不周。

有一天对自己线上的表单做了一个测试,将<script>alert("xxx")</script>作为表单选项提交,在后台回显时,可想而知,后台弹出了一个alert("xxx")的巨大的bug。

而如果提交的是一个对象,对每个表单的每一项都进行下判断,又太麻烦,于是改装了一下工具类。不完善,后期需要可以手动改,附上代码:

import java.lang.reflect.Field;import java.lang.reflect.Method;public class XssValidate {public static boolean getObjectValue(Object object) throws Exception {boolean result = true;if (object != null) {// 拿到该类Class<?> clz = object.getClass();// 获取实体类的所有属性,返回Field数组Field[] fields = clz.getDeclaredFields();for (Field field : fields) {// 如果类型是Stringif (field.getGenericType().toString().equals("class java.lang.String")) { // 如果type是类类型,则前面包含"class ",后面跟类名// 拿到该属性的getter方法Method m = (Method) object.getClass().getMethod("get" + getMethodName(field.getName()));String val = (String) m.invoke(object);// 调用getter方法获取属性值if (val != null && (val.contains("script") || val.contains("<"))) {result = false;break;}}}}return result;}// 把一个字符串的第一个字母大写、效率是最高的、private static String getMethodName(String fildeName) throws Exception {byte[] items = fildeName.getBytes();items[0] = (byte) ((char) items[0] - 'a' + 'A');return new String(items);}}

上面是利用反射,将所有的表单属性值的字符串校验一下,判断有没有xml攻击的特殊字符。

在调用时,如下:

try {boolean validate = XssValidate.getObjectValue(applicationVo);if (!validate) {throw new RuntimeException("表单信息中含有非法字符,请检查");}//TODO} catch (Exception e) {String error = e.getMessage();try {response.getWriter().print("<script type='text/javascript'>alert('保存失败"+(StringUtils.isNotBlank(error) ? ("," + error) : "") +"!');history.back(-1);</script>");} catch (IOException e1) {e1.printStackTrace();}}