【问题标题】:How to compare a variable to first part of HTTP_REFERER?如何将变量与 HTTP_REFERER 的第一部分进行比较?
【发布时间】:2014-09-28 09:17:17
【问题描述】:

请告诉我,如果我有一个变量 $var 返回:http://foo.com - 那么我如何检查这个 uri 是否与 $referrer 返回的相同(假设有一个),或者它的第一部分如果$referrer = http://foo.com/oof/ 或更长..?

用(有什么更好的方法吗?):

$referrer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '';

基本上我想要一个 if/else 案例,用于 uri 何时匹配以及何时不匹配。 我也想知道如果你愿意的话,如何使它成为黑客安全的,这样当$referrer 是这样的假的时候它就不会被欺骗:http://badsite.com/file.php?param1=http://foo.com,所以这里http://foo.com 部分不会是被视为合法匹配。

非常感谢!

【问题讨论】:

    标签: php http url if-statement uri


    【解决方案1】:

    仅检查域:

    $yoursite = ""; //Your site url without http:// or www.
    $yoursite2 = ""; //Type your domain with www. this time
    
    $referer = $_SERVER['HTTP_REFERER'];
    $domain = parse_url($referer); 
    
    if($domain['host'] == $yoursite || $domain['host'] == $yoursite2) {
         //Run your code here normally
    }
    

    【讨论】:

    • 谢谢!请告诉我,'host' 部分是否意味着只有 $domain 中的 http://....com 的初始实例会被检查以匹配,因此不会像我在原始问题中提到的那样容易受到欺骗?
    • 您不能 100% 确定引荐来源网址,因为有人可以中断 http 请求并更改引荐来源网址,而您不知道。
    • 也许您应该开始一个会话并将引荐来源网址存储在其中。它是用户无法接触或了解内容的唯一变量。
    • 这真是个好主意。但是referrer怎么能和domain一样呢?
    • @DenizPorsuk 除非用户第一次打开您的网站,否则他会在您的域上从一个页面导航到另一个页面。因此,如果您想保护页面免受直接访问或热链接,请不要将其设为您的主页。
    【解决方案2】:

    字面意思:

    if( substr($referrer, 0, strlen($var)) == $var)
    

    "如果从referrer开头的子串与搜索词长度相同,则等于搜索词..."

    在某些情况下,推荐人可能不会以您期望的小写字母发送。要考虑这种情况,请考虑尝试:

    if( strcasecmp( substr($referrer, 0, strlen($var)), $var) == 0)
    

    这会在引荐来源网址与搜索词的开头进行不区分大小写的比较。

    【讨论】:

    • 谢谢!但请告诉我 - 这是否只检查字符串本身的长度而不是内容?无论如何,我希望它能够将 $var 内容与 $referrer 的正确部分相匹配,即使后者更长,尽管关于虚假 uri 过滤......
    • 我已经读过了,我认为我要求的是合理的澄清,因为你只提到了字符串长度。请在这方面给我一个答案,或者简而言之,请告诉我你给我的代码是否回答了我的问题中提到的所有问题。我真的很感激。谢谢。
    • 我给出了字面解释。注意:“如果referrer [...]的子字符串[...]等于搜索词”
    • 恕我直言,您不能就您的代码是否完成我在问题中提到的所有内容说“是”或“否”吗? - 那么您非常感谢(没有讽刺!),我将利用免费帮助来充分发挥它的潜力。谢谢。
    • @Alex 我很抱歉,如果我在这里表现得粗鲁或居高临下,但老实说,像我这样声誉得分高的人不会因为发布不完整的答案而危及声誉,至少不是没有适当的免责声明。由于我没有发布这样的免责声明,您可能会认为我给出的答案旨在成为您问题的完整答案。请尝试一下,如果它不起作用或者您可以找到一些方法来破坏它,请告诉我,我会根据需要进行更正。
    猜你喜欢
    • 2019-01-21
    • 1970-01-01
    • 2020-10-20
    • 2017-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    相关资源
    最近更新 更多