2012-12-15 48 views
2

我想检测/阻止/转发外部访问者的直接请求。一些脚本只能显示在jQuery对话框中。PHP:如何检测外部访问者的直接请求?

我当前的代码:

<script> 
$(".dialog").click(function() { 
    // some code for validation 
    // ... 
    $("#dialog").load(this.href).dialog(); 
}); 
</script>  

<a href="http://domain.de/path/to/form/" class="dialog">Open me in a dialog</a> 

这工作正常,但如果我打开一个新标签/窗口此链接(例如,通过点击鼠标中键),表单将显示“裸”。

在这种情况下,我想给用户转发到refered页面,例如:

if ($requester != $server) { 
    header ("Location: " . $_SERVER["HTTP_REFERER"]; 
} 

我怎样才能检测$请求者和$服务器?我不想阻止每个脚本或整个目录!

在此先感谢!

回答

4

添加到@Dharman建议的内容 jQuery为所有名为HTTP_X_REQUESTED_WITH的ajax请求添加了一个头,因此您可以在$_SERVER全局数组中简单检查该头。

例子:

 
if($_SERVER['HTTP_REFERER']!=$_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"]) 
{ 
    // check if the request is ajax 
    if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && 
      $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest'){ 
      // ajax content loading 
    } 

    header ("Location: index.php"); 
} 

2
if($_SERVER['HTTP_REFERER']!=$_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"]) 
{ 
    header ("Location: index.php"); 
} 
+1

如果一个形式是通过GET请求方法发布 – shawndreck

+0

@shawndreck这是行不通的:感谢您的通知!但这只是为了避免用户获得无形式的表单。 –

+1

不客气。那么它应该做的工作! – shawndreck

0

是的,你可以使用$ _ SERVER [“REMOTE_ADDR”]请求发送方的IP地址检查远程地址。像这样做:

if($_SERVER['REMOTE_ADDR'] == $your_Server_IP_Address) 
    echo 'From same server'; 
else 
    echo 'from different server'; 

另一种可能的思路解决方案是使用一个nonce

  • 当显示形式,把隐藏的输入字段在里面,包含 随机值

  • 同时,将该随机值存储到 对应于用户的会话中。

  • 提交表单时,检查隐藏字段的值是否与存储在会话中的值相同 。

如果这两个值不相同,则拒绝使用提交的数据。

注:这个想法经常被用来帮助防止CSRF战斗 - 和集成在一些框架(Zend框架,例如)的“表”的组成部分。

+1

用户的浏览器在BOTH实例中请求表单,比较IP地址是无用的。 – nickb

+2

REMOTE_ADDR表示请求来自的地址,如果站点的用户与服务器不在同一本地主机上,则该请求将会不同。 – shawndreck

+0

因此,当用户的浏览器请求php文件时,他可以执行检查仪式。 – Chipmunk