0

ユーザーにシステムへのアクセスを許可する前に、有効にしたいURL内にhmacを送信しています。ユーザーデータベースがないため、URLパラメーターを検証して、正しいサーバーによって生成されたことを確認します。ユーザーは、これらのパラメーターを変更してシステムの他の部分にアクセスすることはできません。

誰かがSecurityServiceProviderで同様のことをしたかどうか疑問に思います。これは、ルーティングとセキュリティファイアウォールルールの後に起動されるbeforeミドルウェアを使用して実行できます。可能であれば、ファイアウォールでこのリクエストを停止したいと思います。

4

1 に答える 1

0

silex のミドルウェア機能「before」を使用することにしました。これはおそらく最善の方法ではないと確信していますが、私のアプリにはユーザーまたは認証がないため、キーが正しいことを確認して応答を返すだけで済みます。これを改善するためのコメントがあれば、ぜひ聞きたいです。

外部システムが URL を生成する場合、構成ファイルで定義され、$app['config']['hmac_key'] からアクセスできる共有秘密鍵を使用する必要があります。hmac は、パス内の hmac の後のすべてに対して生成されます。したがって、サブフォルダー domain.com/folder/hmac/arg1/arg2/arg3 を取得した場合。before フィルターはルートを hmac で分割し、その後にパスを構築します。

// Before firing the controller check the hmac matches, otherwise return 403.
$app->before(function (Request $request) use ($app) {
    // 40 chars in a sha1 hmac hash
    if(!preg_match('/^[0-9a-f]{40}$/i', $request->get('hmac')))
        $app->abort(403, "Invalid key.");

    // break the route down to the arguments used in hmac
    $route = explode('hmac_', $request->get('_route'));
    $route = explode('_',$route[1]);
    // build the path used to generate hmac
    $path = array();
    foreach($route as $r)
        if($v = $request->get($r))
            $path[] = $v;

    $path = implode('/', $path);

    // Generate hmac hash from path and key
    $hmac = hash_hmac("sha1", $path, $app['config']['hmac_key']);

    // If the hmac's don't match return 403
    if($hmac !== $request->get('hmac'))
        $app->abort(403, "Invalid key.");
});
于 2013-03-11T05:02:31.590 に答える