我有几个通过jQuery .ajax函数引入的表单。在父页面中,我开始像这样的会话
<php
session_start();
$_SESSION['authenticated'] = 'yes';
?>
然后在加载的表单中有这样的检查:
<?php
session_start();
if($_SESSION['authenticated'] != 'yes') {
header("Location: http://www.google.com");
}
?>
我知道它不是最好的,但它试图阻止人们直接访问表单。问题是,如果您转到父页面,那么您可以输入表单URL并到达那里,因为会话是在您访问父页面时启动的。如何销毁会话或解决此问题?
答案 0 :(得分:2)
实际上,你不能。
要使其更复杂,请不要直接请求表单网址。尝试请求主页的授权令牌:
如果您生成主页并且您知道要预先请求的表单,则生成令牌,例如使用md5(time()。rnd()),将每个与表格相关联,并在会话中保存关联
然后,您的JS代码将不会请求表单URL,而是使用注入JS代码的令牌的工厂脚本
如果您在会话中找到已保存关联中的令牌,请在会话中发出表单并删除令牌。
这样,每个表单只能通过主页的前一次调用请求一次。
请注意,这也不完全安全:如果用户使用 wget 请求主页的URL,他可以请求每个表单一次。
答案 1 :(得分:1)
您可以在表单.php代码中查看$_SERVER['HTTP_REFERER']
,以查看请求的来源。 AJAX调用会将HTTP_REFERER设置为从中调用的页面。
if (strpos($_SERVER['HTTP_REFERER'], $_SERVER['HTTP_HOST']) === false) { die(); }
这不是一个防弹解决方案。任何可公开访问的页面都可以通过自动脚本检索。