【发布时间】:2013-04-19 14:09:55
【问题描述】:
问题:我想只允许我网站的表单; <form action="link" 在我的表单提交时导航到 www.domain.com/link。但要拒绝直接访问 URL www.domain.com/link。
尝试:到目前为止,我知道如何使用 mod_rewrite 禁止访问:
Options -Multiviews
RewriteEngine on
RewriteCond %{REQUEST_URI} link
RewriteRule ^.*/?link/? - [F]
但我不知道如何允许表单提交访问该页面。如果通过这样做提交表单,我探索了使用带有秘密值的输入标签以允许访问的可能性
Options -Multiviews
RewriteEngine on
RewriteCond %{REQUEST_URI} link
RewriteCond %{QUERY_STRING} !secret_key
RewriteRule ^.*/?link/? - [F]
替代方案:但用户只要想直接访问页面,就可以将该键复制并粘贴为查询字符串。即使我使用 mod_rewrite 隐藏了查询字符串,更聪明的用户仍然可以通过检查输入标签来访问页面。保护这样的页面的可靠方法是什么?不污染查询字符串。
【问题讨论】:
-
是否有可能在 $_SESSION 中隐藏查询字符串密钥?我将如何将会话变量作为查询字符串传递,这将是我的下一个问题。
-
... 你为什么要打扰这个?无论您做什么,聪明的用户都可以欺骗提交该表单的请求。这就是 HTTP 的本质——一个好的请求与一个坏的请求几乎没有区别。尤其是像“仅来自这种形式”这样的条件。我能想到的最接近的方法是在表单中添加一个随机生成的
<input type="Hidden" />,并根据一些存储的 $_SESSION 变量检查它——但是多个窗口呢?然后怎样呢?维护一组具有到期日期的有效密钥?我认为你最好假设每个请求都被污染了。 -
@SofianeM 你有什么问题?为什么你认为,请求必须来自这个表单?
-
表单动作属性指向另一个页面。我想确保用户在不先填写第一个表单的情况下无法访问此表单页面。我知道这可以通过 $_SESSION 轻松完成。但即使我在第二个表单页面上使用会话变量检查,如果它不是来自第一个表单,唯一的重定向方法是回显 进行重定向。我想改为 RewriteRule 完全重定向到其他地方。
标签: regex apache .htaccess http mod-rewrite