2

ここで関連する質問をしました。基本的に、私はFlaskで構築された API を持っています。これは、Flask アプリ自体を実行しているのと同じマシンからのみ POST できるようにしたいと考えています。他のすべての POST 要求は、401 Unauthorized の応答を受け取る必要があります。

この時点でそれを達成する方法について少し混乱しています。SOの他の場所(もうどこを思い出せません)REMOTE_ADDRヘッダー/フィールドを比較することがこれを行う適切な方法であると読みました。ここに少なくとも1つの例があります。

ビュー関数でこれを行うと思われるコードをいくつか書きました。

if request.environ.get('REMOTE_ADDR', '127.0.0.1') != '127.0.0.1':
    abort(401)
post_data = request.form
DPC().store(post_data)
return jsonify(post_data), 201

ただし、これらの変更を実装した後でも、外部マシンから API に POST することができました。この機能のために私が書いたテストは、根本的な問題である可能性があるものを偽っています: def test_external_post_fails(self):

    my_data = {
        ...
    }
    result = self.client.post('/daily_population_changes', 
                    data=my_data, 
                    environ_overrides={'REMOTE_ADDR': '127.0.0.2'})
    assert result.status_code == 401

テストは成功します。しかし、問題は正確さではなく正確さの 1 つです。ここで正しいことをテストしていますか? Werkzeug 環境では、リモート リクエストの REMOTE_ADDR の (null 以外の) 値は、実際には'127.0.0.1' と等しくありませんか?

これらのリクエスト オブジェクトに対して希望する値を実際に検査することはまだできていません。(実稼働サーバー上で) POST ホワイトリストが成功していないことを確認するために保存します。おそらく、誰かがすでにこれについての洞察を持っているか、そうでなければ、私はもう少し多くのマシンにアクセスできるようになります.

ありがとう!

4

1 に答える 1

1

あなたをつまずかせるかもしれないことの1つは、を使用することですrequest.environ.get('REMOTE_ADDR', '127.0.0.1')。最初のキーが存在しない場合、sのget()メソッドは2 番目の値を返します。したがって、何らかの理由でdictがない場合は、自動的に で埋められます。'REMOTE_ADDR''127.0.0.1'

次のようなものを試してください:

if request.environ.get('REMOTE_ADDR', False) == '127.0.0.1':

代わりは。それは役に立ちますか?

于 2013-11-01T16:09:29.307 に答える