【问题标题】:PHP External Link HelpPHP 外部链接帮助
【发布时间】:2011-05-14 11:05:25
【问题描述】:

您好,我有以下页面,它设置了一个带有当前 URL 的 cookie 以及一个简单的外部链接。

<?php

function pageURL()
    {
        $pageURL = 'http';
        if ($_SERVER["HTTPS"] == "on")
        {
            $pageURL .= "s";
        }
        $pageURL .= "://";
        if ($_SERVER["SERVER_PORT"] != "80")
        {
            $pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
        } 
        else
        {
            $pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
        }
        return $pageURL;
    }

    $CurrentPage = pageURL();

    setcookie('linkback', $CurrentPage);

?>

<p><a href="http://www.google.com/">External Link</a></p>

我想要做的是使用 PHP 为所有外部链接添加前缀,以便它们具有以下结构:

localhost/outgoing?url=http://www.google.com/

这会像这样加载一个传出页面:

    <?php

    if(!isset($_GET['url']))
    {
        header('HTTP/1.0 404 Not Found');
    }

    ?>

<h1>Warning! Now leaving website</h1>

    <ul>
                <li><a title="Return to Website" href="<?php if(isset($_COOKIE['linkback'])) { echo $_COOKIE['linkback']; } else { echo 'http://localhost:8888/creathive/'; } ?>">Return to Website</a></li>
                <li><a title="Continue to <?php echo $_GET['url']; ?>" href="<?php echo $_GET['url']; ?>">Continue to <?php echo $_GET['url']; ?></a></li>
            </ul>

这个想法是,使用上一页中设置的 cookie,我可以有一个简单的后退按钮,还可以从查询中获取 url,并允许用户在被警告离开站点后继续。

我遇到的问题是:

1.) 为外部 URL 添加前缀,以便它们转到传出页面

2.) 如果用户在没有 url 查询字符串的情况下访问传出页面但不是,则传出页面顶部的 isset 应该抛出 404

3.) 需要确保 URL 有效,例如防止这种情况发生:localhost/outgoing?url=moo

【问题讨论】:

    标签: php


    【解决方案1】:

    您需要根据新方案替换代码中的每个外部 URL。无法对所有传出链接自动执行此操作。

    这是因为,如果用户点击外部 URL,请求不会发送到您的服务器,而是发送到外部服务器。

    编辑: 您唯一能做的就是使用ob_start() 缓存所有输出,然后使用正则表达式替换所有链接,然后再将它们打印到您的页面上。

    但更好的解决方案是自己替换所有链接。

    【讨论】:

    • 我喜欢 OB_Start 的想法,你能告诉我如何使用它来更改所有外部网址吗?
    • 正则表达式不是用于 DOM 操作的工具,在这种情况下是这样。
    【解决方案2】:
    1. 你能详细说明一下吗?

    2. Isset 并不是“正确”的工具。试试 arrya_key_exists('url', $_GET)…。像这样的代码应该可以。

        function haveUrl() {
                if (array_key_exists('url', $_GET)) {
                $url = $_GET['url'];
                if (!empty($url)) return true;
            }
            return false;
        }
    
    1. 您可以简单地检查它们是否以 http:// 或 https:// 开头...最好使用正则表达式...。像……
        function validUrl($url) {
            if (preg_match('\^(http:\/\/|https:\/\/)\mi', $url) {
                if (preg_match('\localhost\mi', $url) return false;
                else return trus;
            }
            return false;
        }
    

    【讨论】:

    • 对于 1.) 把这个 http://www.domain.com/ 变成这个 http://www.mywebsite.com/outgoing?url=http://www.domain.com/
    【解决方案3】:

    1) 我会为所有链接创建一个类,并使用类似 $links->create("http://...") 在那里你放置重定向和你可能需要的一切。

    3)

    您可以使用以下链接中的代码: link text

    【讨论】:

      【解决方案4】:

      1.) 为外部 URL 添加前缀,以便它们转到传出页面

      为此,您需要一个 DOM 工具。例如SimpleXMLSimple HTML DOM parser 或任何一种操作您正在呈现的页面上的传出链接的方法。 (在this question 中查找更多可用选项。)

      理想情况下,您将缓存此操作的结果,因为它可能非常昂贵(读取:慢)并在更新时或在定义的时间段后更新缓存的版本。

      2.) 如果用户在没有 url 查询字符串的情况下访问传出页面但不是,则传出页面顶部的 isset 应该抛出 404

      是的,但如果您不想渲染页面的其余部分,则需要在此之后停止执行。 404 错误可以而且应该! - 有一个页面正文,它是一个与任何其他 HTTP 响应一样的响应。

      3.) 需要确保 URL 有效,例如防止这种情况发生:localhost/outgoing?url=moo

      即使您这样做了——实际上您应该这样做,也没有什么可以阻止任何人通过手动 URL 操作访问 localhost/outgoing?url=foo。网址参数或任何其他用户输入永远不能被信任。换句话说,无论如何您都需要检查传出脚本中的传出网址。

      别忘了严格消毒!像这样的功能被滥用了。

      【讨论】:

        猜你喜欢
        • 2011-01-23
        • 2011-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-12
        • 1970-01-01
        • 1970-01-01
        • 2011-11-10
        • 1970-01-01
        相关资源
        最近更新 更多