3

PHPアプリケーション用の安らかなAPIを構築しています。現時点では、API は json のみを受け入れて応答します。リクエスト、ルーティング、レスポンスはすべてフレームワークによって処理されますが、カスタム認証メカニズムを構築する必要がありました。

セキュリティを強化し、リプレイ攻撃を回避するために追加したい項目が 2 つあります。タイムスタンプとナンスです。

  1. これらの 2 つの項目に加えて、セキュリティや使いやすさの観点から明らかな点を見落としていないことを確認するために、サニティ チェックが必要でした。
  2. entity_id はリクエストではなくヘッダーに入れる必要がありますか?

これは私がこれまでに認証のために持っているものです:

function authenticate_request()
{
    $request = json_decode(file_get_contents('php://input'));
    $request_headers = apache_request_headers();

    if ( ! isset($request_headers['X-Auth']) OR ! isset($request_headers['X-Auth-Hash'])) {
        return false;
    }

    $user = User::get_by('public_key', $request_headers['X-Auth']);

    if ( ! $user) {
        return false;
    }

    // every request must contain a valid entity
    if (isset($request->entity_id) && $request->entity_id > 0) {
        $this->entity_id = $request->entity_id;
    } else {
        return false;
    }

    $entity = Entity::find($this->entity_id);
    if ( ! $entity) {
        return false;
    }

    // validate the hash
    $hash = hash_hmac('sha256', $request, $user->private_key);

    if ($hash !== $request_headers['X-Auth-Hash']) {
        return false;
    }

    return true;
}

curl リクエストの例:

$public_key = '123';
$private_key = 'abc';

$data = json_encode(array('entity_id' => '3087', 'date_end' => '2012-05-28'));
$hash = hash_hmac('sha256', $data, $private_key);
$headers = array(
    'X-Auth: '. $public_key,
    'X-Auth-Hash: '. $hash
);
$ch = curl_init('http://localhost/myapp/api/reports/');

curl_setopt($ch,CURLOPT_HTTPHEADER,$headers);
curl_setopt($ch,CURLOPT_POSTFIELDS, $data);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);

$result = curl_exec($ch);
curl_close($ch);

print_r($result);
4

1 に答える 1

2

hash_hmac()2 番目のパラメーターが文字列であることを想定しているため、代わりにデコードされた JSON オブジェクトを渡しています。それ以外は、あなたのアプローチはかなり標準的なようです。entity_idHMAC署名でも保護する必要があるため、リクエスト本文に保持しないと、署名の計算が少し複雑になり、実際の利益は得られません。

于 2012-09-11T21:21:31.883 に答える