Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么是PRG模式而不是其他模式?_Java_Security_Spring Mvc_Web_Post Redirect Get - Fatal编程技术网

Java 为什么是PRG模式而不是其他模式?

Java 为什么是PRG模式而不是其他模式?,java,security,spring-mvc,web,post-redirect-get,Java,Security,Spring Mvc,Web,Post Redirect Get,我需要防止重复的形式提交我的客户的网站 我们需要一些表单数据从用户的订单确认页面 我们对web服务器使用负载平衡 方法1:发布/重定向/获取 (PRG模式:) 起初我尝试使用PRG模式。 在这种情况下,我认为我需要跨多个web服务器处理会话(或SpringFlashMap) 方法2:在客户端上禁用刷新。 我的一位同事提出了这种方法 方法3:员额/员额 另一位同事提出了这种方法 我认为方法2、3不是一个好的选择。 但是我不知道这些方法的具体缺点或安全风险。 我试着用谷歌搜索,但没能找到答

我需要防止重复的形式提交我的客户的网站

  • 我们需要一些表单数据从用户的订单确认页面
  • 我们对web服务器使用负载平衡
方法1:发布/重定向/获取 (PRG模式:)

起初我尝试使用PRG模式。
在这种情况下,我认为我需要跨多个web服务器处理会话(或SpringFlashMap)

方法2:在客户端上禁用刷新。

我的一位同事提出了这种方法

方法3:员额/员额

另一位同事提出了这种方法

我认为方法2、3不是一个好的选择。
但是我不知道这些方法的具体缺点或安全风险。
我试着用谷歌搜索,但没能找到答案

先谢谢你

[编辑] 我想更新利弊

方法1:发布/重定向/获取 赞成的意见
  • 安全
欺骗
  • 如果您需要用户提供的一些表单数据在确认页面上显示,则需要使用
    会话
    数据库
    或其他方法
  • 如果您使用
    会话
    ,并且有多个服务器,则必须采取措施使会话在多个服务器之间可用
方法2:在客户端上禁用刷新。 赞成的意见 欺骗
  • 如果您限制浏览器的标准功能(如刷新),用户会感到不安 需要考虑F5、CTRL+F5,⌘ + F5等,各种刷新图标
  • 在移动设备中,许多web浏览器在用户重新加载浏览器时自动刷新页面
方法3:员额/员额 赞成的意见
  • 您不必担心跨多个服务器的会话共享问题
欺骗
  • 第二个表单提交可能失败
方法1是一种非常直接的方法,可以解决一些重复的post问题。它无法应对服务器延迟,这也是重复提交的原因

方法2完全是错误的。如果您限制浏览器的标准功能(如刷新),用户会感到不安。也就是说,如果您能够在跨浏览器的技术上做到这一点。你需要考虑F5,CTRL+F5,⌘ + F5等,各种刷新图标

我必须承认,我并不完全理解方法3的意图,但是,将用户跳转到一个空页面感觉有点错误

另一个标准的方法是在表单帖子中使用名词。这也将帮助您避免称为的安全风险。这很简单

  • 在服务器上生成一个名为nonce的“唯一”随机字符串
  • 将nonce插入数据库
  • 将nonce作为隐藏字段附加到表单(或通过URL或类似方式传递)
  • 确保nonce以post形式发送到服务器
  • 在服务器端,验证nonce,删除nonce,“保存表单数据”
  • 显示确认页面
  • 如果您收到另一个不存在nonce的请求,那么您知道这是一个重复的post或一些更邪恶的CSRF攻击


    您可能会发现这一点。

    方法3的目的是,正如我所说的,我们需要用户提供一些表单数据(例如,用户选择的颜色),并需要在确认页面上显示这些数据。在PRG模式中,我们可以使用会话。但是,由于我们使用多个web服务器,会话共享或其他事情是一项额外的工作。我们可以在重定向时使用参数,但我认为在url中显示用户的订单数据不是一个好主意。因此,为了方便地将“用户表单数据”从提交页面发送到确认页面,我的同事建议使用方法3。好的,nonce方法不依赖于共享会话——它依赖于一个共享数据库,我想您已经拥有了这个数据库。