プロジェクト

全般

プロフィール

Bug(バグ) #3934

:80, :443 以外のポートでアクセスするSNSでOAuth署名の検証に失敗する

Youichi Kimuraほぼ8年前に追加. 約4年前に更新.

ステータス:
New(新規)
優先度:
Normal(通常)
担当者:
-
対象バージョン:
開始日:
2016-04-25
期日:
進捗率:

0%

3.6 で発生するか:
Yes (はい)
3.8 で発生するか:
Unknown (未調査)

説明

Overview (現象)

http://sns.example.com:8080/ のように :80, :443 以外のポートに設置された SNS で、opWebAPIPlugin などが提供する API に OAuth を使用してアクセスしようとすると OAuth 署名の検証に失敗してエラーとなる。

その際に、Apache の error_log には下記のようなエラーが記録される:

[Mon Apr 25 09:08:16.854133 2016] [fcgid:warn] [pid 27166:tid 139768981554944] [client 10.0.2.2:60103] mod_fcgid: stderr: Invalid signature

Causes (原因)

source:lib/vendor/OAuth/OAuth.php@43190aa1#L190

  public static function from_request($http_method=NULL, $http_url=NULL, $parameters=NULL) {
    $scheme = (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] != "on")
              ? 'http'
              : 'https';
    @$http_url or $http_url = $scheme .
                              '://' . $_SERVER['HTTP_HOST'] .
                              ':' .
                              $_SERVER['SERVER_PORT'] .
                              $_SERVER['REQUEST_URI'];

上記のコードは OAuthRequest::from_request() メソッドの冒頭部分であるが、例えば http://sns.example.com:8080/ のような URL にアクセスがあった場合は上記の $_SERVER['HTTP_HOST'] には sns.example.com:8080 の文字列が入る。
つまり、この場合の $http_urlhttp://sns.example.com:8080:8080/ という文字列が生成されてしまう。
この $http_urloauth_signature の検証にも使用される文字列であるため、最終的には署名の検証に失敗し不正なリクエストとして扱われることになる。

Way to fix (修正内容)

この不具合は lib/vendor/OAuth/OAuth.php の問題であるが、 https://code.google.com/archive/p/oauth/issues/170 の通り既に報告がされており修正も済んでいる。
そのため、lib/vendor/OAuth/OAuth.php を最新の https://oauth.googlecode.com/svn/code/php/OAuth.php に置き換えることで当チケットの不具合は解決する。

履歴

#1 kaoru nほぼ7年前に更新

  • 対象バージョンOpenPNE 3.9.0-old から OpenPNE 3.9.0 に変更

#2 kaoru n約4年前に更新

  • 対象バージョンOpenPNE 3.9.0 から OpenPNE 3.10.x に変更

他の形式にエクスポート: Atom PDF