帮助PHP session_destroy();

时间:2011-03-06 21:30:46

标签: php ajax session

我有几个通过jQuery .ajax函数引入的表单。在父页面中,我开始像这样的会话

<php
 session_start();
 $_SESSION['authenticated'] = 'yes';
?>

然后在加载的表单中有这样的检查:

<?php
  session_start();
  if($_SESSION['authenticated'] != 'yes') {
  header("Location: http://www.google.com");
 }
?>

我知道它不是最好的,但它试图阻止人们直接访问表单。问题是,如果您转到父页面,那么您可以输入表单URL并到达那里,因为会话是在您访问父页面时启动的。如何销毁会话或解决此问题?

2 个答案:

答案 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();
}

这不是一个防弹解决方案。任何可公开访问的页面都可以通过自动脚本检索。