私はフィードバックを求めています。私は、クライアントから送信された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データの検証を使用しない理由がありますか?前もって感謝します。
私は、ブロッキングが起こらず、サーバーがJSとHTMLをクライアントにプッシュすると、ライブラリーが既にロードされているため、パフォーマンスの引数に同意します。 –
そして、それは魔法のようにチェックサムの計算を瞬時に自由にする方法はありますか? –
あなたの権利。 content-md5ヘッダーの値に追加するチェックサムを計算する際にオーバーヘッドがあります。 –