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

PHP:如何检测外部访问者的直接请求?,php,jquery,dialog,http-referer,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/"

我想检测/阻止/转发外部访客的直接请求。某些脚本只应显示在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>
如何检测$requester和$server?我不想阻止每个脚本或整个目录


提前谢谢

是的,您可以使用$\u SERVER['remote\u ADDR']检查请求发送方的IP地址的远程地址。这样做:

if($_SERVER['HTTP_REFERER']!=$_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"])
{
    header ("Location: index.php");
}
if( $_SERVER['REMOTE_ADDR'] == $your_Server_IP_Address)
     echo 'From same server';
else
     echo 'from different server';
另一个可能的解决方案是使用:

  • 显示表单时,在其中放置一个隐藏的输入字段,其中包含 随机值

  • 同时,将该随机值存储到 与用户对应

  • 提交表单时,检查隐藏字段是否具有相同的属性 值作为存储在会话中的值

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


注意:这个想法经常被用来帮助对抗CSRF——并集成到一些框架(例如Zend框架)的“表单”组件中。

添加到@Dharman建议的内容中 jQuery在其所有ajax请求中添加一个名为
HTTP\u X\u REQUESTED\u的头,使用
,您只需在
$\u服务器
全局数组中检查该头即可

例如:

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

我根据外部要求提供了这些价值观:

[HTTP_HOST]=>104.219.42.237

[HTTP\u REFERER]=>HTTP://someurl.com

因此,我的解决方案是:

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

    echo 'same origin/request';

} else {

   echo 'different origin/request';
}

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

就我而言: $\u服务器['HTTP\u REFERER']='HTTP://someurl.com'

当 $\u服务器[“HTTP\U主机”]不包含“HTTP”或“https”

所以

不匹配

另一个答案

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

在localhost上不起作用

用户的浏览器在两种情况下都请求表单,比较IP地址是无用的。REMOTE_ADDR表示请求发出的地址,如果站点用户与服务器不在同一本地主机上,则该地址将不同。因此,当用户的浏览器请求php文件时,他可以执行检查仪式。如果通过get request发布表单,则此操作将不起作用method@shawndreck: 谢谢你的通知!但这只是为了避免用户得到未设置样式的表单。
if($_SERVER['HTTP_REFERER']!=$_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"])
if( $_SERVER['REMOTE_ADDR'] == $your_Server_IP_Address)