使WordPress成为核心

开的3年前

关闭15个月前

上次修改时间14个月前

#53290 关闭 缺陷(bug) (固定的)

禁止使用rel=“nofollow ugc”标记评论中的某些链接

报告人: 加尔巴拉斯的个人资料 加尔巴拉斯 所有者: 乔宾的简介 约宾
里程碑: 6.2 优先: 正常的
严重程度: 正常的 版本: 5.7.2
组件: 评论 关键词:
重点: 复写的副本:

描述

假设不应遵循用户生成的内容链接,这通常是合理的。然而,也有一些例外,其中一些可以通过过滤器来克服,而另一些则没有例外。

  1. 功能获取注释_作者链接()不应该随意修改作者链接。虽然它的输出可以被过滤,但最好防止为特定作者添加链接标签。这可以通过在wp-includes/comment-template.php的第223行添加以下代码来实现:
if(空($url)||'http://'==$url||in_array(get_comment_author($comment_ID),apply_filters('comment_authors_link_allowed',[])){return=$author;}
  1. 功能wp_rel_ugc()也不应该随意修改作者链接。它应该获得注释ID并使用评论链接允许作者过滤以防止修改某些作者的链接。然后,函数顶部变为:
函数wp_rel_ugc($text,$comment_ID){if(in_array(get_comment_author($comment_ID),apply_filters('comment_authors_link_allowed',[])){返回$text;}
  1. 功能wp_rel_callback()应接受允许的域列表,默认情况下应包括本地域。wp-includes/formatting.php的第3075行应为:
if(!空($atts['href'])&&!in_array($atts['ref'],apply_filters('comment_link_allowed_domains',[get_option('home'))){

这些更改将提供注释链接标记功能中当前缺少的灵活性。

更改历史记录(10)

#1个 @丹科普
3年以前

只是留下一条评论来支持这些改变。内部链接不应被拒绝,即使是用户留下的。

把我想象成在评论中回复用户,并将他们指向网站上不同的页面的作者。这是作者发布的内部链接,不应该是“nofollow ugs”

第二种情况-用户使用指向网站上不同页面的链接回复另一个用户。尽管这是用户生成的内容,但它仍然是一个内部链接,不应该被拒绝。

#2 @托马斯普利
16个月以前

工作时#56444我打开了一个公关,我认为它也解决了这里提出的问题。请参见https://core.trac.wordpress.org/ticket/56444#评论:8

#3 @托马斯普利
15个月以前

我相信我已经解决了第2点和第3点#56444.

我正在重读这篇文章,并试图将我的注意力集中在第1点上:

函数get_comment_author_link()不应随意修改作者链接。虽然它的输出可以被过滤,但最好防止为特定作者添加链接标签。这可以通过在wp-includes/comment-template.php的第223行添加以下代码来实现

建议添加的代码实际上并不会对rel属性进行过滤。

正如现在的代码一样,评论作者链接总是被允许的(如果提供的话),并且总是用rel=“外部nofollow ugc”我相信这一问题的精神是创建一个可过滤的评论作者名单。最后出现的评论作者不会将ugc添加到他们的评论作者链接中。

此外,默认情况下不应添加“external”和“ugc”属性,而应仅在适用时添加它们。

我添加了一些新代码,以我理解的方式解决此问题,请参阅https://github.com/WordPress/WordPress-develop/pull/3825

在重写之后,我开始着手进行一些测试,但我没有看到针对该函数的任何现有单元测试。我认为在以下位置添加新文件是“安全的”tests/phpunit/tests/comment/getCommentAuthorLink.php其中可以编写该功能的新测试。我已经开始了基线测试,但遇到了一个半相关的错误。我不确定我是否应该为此打开一个新问题,或者仅仅解决这个问题:

如果你打电话获取注释_作者链接()并且不通过$注释id(而且没有$GLOBALS[注释]set)函数返回错误的过滤器$条评论不是对象,$comment->comment_ID无法访问。

我认为在函数的第一行之后立即提前返回是有意义的(如果获取注释()返回null)。但我不确定这是否是这样一个函数的“标准”约定:在这种情况下,这样的函数返回空,没有过滤器。或者,这可能是“已知”和“预期”的,应该忽略。

无论如何,如果我对第1点的解决方案看起来合理,我将在接下来的几天内编写一些测试。

谢谢

#4 @加尔巴拉斯
15个月以前

我认为你的方法应该很有效。

效率的一点可能是为内部主机列表使用静态变量,而不是每次都对函数中的函数应用筛选器wp_internal_hosts()被调用。

进一步优化来自wp_internal_hosts()可以直接用于wp_is_internal_link()设置静电$内部主机,而不是应用数组映射()每次通话。

这样的话:

<?php(电话)
功能 wp_is_internal_link( $链接 ) {
        静止的 $内部主机

        $链接 = strtolower公司( $链接 );
        如果 ( 阵列中(_A)( wp_parse_url( $链接, PHP_URL_SCHEME公司 ), wp_允许的协议(), 真的 ) ) {
                如果 ( 空的( $内部主机 ) {
                        $内部主机 = 阵列映射( “strtolower”, 应用筛选器( “wp_internal_hosts”, 阵列( wp_parse_url( 主页url(), PHP_URL_主机 ) ) ) );
                }
                返回 阵列中(_A)( wp_parse_url( $链接, PHP_URL_主机 ), $内部主机, 真的 );
        }

        返回 

}

正在查看wp_allowed_protocols(),这正是协议的存储方式,因此这应该是一致的,并且是高效的。

#5 @托马斯普利
15个月以前

谢谢@galbaras,这对我来说很有意义。我会根据你的反馈进行更新。我在处理这个时注意到一些问题,所以我暂停打开#57615我很快就会回到这里。

#6 @约宾
15个月以前

  • 里程碑已从更改等待审查6.3
  • 所有者设置为约宾
  • 状态已从更改新的分配

这将与#56444所以转到6.3

这张票是在松弛(Slack)jorbin的in#core。查看日志.


15个月以前

#8 @约宾
15个月以前

  • 分辨率设置为固定的
  • 状态已从更改分配关闭

55289:

注释:改进注释中rel属性的使用。

应该遵循内部链接,并且应该更容易修改注释上的其他rel属性。这添加了一个helper函数,用于确定URL是否为内部URL,还添加了一些新的过滤器,以便于修改注释中的rel属性。

道具托马斯普利、德斯罗什、萨伯恩哈特、贝尼什74、萨米亚莫特、加尔巴拉斯、约宾。

修复#53290,#56444.

#9 @约宾
15个月以前

  • 里程碑已从更改6.36.2

#10 @谢尔盖·比尤科夫
14个月以前

55495:

格式:恢复中的一致引号_生成web _ftp_clickable_cb().

在引入_make_clickable_rel_attr()在之前的提交中,该函数最终返回了带有单引号和双引号的链接标记。

此承诺确保_生成web _ftp_clickable_cb()始终返回双引号,恢复与使用的其他类似回调函数的一致性make_clickable():

  • _make_url_clickable_cb()
  • _make_email_clickable_cb()

后续行动[55289].

请参见#53290,#56444.

注:请参见TracTickets公司有关使用的帮助门票。