PHP:如何检测外部访问者的直接请求?

时间:2012-12-15 19:42:50

标签: php jquery dialog http-referer

我想检测/阻止/转发外部访问者的直接请求。某些脚本只应显示在jQuery对话框中。

我目前的代码:

<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>

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

在这种情况下,我想将用户转发到提到的页面,例如:

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

如何检测$ requester和$ server?我不想阻止每个脚本或整个目录!

提前致谢!

4 个答案:

答案 0 :(得分:3)

添加@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");
}

答案 1 :(得分:2)

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

答案 2 :(得分:1)

我在外部请求中输入了这些值:

  

[HTTP_HOST] => 104.219.42.237

     

[HTTP_REFERER] => http:// someurl.com

所以,我的解决方法是:

if (strpos($_SERVER['HTTP_REFERER'], $_SERVER['HTTP_HOST']) !== FALSE) {

    echo 'same origin/request';

} else {

   echo 'different origin/request';
}

...

...

...

以前的解决方案不起作用的原因!

就我而言: $ _SERVER ['HTTP_REFERER'] =='http:// someurl.com'

同时  $ _SERVER [“ HTTP_HOST”]不包含“ http”或“ https”

所以

if($_SERVER['HTTP_REFERER']!=$_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"])

不匹配

另一个答案

if( $_SERVER['REMOTE_ADDR'] == $your_Server_IP_Address)

不适用于本地主机

答案 3 :(得分: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框架)。