`

Ajax环境下表单防重复、外部提交实现方案记要

阅读更多

背景:

js lib: Ext 3.3.0,未使用 struts、Spring MVC;

 

所有的表单都由 Ext js 方法生成(即非传统 http form 形式, http 源代码中无 form 元素),后台 http request -> action 的处理机制是和 struts、Spring MVC 的实现相仿。

 

方案核心:

通过 token 机制来防止表单重复或外部提交(非常非常的寻常)。

 

方案实现:

如果用 struts 就简单了,加个<s:token/> 再配个 TokenInterceptor 就搞定了 (存在漏洞,详见底部)。

如果用 Spring MVC 就简单了,写个 TokenHandlerInterceptor extends HandlerInterceptorAdapter 再配置下也搞定了。

 

不用 struts、Spring MVC 其实也简单,参考 Spring MVC 在  http request -> action 的处理中加上拦截器机制,再参考 struts 实现 TokenInterceptor 就搞定了。

 

关于 token 值的提交方式:由于form非常规,无法往 form 里添加 token 元素,既然放不到 request body 里,那就放到 request header 里,放到 header 里其实相对来说更灵活些(另外似乎还能避免1个漏洞,详见底部)。

 

Ext request 加 header :

 

Ext.Ajax.defaultHeaders = {
    'Req-Token': tokenValue
};

注:header 的名称是不区分大小写的,根据实际测试情况,IE下通常会把 header 名称都变成小写,而 Firefox 和 Chrome 基本上不会改变,header 名称和我们代码里所写的名称是一致的。后台获取 header 值时需注意这个情况。

 

同样的,response 里也加个 header,将新的 token 值传给客户端。

不专门提供一个获取 token 值的 servlet 的原因:主要是怕该 servlet 压力过大。

 

另外,不能将 token值的提交和form提交分开,必须在同一个请求中同时提交,原因:分开提交无法防止外部提交等非法提交方式。

 

关于是否需要进行 token 校验:由于 TokenInterceptor 配上了,则默认会对所有 request 均校验,为了支持按需进行校验,自定义了@Token 注解,需要校验的action方法只要加上 @Token 即可(注解是个好东西)。

 

特别注意:

CSRF

CSRF攻击原理解析

Struts2 csrf token绕过漏洞

 

分享到:
评论

相关推荐

    Yii2表单事件之Ajax提交实现方法

    总结一下,Yii2提供了方便的方式来处理Ajax表单提交。通过注册JavaScript代码,我们可以监听表单的`beforeSubmit`事件,并利用Ajax发送数据到服务器,而无需页面刷新。这种方法不仅提高了用户体验,也使得代码结构...

    【卷一/共两卷】AJAX实战pdf高清版90M

    1.4 Ajax的替代方案 1.4.1基于Macromedia Flash的方案 1.4.2 Java Web Start及其相关技术 1.5 小结 1.6 资源 第2章 Ajax新手上路 2.1 Aiax的关键元素 2.2 用JavaScript改善用户体验 2.3 用CSS定义应用的外观 2.3.1 ...

    JavaScript网页设计300例

    6. **AJAX与Fetch API**:AJAX(异步JavaScript和XML)允许不刷新整个页面的情况下更新部分网页内容,Fetch API是现代浏览器中更现代的替代方案,用于发送HTTP请求。这两者都是实现前后端分离和页面无刷新的关键技术...

    JAVASCRIPT.chm

    4. **事件处理**:JavaScript通过事件监听来响应用户的交互,如点击、滚动、提交表单等,实现动态效果和用户反馈。 5. **DOM操作**:Document Object Model (DOM)是HTML和XML文档的抽象表示,JavaScript通过DOM API...

    Javascript45个经典例子

    10. **闭包**:闭包是JavaScript中的一个高级特性,它能让内部函数记住其外部环境,即使外部函数已经执行完毕。 11. **作用域**:JavaScript有全局作用域和局部作用域,理解这两者以及`var`、`let`和`const`的作用...

    php网络开发完全手册

    7.3.1 字符串重复操作——str_repeat 104 7.3.2 字符串替换操作——str_replace 7.3.2 和str_ireplace 104 7.3.3 字符串分解操作——str_split 106 7.3.4 字符串单词数的计算函数—— 7.3.4 str_word_count 107 ...

    文章管理系统

    2.[改进]后台分页数太多,提交成功后要提示下 3.[新增]后台引导页加入生成首页静态页判断 4.[改进]后台留言管理,对留言内容和用户名加入字符串强制换行 5.[修复]纠正前台投票时,当投票数超过32767时,程序会...

    xheditor-1.1.14

    说明:通过本参数,在非标准submit提交环境下,比如AJAX提交,可以由用户点击提交按钮以触发编辑器最新值的同步 备注:v1.1.7新添加 onPaste:剪切板粘贴回调函数 参数值:用户粘贴后需要执行的函数 说明:此函数...

    JavaScript-Course

    7. **AJAX与Fetch API**:AJAX(异步JavaScript和XML)让页面在不刷新的情况下与服务器通信。Fetch API是现代浏览器的HTTP请求新方式,提供了更友好的API和更好的错误处理。 8. **框架与库**:JavaScript有众多的库...

    c

    RHC网站可能使用AJAX技术来实现无刷新的用户体验,比如实时加载新的咨询内容,或者在后台提交表单数据。 5. 函数和闭包: 函数是JavaScript中可重复使用的代码块,而闭包则是一种特殊的函数,它可以访问其自身作用...

    MSJAVASCRIPT:使用JavaScript编写脚本

    7. **AJAX(异步JavaScript和XML)**:允许在不刷新整个页面的情况下与服务器交换数据并更新部分网页内容,常用XMLHttpRequest或fetch API实现。 8. **ES6及后续版本的新特性**:包括类(class)、模板字符串、let...

    EECS2030:OOP课程的作业和实验

    2. **继承与多态**:通过继承,一个类可以继承另一个类的特性,这有助于减少代码重复并实现代码复用。多态则允许不同的对象对同一消息做出不同的响应,增强了程序的灵活性。 3. **封装与抽象**:封装是将数据和操作...

    javascriptExercises

    5. **事件处理**:JavaScript可以通过事件监听和处理函数来响应用户的交互行为,如点击、滚动、提交表单等。理解事件冒泡、事件捕获和事件委托是这一部分的关键。 6. **AJAX**:Asynchronous JavaScript and XML,...

    ajs-homework-2.1

    AJAX(异步JavaScript和XML)是较老的技术,而Fetch API是现代浏览器更推荐的替代方案。 6. **ES6+新特性**:如解构赋值、模板字符串、类和箭头函数等,这些都是JavaScript近年来引入的增强,提高了代码的可读性和...

Global site tag (gtag.js) - Google Analytics