0

クロスサイト JSON リクエストを処理するサーバーを作成しました。これは、ajax によって呼び出されることを意図した API です。動作しましたが、まだ奇妙な警告が表示されます。

一部の API 呼び出しは POSTS であるため、この警告をトリガーするプリフライト OPTIONS リクエストがあります (薄い出力):

127.0.0.1 - - [15/Aug/2013 22:24:20] "OPTIONS /login HTTP/1.1" 200 - 0.0080
W, [2013-08-15T22:24:20.124254 #3236]  WARN -- : attack prevented by Rack::Prote
ction::HttpOrigin

これを引き起こすリクエストのプリフライト ヘッダーは次のとおりです。

OPTIONS /login HTTP/1.1
Host: localhost:3000
Connection: keep-alive
Access-Control-Request-Method: POST
Origin: http://localhost:4567
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36
Access-Control-Request-Headers: origin, content-type
Accept: */*
Referer: http://localhost:4567/index.html
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8

さらに、この警告が表示される理由を知りたいです。

SECURITY WARNING: No secret option provided to Rack::Session::Cookie.
This poses a security threat. It is strongly recommended that you
provide a secret to prevent exploits that may be possible from crafted
cookies. This will not be supported in future versions of Rack, and
future versions will even invalidate your existing user cookies.

CORS xhr を許可する必要があるヘッダーを含むサーバー コードを次に示します。

enable :sessions

before do

  headers['Access-Control-Allow-Origin'] = 'http://localhost:4567'
  headers['Access-Control-Allow-Headers'] = 'origin, content-type, accept'
  headers['Access-Control-Allow-Credentials'] = 'true'

  if request.request_method == 'OPTIONS'
    headers["Access-Control-Allow-Methods"] = "POST, GET"
    halt 200
  end
end
4

1 に答える 1

1

これは実際には 2 つの関連する質問です。一度に 1 つずつ説明します。

  1. this SO questionによると、オリジン ホワイトリストを Sinatra に提供する必要があるようです。基本的に、ユーザーに害を及ぼす可能性のあるクロス サイト スクリプティング攻撃からユーザーを保護しようとしています。ただし、クロス サイト スクリプティングの実行を許可したい場合もあります。そのためには、次のようなことができます。

    set :protection, :origin_whitelist => ['http://web.example.com']
    

    ヘッダーはユーザーのブラウザーにのみ適用されますが、Rack にも許可が必要です。2 ラインのディフェンス。詳細については、Rack::Protection のドキュメントを参照してください(これは Sinatra がここで使用しているものです)。

  2. 「シークレット オプション」エラーは、Rack::Session の設定を参照しています。Rack::Session 機能を使用する場合、次のようにシークレットに渡すことができます。

    use Rack::Session::Cookie, :key => 'rack.session',
                               :domain => 'foo.com',
                               :path => '/',
                               :expire_after => 2592000,
                               :secret => 'change_me'
    

    単純な の代わりに上記を実行しenable :sessionsます。Rack::Sessionのドキュメントもここにあります。

于 2013-08-16T10:24:47.380 に答える