7

ノンスを扱うのはこれが初めてなので、http://fullthrottledevelopment.com/php-nonce-libraryからスクリプトをダウンロードしました。特に、関数が定義された時間間隔(デフォルトは300秒)で動作するため、正当な要求が無効として扱われる可能性があるため、コードが気に入らなかった。

たとえば、ナンスが生成される300秒に299秒かかる可能性があるため、ナンスは1秒間しか機能しません。

ライブラリを次の関数に変更しました。私がしたことは、を使用して現在の間隔と前の間隔を確認することでしたnonce_create(time()-NONCE_DURATION)==$nonce。機能をさらに改善する方法はありますか?:

define( 'NONCE_UNIQUE_KEY' , '123123' );
define( 'NONCE_DURATION' , 300 );

function nonce_create($time=false){
    if(!$time)
        $time=time();
    $i=ceil($time/(NONCE_DURATION));
    return substr(md5($i.NONCE_UNIQUE_KEY),-12,10);
}

function nonce_is_valid($nonce){
    if (nonce_create()==$nonce || nonce_create(time()-NONCE_DURATION)==$nonce)
        return true;
    return false;
}

また、元のライブラリに関して2つの質問があります。

  1. なぜNONCE_UNIQUE_KEY使われないのですか?作者は単に忘れましたか?
  2. なぜ作者はここで2で割るのですか:$i = ceil( time() / ( FT_NONCE_DURATION / 2 ) );、それは半分の時間しか機能しません(私はそれを試しました)
4

1 に答える 1

1

これによりノンスが生成されますが、ノンスではありません。このライブラリが生成する値は、時間の使用に大きく依存するため、セキュリティのために使用してはなりません。攻撃者は現在の時刻を知っており、http応答ヘッダーにあるためサーバーの時刻を知っています。また、md5()のprng出力は、本来あるべきほどランダムではありません。md5には多くの既知の脆弱性があり、セキュリティのために使用しないでください。また、10バイトのbase 16はかなり小さく、16バイトのbase256が理想的です。

推測がかなり難しい一意の値が必要な場合、これはほとんどの場合に機能します。

sha1(uniqeid(mt_rand(),true));

ただし、これは理想的とは言えません。出力はbase16であり、スペースを非常に浪費します。uniqeid()は引き続き時間を使用しますが、結果の値には他のエントロピーのソースがあります。

Webアプリケーションのエントロピーの最良のソースは、それにアクセスして16バイトのbase256コンテンツを読み取るために/dev/urandom使用することです。fopen()/ dev / urandomは、オペレーティングシステム、そのハードウェア、およびシステム上のすべてのアプリケーションの動作からランダム性のソースを収集するエントロピーストアです。

于 2012-07-30T21:54:51.493 に答える