1

まあ、質問はそれをすべて言っています、私は疑問に思っています、次のような比較はどれほど安全ですか:

if ($_SERVER['SERVER_ADDR'] === $_SERVER['REMOTE_ADDR']) {
    // yeah, it's the server, go ahead do this.
}

私が尋ねている理由は、サーバー自体から来ているいくつかの Web API 呼び出しを特定することです。

$_SERVER['REMOTE_ADDR']を偽装してリクエストを実行できることはわかっていますが、リクエストから結果を取得することはできません。この場合、たとえばRestについて話すとき、これはたとえばGETリクエストでは問題になりませんが、サーバーからの応答を解析する必要がないDELETEリクエストについてはどうですか.
上記のステートメントが正しい場合、後述の比較を信頼すべきではないということですか?
代替手段は何ですか (ここから CLI を除外しましょう) ?

4

3 に答える 3

1

これは安全な仮定ではありません。@TimWollaが述べたように、サーバーで発生したリクエスト$_SERVER['SERVER_ADDR'] === $_SERVER['REMOTE_ADDR']がなけれtrueば、リクエストがあります。LAN 上の他のデバイスも考慮してください。次の状況を考慮してください。

  • サーバーのローカル IP は192.168.1.2
  • ネットワーク上の悪意のあるユーザーのローカル IP は192.168.1.3
  • ネットワークのパブリック IP は1.2.3.4

サーバーが をリッスンしている場合1.2.3.4:80、悪意のあるクライアントからのリクエスト1.2.3.4:80$_SERVER['REMOTE_ADDR'] = '1.2.3.4'.

このため、サーバーのみがこの機能にアクセスできる必要がある場合は、このポートをインターネットに公開しないでください。サーバー自体から発信されていないすべての着信接続を拒否するように、別のポート (81 など) に別の apache 仮想ホストを構成し、そのポートをファイアウォールで保護する必要があります。

于 2013-06-22T23:29:11.297 に答える
1

最善の解決策は、安全なパスワードを使用することです。

チェックで正しいパスワードのみが許可されている限り、偽の IP アドレスやその他の安全でないチェックについて心配する必要はありません。

if ($_GET['password'] === 'my_password') {
    // code
}

タイミング攻撃を回避するために、安全な比較関数の使用を検討してください。

于 2013-06-22T23:29:51.697 に答える