1

要将表单提交锁定到我的域(在本例中为 localhost),我以以下一般方式使用同步器 cookie:

<?php setcookie('csrf_token',$randomizedToken,0,'','/'); ?>

在 Web 表单中,我将令牌注入到隐藏字段中:

<input name="csrf_token" type="hidden" value="<?php echo $randomizedToken; ?>" />

现在,当我在 Chrome 中加载上述内容并使用开发者工具检查源/cookies/etc 时,我发现 cookie 值和隐藏表单值不匹配,直到我在开发者工具中刷新 (command+R) WHILE。可以预见的是,当我尝试提交表单时,cookie 和 POSTed 令牌不匹配,并且不会处理表单。请注意,在我测试过的浏览器中(适用于 OS X 的 Chrome、Safari、Opera、Firefox 和 Camino、适用于 iOS 的 Mobile Safari 和 Mobile Chrome),此问题仅发生在适用于 OS X 的 Chrome 中。在所有其他浏览器中,cookie和隐藏的表单值是同步的,并且提交按预期工作。

在将头撞到墙上几个小时后,我尝试注释掉我的 .htaccess 重写指令,该指令将所有非文件和非目录请求转发到 /index.php。这样做之后,cookie 和令牌值开始在 Chrome 中同步,并且表单提交按预期工作。.htaccess 指令如下:

<IfModule mod_rewrite.c>

    Options +FollowSymLinks

    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . index.php [L]

</IfModule>

一些快速的谷歌搜索告诉我,除非在重写规则中指定了重定向行为,否则 apache 应该只是在后台获取别名请求而不向浏览器发出重定向。然而,Chrome 似乎正在接收重定向,导致令牌值变得不同步。我在这里完全不知所措,因为我需要保护表单免受 CSRF 攻击,但还需要启用重写以映射到应用程序资源。显然我不能忽视 OS X Chrome 用户。

有没有人遇到过类似的问题,你是怎么解决的?

更新

发布此问题后,我想到将 .htaccess 文件从 Web 根目录移动到 /resource 目录,然后在该目录中提交表单现在可以了。这意味着我必须在每个需要重写 URL 的目录中包含一个单独的(但相同的).htaccess,而不是在网站的根目录中包含一个 .htaccess。这是可行的,但有点痛苦,所以如果有人有更优雅的解决方案,我很想听听!

4

0 回答 0