Mediawiki 登录被取消以防止会话劫持



我刚刚在AS400 IBM i机器上设置了一个MediaWiki 1.29.0页面。我正在使用MariaDB作为数据库。我正在使用 PHP 5.5.37

每次我尝试登录帐户时,都会收到错误:

您的登录会话似乎有问题;作为防止会话劫持的预防措施,此操作已被取消。返回到上一页,重新加载该页面,然后重试。

显然,我正在寻找的行为是登录。

我试过:

  • $wgMainCacheType$wgSessionCacheType更改为CACHE_NONECACHE_ACCELCACHE_DBCACHE_ANYTHING的各种排列。
  • 创建 TMP 目录并设置其权限。
  • 重建我的LocalSettings.php文件。
  • 在 PHP 中设置session.referer_check=off.ini

我已经检查过,我知道我的 cookie 已启用(我可以调用document.cookie;并取回数据)。

这个问题之前已经问过了,里面有链接的问题,但没有解决方案解决了我的问题。他们还处理旧版本的维基媒体,尽管我不知道在这种情况下是否有区别。

编辑:当我尝试创建新帐户时,我也会遇到相同的行为。但是,我能够浏览 wiki、创建页面和编辑页面而不会出现任何错误。

这是我的请求标头:

Cache-Control: private, must-revalidate, max-age=0
Connection: close
Content-language: en
Content-Type: text/html; charset=UTF-8
Date: Thu, 10 Aug 2017 13:48:36 GMT
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Link: </<path>/resources/assets/logo.png?88d75>;rel=preload;as=image
Server: Apache
Set-Cookie: ZDEDebuggerPresent=php,phtml,php3; path=/
Set-Cookie: <wikiname>_session=n7gs0ct99ck5i2juq0togto9q7bfou6u; path=/; secure; httponly
Transfer-Encoding: chunked
Vary: Accept-Encoding,Cookie
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-Powered-By: PHP/5.5.37 ZendServer/8.5.5
X-UA-Compatible: IE=Edge

这是我的响应标头:

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding:gzip, deflate
Accept-Language:en-US,en;q=0.8
Connection:keep-alive
Cookie:ZDEDebuggerPresent=php,phtml,php3
Host:tdidev:10080
Referer:http://<wikiepath>/index.php?title=Special:UserLogin&retirnto=Main+Page
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36

我终于找到了我的问题。默认情况下,MediaWiki传递设置了安全标志的<wikiname>_sessioncookie。摘自OWASP:

安全标志是应用程序服务器在 HTTP 响应中向用户发送新 cookie 时可以设置的选项。安全标志的目的是防止由于以明文形式传输 Cookie 而被未经授权的各方观察到。

为了实现这一目标,支持安全标志的浏览器只会在请求转到HTTPS页面时发送带有安全标志的cookie。换句话说,浏览器不会发送带有未加密HTTP请求设置安全标志的cookie。

所以我的 MediaWiki 安装正确地创建并缓存了一个会话令牌,它甚至仍然通过响应标头传递它。但是,由于我的浏览器看到的是http而不是https,因此仅此而已。Set-Cookie行被简单地忽略。

php.ini中有一个名为session.cookie_secure的设置,但MediaWiki忽略了这个标志。

相反,解决方案是将这一行添加到我的localSettings.php文件的底部:

$wgCookieSecure = false;

当 sessionId 不按顺序更新时,我在另一个应用程序上发生了类似的事情。

因此,通常您请求一个登录表单,它会创建一个带有sessionId的会话,并将其存储在某个地方。

然后您提交表单,将其绑定到原始 sessionId,检查您的身份验证,然后登录原始会话,或创建一个新会话,并更新您的表单(通常使用 HTTPSet-Cookie命令,您可以在网络日志中看到)。

但是你可以遵循一切,通过查看当前cookie中的sessionId,以及表单上的任何令牌(以防止重播),并将其与你的/tmp/php-session-xxx文件(可能在/var/lib/php中)或它存储会话的任何数据库进行检查。

让我意识到我的问题的是,当我准备提交具有特定会话 ID 的表单时,该会话 ID 不再有效。 因此,我未能通过重播检查,并且遇到了与您的错误类似的错误。 事实证明,就我而言,这与数据库的复制方式与下游访问方式不匹配有关,因此我可以尝试访问尚未创建的会话。

查看所有代码,会话 ID 不匹配。wpTokenLogin510a85开头,但您在SetCookie中的 wiki 会话以n7gs0c开头,在您的日志中它谈论6ov933...... 因此,假设您从不同的尝试中复制/粘贴,您需要从干净状态自己运行它,并检查所有内容看起来是否都在使用相同的会话。 如果没有,请尝试弄清楚您拥有的会话发生了什么(如果它已创建/更改)或为什么您没有得到正确的会话,如果它已创建但从未正确传递给您。

也就是说,我只是查看了登录我们自己的内部版本的mediawiki的客户端,wpLoginTokenwikidb_sessionJSESSIONID都不匹配(尽管我希望其中一个出现在wiki日志中,我也无法访问)。

如果必须这样做,请 grep 查找错误消息的源,然后插入error_log(__FILE__.':'.__LINE__.' '.var_export(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS), true));以查找堆栈备份的工作,查看不匹配的内容,以生成错误。

这是MediaWiki持续存在的问题,并且是由于您的密码输入错误,或者MediaWiki在登录过程中无法写入某些内容(数据库,cookie,磁盘文件等)。就我而言,我使用 $wgReadOnly 变量使 wiki 只读。我发现我必须使用 $wgMainCacheType = CACHE_MEMCACHED 才能让我的系统正常工作。

请参阅:https://www.mediawiki.org/wiki/Manual:Memcached

最新更新