Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Typecho升级到1.2.0后所有文章不能回复 #1414

Closed
RucLinux opened this issue Apr 22, 2022 · 4 comments
Closed

Typecho升级到1.2.0后所有文章不能回复 #1414

RucLinux opened this issue Apr 22, 2022 · 4 comments

Comments

@RucLinux
Copy link

问题所出网站:https://www.python.hn.cn/
问题描述: 因为某个视频网站的视频链接解析,需要设置 所以博客上所有文章均不能正常回复了。
<meta name="referrer" content="no-referrer">
1、点击提交按钮,没有任何反应,前台和后台均看不到该回复,在审核中也看不到该回复。
2、尝试过取消 “检查评论来源页 URL 是否与文章链接一致”和“开启反垃圾保护”两项选项,有效果。但这我将失去反垃圾保护。
3、删除 后一切正常。但是我却需要这一条。

请教大家,如何可以在不影响目前视频解析的情况下,修复或者解决这个问题呢?谢谢大家了。

官方反馈地址:https://forum.typecho.org/viewtopic.php?t=15595

LgNgrn

@Showfom
Copy link

Showfom commented Apr 22, 2022

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Referrer-Policy

把你服务器的 Referrer Policy 设置 same-origin 即可

你直接改成

<meta name="referrer" content="same-origin">

这样只会给同域名的网页发 Referrer 第三方网页不会发 Referrer

@RucLinux
Copy link
Author

RucLinux commented Apr 22, 2022 via email

@RucLinux
Copy link
Author

RucLinux commented Apr 24, 2022

谢谢您的回复,您的方法可以解决这个问题,但我也想了解源码中如何学习修改。

1、我尝试了修改了 /var/Widget/Security.php 中的 以下这一段,将getReferer()替换成了getRequestUrl(),这么做没有效果。

/**
 * 保护提交数据
 */
public function protect()
{
    if ($this->enabled && $this->request->get('_') != $this->getToken($this->request->getReferer())) {
        $this->response->goBack();
    }
}

2、我尝试修改了 /var/Widget/FeedBack.php 文件中的以下这一段,但是这么做也没有效果。

  /*
     * 这是新增的代码,替代 getReferer() 函数 
     */
    public function typechon_get_referer()
    {
        if (strpos($_SERVER["HTTP_HOST"], "www.python.hn.cn") !== false || strpos($_SERVER["HTTP_HOST"], "mangshe.python.hn.cn") !== false) {
            $tycode = $_SERVER["HTTP_HOST"];
        }
        return $tycode;
    }

然后将这个自定义函数 typecho_get_referer 的返回值替换掉以下代码的$referer参数由getReferer()获取的变量。

               /** 检查来源 */
                if ($this->options->commentsCheckReferer && 'false' != $this->parameter->checkReferer) {
                    #$referer = $this->request->getReferer(); //这里改成
                    $referer = typechon_get_referer();

但是这么做会显示失误,前台不能进行登陆了。

@sy-records
Copy link
Member

修改getReferer方法,能通过这一坨代码就可以

$refererPart = parse_url($referer);
$currentPart = parse_url($this->content->permalink);
if (
$refererPart['host'] != $currentPart['host'] ||
0 !== strpos($refererPart['path'], $currentPart['path'])
) {
//自定义首页支持
if ('page:' . $this->content->cid == $this->options->frontPage) {
$currentPart = parse_url(rtrim($this->options->siteUrl, '/') . '/');
if (
$refererPart['host'] != $currentPart['host'] ||
0 !== strpos($refererPart['path'], $currentPart['path'])
) {
throw new Exception(_t('评论来源页错误.'), 403);
}
} else {
throw new Exception(_t('评论来源页错误.'), 403);
}
}
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants