XSS攻击拦截_struts拦截器作用

XSS攻击拦截_struts拦截器作用struts2拦截器添加及xss攻击的处理

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

struts2拦截器添加及xss攻击的处理

先在struts2.xml中添加拦截路径。

<package name="base" extends="struts-default,json-default" >

<!-- 给文本编辑器配置的bean以及constant -->

   <!--拦截器-->
   <interceptors>
      <interceptor name="LoginInterceptor" class="com.spark.tempo.urm.web.interceptor.LoginInterceptor">
         <!--方法不拦截-->
         <param name="excludeMethods">login</param>
      </interceptor>
      <interceptor-stack name="myDefault">
         <interceptor-ref name="defaultStack"/>
         <interceptor-ref name="LoginInterceptor"/>
      </interceptor-stack>
   </interceptors>

   <default-interceptor-ref name="myDefault"/>
   <global-results>
      <result name="login">/mgrIndex.jsp</result>
   </global-results>
</package>

然后在需要拦截的action中添加注解:

@ParentPackage(value="base")

如果action中都有继续统一的BaseAction则可以在BaseAction中写入此注解如:

@ParentPackage(value="base")
public class BaseAction extends WebApplicationObjectSupport implements Action {
 
 

在添加拦截器类及方法

我做这拦截添加了防止页面中传入的xss攻击代码

2、拦截器要继承MethodFilterInterceptor类这样xml中的<param name=”excludeMethods”>login</param>不拦截的方法才能生效不然不生效别怪我哟。

public class LoginInterceptor extends MethodFilterInterceptor {


    @Resource
    private IBaseService baseService;
    private HttpServletRequest request;

    @Override
    public String doIntercept(ActionInvocation acation) throws Exception {
        String actionName = acation.getInvocationContext().getName();//获取action方法名
        Map<String,Object> parameters = acation.getInvocationContext().getParameters();

        request = ServletActionContext.getRequest();

        ActionContext ac = acation.getInvocationContext();
        ValueStack stack = ac.getValueStack();
        for(Map.Entry<String,Object> map : parameters.entrySet()){
            Object[] obj = (Object[])map.getValue();//获取传入的参数值是否有非法,xss攻击

//            System.out.println("参数名:"+map.getKey()+"   参数值:"+obj[0].toString());
//            System.out.println("处理参数名:"+map.getKey()+"   处理后参数值:"+XssHttpServletRequestWrapper.xssEncode(obj[0].toString()));
            //action参数中添加处理后的值,防止xss攻击将处理后的参数重新setaction值中
            stack.setValue(map.getKey(), XssHttpServletRequestWrapper.xssEncode(obj[0].toString()));
        }

        User user = (User) ServletActionContext.getRequest().getSession().getAttribute(SysContextParam.SessionAttribute.SESSION_CURR_USER);
        //用户已登陆,添加操作日志
        if(user != null){
            //获取访问者ip
            String ip  = request.getHeader("x-forwarded-for");
            if (ip == null || ip.length() == 0) {
                ip = request.getRemoteAddr();
            }
            //添加日志:
            String logSql = "INSERT INTO t_custom_manager_log (id, operator, create_date, operate_url, ip,operate_project) VALUES(?, ?, ?, ?, ? ,?)";
            baseService.executeUpdateByOrigSQL(logSql, new Object[]{
  
  null,user.getName(),new Date(),request.getServletPath(),ip,"1"});
            return acation.invoke();
        }else{
            return "login";
        }
    }

}

添加防拦截的xss攻击类

public class XssHttpServletRequestWrapper {


    /**  * 将容易引起xss漏洞的半角字符直接替换成全角字符  *  * @param s  * @return  */  public static String xssEncode(String s) {
        if (s == null || s.isEmpty()) {
            return s;
        }
        StringBuilder sb = new StringBuilder(s.length() + 16);
        for (int i = 0; i < s.length(); i++) {
            char c = s.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;
                case '&':
                    sb.append('');// 全角
                    break;
                case '\\':
                    sb.append('');// 全角斜线
                    break;
                case '#':
                    sb.append('');// 全角井号
                    break;
                case '%':    // < 字符的 URL 编码形式表示的 ASCII 字符(十六进制格式) 是: %3c
                    processUrlEncoder(sb, s, i);
                    break;
                default:
                    sb.append(c);
                    break;
            }
        }
        return sb.toString();
    }
    private static void processUrlEncoder(StringBuilder sb, String s, int index) {
        if (s.length() >= index + 2) {
            if (s.charAt(index + 1) == '3' && (s.charAt(index + 2) == 'c' || s.charAt(index + 2) == 'C')) {    // %3c, %3C
                sb.append('');
                return;
            }
            if (s.charAt(index + 1) == '6' && s.charAt(index + 2) == '0') {    // %3c (0x3c=60)
                sb.append('');
                return;
            }
            if (s.charAt(index + 1) == '3' && (s.charAt(index + 2) == 'e' || s.charAt(index + 2) == 'E')) {    // %3e, %3E
                sb.append('');
                return;
            }
            if (s.charAt(index + 1) == '6' && s.charAt(index + 2) == '2') {    // %3e (0x3e=62)
                sb.append('');
                return;
            }
        }
        sb.append(s.charAt(index));
    }
}

好,搞完收工。

还有就是拦截到返回的参数:login他会返回到struts2中xml

 <global-results>
      <result name="login">/mgrIndex.jsp</result>
   </global-results>

获取返回的login到mgrIndex.jsp路径中,这我是jsp页面。也可以根据自己的需要添加


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/188793.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 编程入门先学什么 java_编程入门先学什么?java的快速学习方法

    编程入门先学什么 java_编程入门先学什么?java的快速学习方法如何快速的入门java?下面让达内广州java培训的小编分享一些干货给大家吧!一、掌握静态方法和属性静态方法和属性用于描述某一类对象群体的特征,而不是单个对象的特征。Java中大量应用了静态方法和属性,这是一个通常的技巧。但是这种技巧在很多语言中不被频繁地使用。理解静态方法和属性对于理解类与对象的关系是十分有帮助的,在大量的Java规范中,静态方法和属性被频繁使用。因此学习者应该理解静态方法和属性…

  • GridLayout平均分配空间

    GridLayout平均分配空间GridLayout平均分配空间始末:在使用Gridlayout时,想要做一个横向平均分配的布局,像这样的:都知道,设置一个columnCount配合上app:layout_columnWeight=”1″即可可是当某一个的文字过长时,就会出现下面的情况:解决方案:将所有的TextView加上一个属性:android:layout_width=”0dp”即可。源码:<?…

  • 虚拟化漏洞3种解决方案_怎么实现漏洞复现的

    虚拟化漏洞3种解决方案_怎么实现漏洞复现的利用虚拟机复现漏洞“永恒之蓝”攻击:kaliLinux2020.3靶机:WindowsServer2008R2x64下面详细讲述测试的过程。————“永恒之蓝”简介利用Windows系统的SMB漏洞可以获取系统最高权限。于2017年在全球的范围内大面积爆发,不法分子利用这个漏洞制作了勒索病毒,锁定被攻击的设备,并要求支付高额赎金。“永恒之蓝”的原理主要是扫描所有开放445文件共享端口的Windows机器。这里进行测试要用到一个工具MSF,能快速

    2022年10月16日
  • tp系统常量定义

    tp系统常量定义

  • ht1621b驱动显示原理_STM32H723ZGT6

    ht1621b驱动显示原理_STM32H723ZGT6这几天在写ht1621b显示LCD的程序,主芯片是Stm32f10的芯片。对于stm32和ht1621b的运用和操作本人是新手,属于赶鸭子上架,通过查看datasheet等资料和网上查看前人写的程序终

  • pycharm提示no python interpreter_pycharm代码运行不了

    pycharm提示no python interpreter_pycharm代码运行不了Pycharm配置:解决方法如下方法一:Pycharm配置环境变量,ProjectInspector确认有Python3.7齿轮栏点Add,选ExistingEnvironment就好然后在Inspector选项找安装目录的Python.exe选择好了之后点击OK,之后选择Makeavaliableforallappliction再点OK就行了New新建一个pythonfile,然后就可以开始写代码了写完之后右键代码选择下面绿色的播放键Run就可以测试.

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号