2011-03-06 101 views
0

我有几种形式通过jQuery .ajax funciton引入。在父页面,我开始喜欢这个帮助PHP session_destroy();

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

然后在形式加载一个会话有一个这样的检查:

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

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

+0

请尝试解释您为什么要进行此项检查?哪些表单是不允许直接访问的人? – middus

回答

1

您可以在您的表单.php代码中查看$_SERVER['HTTP_REFERER']以查看请求来自何处。 AJAX调用会将HTTP_REFERER设置为它从中调用的页面。

 
if (strpos($_SERVER['HTTP_REFERER'], $_SERVER['HTTP_HOST']) === false) { 
    die(); 
} 

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

+0

@Dimitry - 这样的标准解决方案是什么? –

+0

我已经与公众形式不被垃圾邮件自动化机器人的想法搏斗。解决办法是引入一个只有人类可以解决的行动。不幸的是,这意味着CAPTCHA或认证。您还可以使用facebook/google/linkedin登录功能来确保您的用户不是机器人。 – Dimitry

+2

同时检查'$ _SERVER ['X_REQUESTED_WITH']'。 – seriousdev

2

实际上,你不能。

为了使它更加复杂,不要直接请求表单URL。尽量要求每个主要页面的请求授权令牌:

  • 如果生成的主页,你知道的形式事先提出要求,然后生成令牌例如使用md5(time()。rnd()),将每个表单与您的表单相关联并将关联保存在您的会话中

  • 然后,您的JS代码将不会请求表单URL,而是使用令牌注入JS代码

  • 如果你发现在你的会话已保存的关联令牌,发出的形式和在会话中删除令牌

这样,每个表单只能通过一次前面的主页调用请求。

请注意,这不是完全安全过:如果用户请求使用wget的主页的URL,他可以要求每个表格一次。

+0

Pantke - 在当时,这超出了我的理解,希望将来我能够完成类似 –

+0

@Dirty Bird Design - 如果您想尝试一下并需要进一步的帮助,请在这里继续。 – SteAp

+0

我甚至不知道从哪里开始。我的父页面通过点击函数使用.load加载表单从一个js文件,其中还包括所有的验证。 –