プロジェクト

全般

プロフィール

Bug(バグ) #3934

未完了

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

Youichi Kimura さんが8年以上前に追加. ほぼ5年前に更新.

ステータス:
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 に置き換えることで当チケットの不具合は解決する。

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