1

*パートナーの Web サイトが Web サービスにアクセスして情報を取得するための「最も簡単な」識別方法を見つけようとしています。*

パートナーだけがこの情報を取得できるようにしたい. データはパートナーの Web サイトに表示されるため、機密データはありません。しかし、他の Web サイトが私の Web サービスを利用して、アクセス権を持たずにデータを取得することは望ましくありません。

HttpRequest オブジェクトを使用して IP アドレスを取得し、逆引きを実行できることはわかっています。ただし、すべての Web サイトに専用の IP アドレスがあるわけではなく、ISP は複数の Web サイトに同じ IP アドレスを使用する場合があります。

「誰でも」そのデータをキャッチして自分で使用できるため、一意の識別子を URL のパラメーターとして渡すことがどのように役立つかわかりません。しかし、追加のチェックとして使用します。

したがって、私が思いつく唯一の「安全な」方法は、自分の Web サイトにアクセスしている Web サイトを特定し、サーバー上のリストに対してこれを制御することです。

どの方法が「最も安全」であるかについてのフィードバックをいただければ幸いです。

4

2 に答える 2

2

APIリクエストを認証するために公開鍵/秘密鍵を使用することは、Webサービスの間で一般的な方法です。それらを使用するいくつかのサンプルサイト:Google、Twitter、EventBriteLast.FM、GitHubなど。

これらは、すべての人に知られている公開鍵または消費者鍵を持つことによって機能します。次に、認証を可能にするために、各ユーザーに秘密鍵または秘密鍵が与えられます。これを使用することのすばらしい点は、誰がリクエストを行っているかを正確に把握しているため、アクティビティを追跡し、悪用された場合にリクエストの数を抑えることができることです。

于 2012-04-04T10:35:46.740 に答える
2

最も安全な方法は、SSL チャネルを使用して認証を要求することです。認証が成功した場合は、何らかのセッション キー (ランダムに生成された文字列) をクライアントに返し、すべての要求でそれを確認できます。

サービスで SSL の使用が許可されていない場合は、パートナーに単純なユーザー名/パスワード認証を追加するだけで試すことができますが、この場合、誰かがあなたの通信を傍受した場合、同じ資格情報でサービスにアクセスできます。

他の方法は、すべてのリクエストで署名を使用することです。たとえば、この目的で GPG を使用できます。サーバーは、すべてのパートナーの公開鍵を保持しています。パートナーがサーバーにクエリを送信する場合、彼は自分の秘密鍵でリクエストに署名するだけで、受信時に、このリクエストが特定のパートナーによって送信され、100% 偽造されていないことを安全に確認できます。

編集

GPG の場合、 gnupgという PECL モジュールをインストールする必要があります。これは、GPG 機能を利用するフレームワークのクラスです。

class GPG
{

    /**
     * Encrypt given data to one or more recipients
     * 
     * @param string $string
     * @param string|array $encryptKeyID
     * @param bollean $armour
     * @return string
     */
    public static function encrypt($string, $encryptKeyID, $armour = true){
        $gpg = new Crypt_GPG();

        if(is_array($encryptKeyID)){
            foreach($encryptKeyID as $keyId){
                $gpg->addEncryptKey($keyId);
            }
        }
        else{
            $gpg->addEncryptKey($encryptKeyID);
        }

        return $gpg->encrypt($string, $armour);
    }

    /**
     * Decrypt given data
     *  
     * @param string $string
     * @param string $keyPassword
     * @param string $keyID
     * @return string
     */
    public static function decrypt($string, $keyID, $keyPassword = null){
        $gpg = new Crypt_GPG();

        $gpg->addDecryptKey($keyID, $keyPassword);

        return $gpg->decrypt($string);
    }

    /**
     * Sign given string
     * 
     * @param string $string
     * @param string $keyID
     * @param string $keyPassword
     * @param boolean $mode
     * @param boolean $armor
     * @return string
     */
    public static function sign($string, $keyID, $keyPassword = null, $mode = null, $armor = true){
        $gpg = new Crypt_GPG();

        if($mode === null){
            $mode = Crypt_GPG::SIGN_MODE_CLEAR;
        }

        $gpg->addSignKey($keyID, $keyPassword);

        return $gpg->sign($string, $mode);
    }

    /**
     * Verify signature of given message
     * 
     * @param string $string
     * @return boolean
     */
    public static function verify($string){
        $gpg = new Crypt_GPG();
        $signatures = $gpg->verify($string);

        if ($signatures[0]->isValid()) {
            return true;
        } 
        else{
            return false;
        }
    }

    /**
     * Encrypt and sign given string to one or more recipients
     * 
     * @param string $string
     * @param string|array $encryptKeyID
     * @param string $signkeyID
     * @param string $signkeyPassword
     * @param boolean $mode
     * @param boolean $armor
     * @return string
     */
    public static function encryptAndSign($string, $encryptKeyID, $signkeyID, $signkeyPassword = null, $mode = null, $armor = true){
        $gpg = new Crypt_GPG();

        if($mode === null){
            $mode = Crypt_GPG::SIGN_MODE_CLEAR;
        }

        $gpg->addSignKey($signkeyID, $signkeyPassword);
        if(is_array($encryptKeyID)){
            foreach($encryptKeyID as $keyId){
                $gpg->addEncryptKey($keyId);
            }
        }
        else{
            $gpg->addEncryptKey($encryptKeyID);
        }

        return $gpg->encryptAndSign($string, $armor);
    }

    /**
     * Decrypt and verify given string
     * 
     * @param string $string
     * @param string $keyID
     * @param string $keyPassword
     * @return array|false
     */
    public static function decryptAndVerify($string, $keyID, $keyPassword = null){
        $gpg = new Crypt_GPG();

        $gpg->addDecryptKey($keyID, $keyPassword);

        $result = $gpg->decryptAndVerify($string);

        if(empty($result['data']) and empty($result['signatures'])){
            return false;
        }

        if(isset($result['signatures'][0])){
            $result['signature'] = $result['signatures'][0]->isValid();
            unset($result['signatures']);
        }

        return $result;
    }
} 
于 2012-04-04T09:51:52.510 に答える