将网址转换为链接安全吗?

发布于 2024-10-24 06:30:39 字数 242 浏览 3 评论 0原文

我想将用户评论中的网址转换为链接。

我没有时间测试像 HTML Purify 这样臃肿的反 xss 库,所以我不会允许任何 html 标签。

我只想让所有内容都通过 htmlentities() 和 nl2br() 进行,然后使用 preg_replace() 查找 url 并将它们转换为链接('a' html 标签)。

获取我找到的网址并将其放入 href='' 内是否不安全?

如果没有,我该怎么办?

I want to turn urls in the user comments, into links.

I don't have time to test bloated anti-xss libraries like HTML Purify, so I wouldn't be allowing any html tags.

I just want to make everything go through htmlentities() and nl2br(), and then use preg_replace() to find urls and turn them into links ('a' html tags).

Is it unsafe to grab the urls I find and put them inside href='' ?

If not, what can I do about it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

杀手六號 2024-10-31 06:30:39

是的,应该是安全的。如果您想知道如何实现,这是我用于此目的的一个函数(为了本文的目的,我对其进行了简化):

function formatPost($string) {
    return nl2br(
        preg_replace_callback(
            '~https?://([^/\s]+)(?:/((?>[/\w]+|\S(?!\s|$))*))?~',
            function($matches) {
                $url  = $matches[0];
                $host = $matches[1];
                $path = isset($matches[2]) ? $matches[2] : '';
                $follow = false;

                if ('' == $path) {
                    $text = $host;
                } elseif ($_SERVER['HTTP_HOST'] == $host) {
                    $text = $path;
                    $follow = true;
                } else {
                    $text = $host . '/' . $path;
                }

                return '<a href="' . $url . '"' . (!$follow ? ' rel="nofollow"' : '') . '>' . $text . '</a>';
            },
            htmlspecialchars($string)
        )
    );
}

Yes, it should be safe. If you wonder how, here is a function I use for this (I simplified it for the purpose of this post):

function formatPost($string) {
    return nl2br(
        preg_replace_callback(
            '~https?://([^/\s]+)(?:/((?>[/\w]+|\S(?!\s|$))*))?~',
            function($matches) {
                $url  = $matches[0];
                $host = $matches[1];
                $path = isset($matches[2]) ? $matches[2] : '';
                $follow = false;

                if ('' == $path) {
                    $text = $host;
                } elseif ($_SERVER['HTTP_HOST'] == $host) {
                    $text = $path;
                    $follow = true;
                } else {
                    $text = $host . '/' . $path;
                }

                return '<a href="' . $url . '"' . (!$follow ? ' rel="nofollow"' : '') . '>' . $text . '</a>';
            },
            htmlspecialchars($string)
        )
    );
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文