【问题标题】:PHP detecting a redirect to selfPHP检测到自我的重定向
【发布时间】:2016-04-20 10:55:58
【问题描述】:

如果重定向到itelf,是否可以在php中检测到重定向?

简而言之;我可以在页面顶部添加一两行代码来首先检查页面是否是重定向。如果是行动呢?

PHP 提交时执行的最后一行

header("Location: " . $_SERVER['REQUEST_URI']);

HTML 表单

<form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>?submit=true" method="POST">

php还是新手,所以一点点学习。基本上,如果页面被重定向,我需要控制一些变量,但前提是。

【问题讨论】:

  • 不要使用PHP_SELF,它很容易被入侵。
  • 并在您的 Location 标头后添加 exit
  • 您可以尝试使用headers_list() 函数嗅探标头,以检测当前脚本上是否存在'Location: ...' 标头。
  • 我认为您的评论 re: session is overkill 表明您似乎并不真正了解 PHP 编程,例如,您不了解 潜力存在,您可能只看到您会做什么,而不是看到任何人和其他人可能对您的表单做什么?会话非常简单,相当直接且相对安全。使用它们。

标签: php


【解决方案1】:

如果您想防止在页面刷新时重新提交表单,那么您的解决方案确实应该将表单数据发布到保存数据的 另一个 页面,然后使用 header("Location:...) 返回表格。用户不会更聪明,表单页面的刷新永远不会导致重新提交。

另外,这也意味着您不再需要使用PHP_SELF。作为一个额外的建议,使用"http://".$_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME'] 通常要好得多,因为 PHP_SELF 可能会由浏览器/用户添加额外的数据,这可能会导致您出现问题。

how to defend yourself against CSRF attacks 也值得一读。

【讨论】:

  • 我不明白你的评论?如果您在使用其他文件时遇到问题,那是您的要求,而不是行业标准或代码的允许范围。
  • 关于这个主题的信息太多了,一个行业标准对于新手来说根本不明显。我最初确实在单独的文档中构建了 php 脚本,但是许多单独的来源提到引用 ($_SERVER["PHP_SELF"]);
  • 它们的来源很差。一种语言(或任何东西)越流行,就会有越多的人认为他们知道,他们会使用他们从其他认为他们知道的人那里听到的东西。我会非常礼貌地强调不应使用 PHP_SELF,并且可以从我在答案中编写的代码中更安全地使用相同的数据,另外请仔细阅读 CSRF 链接,这些东西是一个非常强大(并且相对容易修复)的问题,许多优秀的程序员都无法理解。甚至 Youtube 也深受其害。@Beaniie
  • 理解并承认,我将阅读并修改我的解决方案,用您的答案测试实现。
  • 如果你必须,必须(真的必须),使用同一个页面,使用isset($_POST["something_from_the_form"])知道它被提交了。
【解决方案2】:

把它放到你的脚本里看看它的内容;

<pre>
<?php print_r($_SERVER); ?>
</pre>

通过这种方式,您可以找出哪些键包含“什么”,您可以获得哪个索引具有引用者并编写您的 If 条件

您可以使用 $_SERVER['HTTP_REFERER'] 来获取喜欢的引荐来源网址

if(isset($_SERVER['HTTP_REFERER'])){
    $cur_p="http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']
    if($_SERVER['HTTP_REFERER']==$cur_p){
        //add your code here you want to do what if current == referer
    }
} 

但 HTTP_REFERER 索引并不总是设置,因此您也可以使用 javascript 之类的

if(document.referrer == location.href){
    //add your code
}

让我知道这是否有帮助

【讨论】:

  • 抱歉,这不是答案。这应该是一条评论(尽管我知道您还没有代表发表评论)
  • 这和我告诉过你的一样 打印服务器数组变量以查看所有索引并找到哪个索引具有引用 url,如果没有找到索引或为空,您可以从该索引获取值这意味着没有推荐人
  • 这不一样,因为链接引用了值是什么以及它们的含义。另外,请在您对答案的评论中添加此更多信息,使其更像一个答案!
  • 您可以使用 $_SERVER['HTTP_REFERER'] 来获取引用者,例如 if(isset($_SERVER['HTTP_REFERER'])){ $cur_p="http://".$_SERVER ['HTTP_HOST'].$_SERVER['REQUEST_URI']; if($_SERVER['HTTP_REFERER']==$cur_p){ add your code here } } 但 HTTP_REFERER 索引并不总是设置,所以你也可以使用 javascript if (document.referrer == location.href) { add your code }让我知道这是否有帮助
  • 编辑您的回答器并将这些评论详细信息放入您的答案中。使它们更易于阅读。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-13
  • 2012-07-14
  • 1970-01-01
  • 2011-01-29
  • 1970-01-01
  • 2016-02-11
  • 1970-01-01
相关资源
最近更新 更多