3

我想检测/防止/转发外部访问者的直接请求。某些脚本只应显示在 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

4 回答 4

4

要添加@Dharman 建议的内容,jQuery 会在其所有调用的 ajax 请求中添加一个标头,以便您可以简单地检查全局数组HTTP_X_REQUESTED_WITH中的此标头。$_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");
}
于 2012-12-15T20:12:03.713 回答
2
if($_SERVER['HTTP_REFERER']!=$_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"])
{
    header ("Location: index.php");
}
于 2012-12-15T19:48:06.187 回答
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)

不能在本地主机上工作

于 2019-06-01T15:00:45.033 回答
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 框架)的“表单”组件中。

于 2012-12-15T19:50:53.383 回答