Java 通过质询/响应保护会话的每个请求?

Java 通过质询/响应保护会话的每个请求?,java,php,security,web-applications,Java,Php,Security,Web Applications,我们需要设计一个安全的web应用程序。我想提出一种会话处理机制,它不仅在使用方法登录时对每个请求进行质询响应 其原因是加强web应用程序对会话劫持(例如通过)和重播或中间人攻击的防御 在某些地方建议使用,但在我们的webapp中,这似乎不切实际,因为异步请求可以继续,或者用户可以打开新窗口,点击后退按钮等 想法:客户端和服务器有一个共享的秘密(先前建立的用户密码),每个后续请求都会根据该秘密再次执行质询/响应,例如“response=hash(质询+hashedPassword)”。只有当对质询

我们需要设计一个安全的web应用程序。我想提出一种会话处理机制,它不仅在使用方法登录时对每个请求进行质询响应

其原因是加强web应用程序对会话劫持(例如通过)和重播或中间人攻击的防御

在某些地方建议使用,但在我们的webapp中,这似乎不切实际,因为异步请求可以继续,或者用户可以打开新窗口,点击后退按钮等

想法:客户端和服务器有一个共享的秘密(先前建立的用户密码),每个后续请求都会根据该秘密再次执行质询/响应,例如“response=hash(质询+hashedPassword)”。只有当对质询的响应匹配时,服务器才会执行请求。与CRAM期间非常相似,但每次请求都会持续进行


问题是:这是一个可行的想法吗?如果是这样的话,它肯定已经实施了,或者甚至是某种标准?我们将如何在基于java或php的Web应用程序中使用它?

问题实际上归结为您想要实现什么。如果您想对抗CSRF攻击,除了会话密钥之外,您还可以使用一个秘密令牌。但是,更改每个请求中的令牌将导致问题-不仅“后退”按钮会终止会话,而且由于一个网页通常包含大量异步和并行加载的数据(图像、css、javascript等),因此您的方法将无法在以后加载任何其他数据,因为每个额外的请求都会更改所需的令牌,从而终止会话

您可以通过BASE64和其他技巧将所有资源嵌入到页面中来解决这个问题,但这将严重阻碍您的可能性,并且可能与某些浏览器存在兼容性问题

因此,最终,您的方法不会增加太多安全性,但很可能会为您的客户带来一整套潜在问题。我会坚持在URL中的每个会话中使用一个秘密令牌来对抗CSRF,并专注于防范其他攻击(如XSS)和用户友好的安全措施(如使用智能手机或类似设备进行双重身份验证)。毕竟,用户是目前的1攻击向量。
更新(2012-06-14)

该令牌不会抵抗XSS攻击,但会防御基本的CSRF攻击(例如,通过在图像中植入虚假url调用)。事实上,我今天在工作中遇到了一个情况,我需要确保get请求不受用户修改和修改的影响。该代码还可用于保护静态会话超时
表单
-和
链接
-令牌(解决您的问题)

其思想是拥有一个服务器机密,用于在数据上生成一个hash/AuthToken以确保安全。如果恶意javascript试图更改任何给定数据,AuthToken将不匹配。在我的具体问题中,我有一台服务器对用户进行身份验证,并且必须将他的信息发送给第三方(用户名、邮箱地址、姓名等)。在身份验证之后,任何用户都可以很容易地更改此GET请求,因此我必须对GET请求参数进行身份验证。通过重新运行AuthenticationToken进程,第三方可以比较生成的AuthToken,从而验证传入数据。没有共享的秘密,伪造数据几乎是不可能的

关于你的问题:在GET和POST请求上有一个静态令牌(或像我的项目一样的动态令牌)将保护你免受简单的CSRF攻击,例如通过论坛中的链接,用户必须单击该链接才能受到攻击。由于链接永远不会包含正确的令牌,因此您的网页是安全的。然而,如果攻击者设法通过XSS将javascript加载到网页中,你就完蛋了,世界上没有任何技术可以帮助你对付它,因为javascript可以扫描页面的整个DOM树,以找到捕获任何标记的方法

因此,归根结底是:

  • 在GET和POST请求上使用令牌对抗CSRF
  • 针对XSS注入保护您的页面
我发现这些是此类设计决策的良好资源:

您的方案听起来与类似,但没有建立任何类型的会话后身份验证。这可能是对HTTP Basic的改进。假设两者都超过TLS

我不知道你的方案有多可行,也不知道它有多容易受到重播攻击或MITM攻击



如果它是一个选项,你可以考虑新的<代码> <代码> HTML5标签,它可以帮助建立双向TLS会话。这将是最安全的选择。

它是什么类型的web应用程序?如果是常规web应用程序,可通过常规web浏览器访问,则每个请求都有身份验证令牌将对可用性产生影响,因为浏览器的历史记录(后退按钮)和并行浏览将不再起作用。客户端如何知道密码?Gumbo:可通过常规web浏览器访问。为了防止您提到的导航问题,我的想法是作为一个请求的一部分进行质询/响应somhow。例1。来自客户的请求,2。使用来自服务器的质询和目标url进行响应,3。客户端将响应发送到该url,4。执行原始请求。或任何其他此类方法。biziclop:这是客户用户在注册时设置的密码(注册需通过挂号信确认)@Bachi如何防止出现问题?服务器会存储所有以前的挑战吗?静态秘密令牌的问题是,成功注入XSS或其他js后,攻击者很容易访问该令牌。我同意传统的改变令牌在现代网络应用程序中不起作用。我认为对每个请求更多的是质询/响应,例如客户端->服务器->无有效请求。代币?->服务器通过质询->客户端重复请求并发送到中间页面