2012-01-02 9 views
0

私はフィードバックを求めています。私は、クライアントから送信されたPOSTデータの検証方法を見つけようとしていて、Content-MD5ヘッダーを見つけました。XMLHttpRequests、POSTデータのカスタムヘッダーと確認

私の解決策は、最初の部分は、プラグインを使用する簡単な形式のjQuery .ajax()関数を使用しています。 Content-MD5ヘッダーに必要なmd5()およびbase64_encode()関数にはpidder encryption librariesが必要です。

<script src="javascripts/pidcrypt.js"></script> 
<script src="javascripts/pidcrypt_util.js"></script> 
<script src="javascripts/md5.js"></script> 
<script> 
(function($){ 
$.fn.AJAX = function(method) { 
    var defaults = { 
    formID: $(this), 
    appID: 'jQuery.AJAX', 
    cache: true, 
    context: $(this), 
    type: 'json', 
    callback: function(){}, 
    errCallback: function(){} 
    }; 
    var methods = { 
    init: function(o){ 
    var opts = $.extend({}, defaults, o); 
    $('#'+opts.formID.attr('id')).on('submit', function(e){ 
    e.preventDefault(); 
    $.ajax({ 
     form: opts.formID.attr('id'), 
     url: opts.formID.attr('action'), 
     type: opts.formID.attr('method'), 
     data: opts.formID.serialize(), 
     context: opts.context, 
     cache: opts.cache, 
     crossDomain: (opts.type==='jsonp') ? true : false, 
     dataType: opts.type, 
     beforeSend: function(xhr) { 
     xhr.setRequestHeader('X-Alt-Referer', opts.appID); 
     if (opt.formID.serialize()){ 
     xhr.setRequestHeader('X-Alt-Referer', pidCryptUtil.encodeBase64(pidCrypt.MD5($(this).serialize()))); 
     } else { 
     xhr.setRequestHeader('X-Alt-Referer', pidCryptUtil.encodeBase64(pidCrypt.MD5(appID))); 
     } 
     }, 
     success: function(x){ 
     ((opts.callback)&&($.isFunction(opts.callback))) ? 
     opts.callback.call(x) : console.log(x); 
     }, 
     error: function(xhr, status, error){ 
     ((opts.errCallback)&&($.isFunction(opts.errCallback))) ? 
     opts.errCallback.call(xhr, status, error) : console.log(xhr+status+error); 
     } 
    }); 
    return true; 
    }); 
    } 
    }; 
    if (methods[method]){ 
    return methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); 
    } else if ((typeof method==='object')||(!method)){ 
    return methods.init.apply(this, arguments); 
    } else { 
    console.log('Method '+method+' does not exist'); 
    } 
}; 
})(jQuery);} 

そうのようなHTMLフォームを作成...

<form id="test" name="test" method="post" action="proxy.php"> 
<label for="name">Name: <span class="required">*</span></label> 
    <input type="text" id="name" name="name" value="" placeholder="John Doe" required="required" /> 
<label for="email">Email Address: <span class="required">*</span></label> 
    <input type="email" id="email" name="email" value="" placeholder="[email protected]" required="required" /> 
<label for="email">Confirm Email: <span class="required">*</span></label> 
    <input type="email" id="email" name="email" value="" placeholder="[email protected]" required="required" /> 
</form> 

が今そう...

$('#test').AJAX(); 
のような形にプラグインを結合し、プラグインを使用するには、単純な

この時点で、proxy.phpスクリプトにPOSTデータを送信する作業クライアントメソッドが用意されています。主な違いの1つは、フォームの投稿データを送信するのではなく、カスタムヘッダーがXMLHttpRequestのフォームデータとともに送信されていることです。

サーバー上で、簡単な2つの検証が実行されます。最初にリクエストがXMLHttpRequestであることを確認してから、X-Alt-Refererが一致することを確認してから、処理前に同じポストデータ(シリアライズされた)ハッシュと一致することを確認します。技術的にはチェックサムのように機能します。

<?php 
/* set the custom applicaiton string */ 
$appID = 'jQuery.AJAX'; // the plug-in URL https://github.com/jas-/jQuery.AJAX 

/* verify an XMLHttpRequest was made */ 
if (strcmp($_SERVER['HTTP_X_REQUESTED_WITH'], 'XMLHttpRequest')!==0){ 
exit('An XMLHttpRequest was not made'); 
} 

/* verify associated X-ALT-Header value */ 
if (strcmp($_SERVER['HTTP_X_ALT_REFERER'], $appID)!==0){ 
exit('The X-Alt-Referer information recieved is invalid'); 
} 

/* verify associated Content-MD5 header value */ 
if (strcmp(base64_decode($_SERVER['HTTP_CONTENT_MD5']), md5(serialize($_POST)))!==0){ 
exit('The Content-MD5 value is incorrect'); 
} 
?> 

このタイプのPOSTデータの検証を使用しない理由がありますか?前もって感謝します。

答えて

0

あなたは何に対して防御しようとしていますか? Content-MD5ヘッダーは、TCPチェックサムによって検出されない伝送エラーから保護するためのまともなソリューションです。ほとんどの人が理解するよりも頻繁に発生します。データを積極的に変更している攻撃者に対しては、攻撃者はヘッダを再計算するだけで完全に役に立たない。

このヘッダーを使用しない唯一の理由は、パフォーマンスの1つです。クライアント側とサーバー側の両方でオーバーヘッドが発生します(モバイルクライアントなど)。あなたはそれがあなたに提供する(小さい)保護でコストを重み付けする必要があります。

私はこの問題を解決するためにblog entryを見つけました。

+0

私は、ブロッキングが起こらず、サーバーがJSとHTMLをクライアントにプッシュすると、ライブラリーが既にロードされているため、パフォーマンスの引数に同意します。 –

+0

そして、それは魔法のようにチェックサムの計算を瞬時に自由にする方法はありますか? –

+0

あなたの権利。 content-md5ヘッダーの値に追加するチェックサムを計算する際にオーバーヘッドがあります。 –

関連する問題