【问题标题】:Forbidding external domain access禁止外域访问
【发布时间】: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


【解决方案1】:

这在 mod_rewrite 中是不可靠的。

只需检查表单值是否正确填写,无论如何您都必须这样做。如果未填写值,请使用

重定向
header('Location: elsewhere.html');

或者干脆返回另一个视图。

【讨论】:

    猜你喜欢
    • 2019-03-26
    • 1970-01-01
    • 2012-05-22
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多