私の場合はjqueryを使ってajaxを呼び出す際の問題は、ターゲットがサイドのソースで見えるということです。私は、虐待を防ぐための解決策を探して、私の謙虚なアプローチについてどう思っているのか尋ねたいと思います。PHP/ajaxcall - 乱用や直接アクセスを防ぐためのアプローチ
あなたはそれが任意の通常のHTMLレンダリングのようにアクセスする必要があるため、ユーザーへの直接アクセスを許可する必要がありますAJAXコール(私は間違っているなら、私を修正)について知っておく
。
セッションを使用できます。ユーザーがファイルではなく、私のスクリプトにアクセスしているので、
IPトラッキングは、私が最初にajaxscriptにアクセスするスクリプトを作成した。このうち
(これは他の固定的なアプローチのために保持します)を使用することができ、時間を取得し、既知の塩とパスワードで同じ時刻をハッシュまたは暗号化し、これらの2つの値をユーザーに配信します。成功関数では、私はこの2つの値を取って、次のajaxcallでメインスクリプトにアクセスします。そこで私は、これらの値をチェックします。
は時間であり、同じ
暗号化された時間はx秒以上2つのアヤックスが
を呼び出した後に実行されませんでした私も、簡単に含ま追加のセキュリティのために$ _SERVER ['HTTP_X_REQUESTED_WITH'を偽造するために、これは簡単になりすまして偽造することができます。 GETで2つの値を渡すのではなく、Sessionを使ってそれらを転送することができます:)。
index.htmlを
<script>
$(document).ready(function() {
$("#ajaxloadlink").click(function(){
$("#ajaxcontent").load("ajax.php",function(responseText, textStatus, XMLHttpRequest){
// alert(responseText);
var pruf = responseText; // $("#ajaxcontent").html();
var arr = pruf.split('|');
var geturl = "ajax.php?verifyvar="+ arr[1] +"&timedone="+ arr[0];
$("#ajaxcontent").load(geturl);
});
});
});
</script>
<button id="ajaxloadlink">Lade ajax.php mit load()</button>
processfileのajax.php:私はあなたが私のアプローチの考えを聞いて、あなたがあれば、コードを修正することは名誉になり
<?php
// the function to use for encryption
define('SALT', 'whateveryouwant');
function encrypt($text)
{
return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, SALT, $text, MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND))));
}
function decrypt($text)
{
return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, SALT, base64_decode($text), MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND)));
}
if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && ($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest'))
{
//only internal scripts can be used, fakeable
if(empty($_GET))
{
$time = time();
$verifvar_created = encrypt($time);
echo $time."|".$verifvar_created;
}
else
{
//zweiter Durchlauf
$verifvar = $_GET['verifyvar'];
$timedone = $_GET['timedone'];
//VERIFY
$curtime = time(); //holds also timemax
$timemin = $curtime - 2;
if($timedone <= $curtime && $timedone >= $timemin)
{
echo "COOOL";
//now its an actual request
$verifvar_checked = decrypt($timedone);
if ($verifvar == $verifvar_checked)
{
echo "VERIFIED";
// now process the actual script
// :)
}
}
}
} else
{
echo "no direct access allowed";
}
?>
それがあると思う。私にとってはうまくいく、私はajaxの呼び出しの間に2秒を許可した(これは2単語なのでレンダリングが簡単だ)。
通常、アクセス可能なすべてのコンテンツには、通常のユーザーのようにindex.htmlを通過することで正しいヘッダーのcurlを使用してアクセスできます。ほとんどの環境(phpのような)では、このスクリプトで必要とされるボタンを "クリック"することができないので、カールは簡単にajaxコールを呼び出せないからです。ワイア、セレンのような他の環境でも簡単にそれを偽造することができます。
それでは、セキュリティの追加層ですか? 私を助けてくださったご意見ありがとうございます。私の間違いを訂正してくれてありがとう。
SOF 2012ですばらしい一日を!
これはcodereviewのほうが良いかもしれませんが、私が見ているように、コードにはすでに少しの問題があります。ユーザーの接続の速さ、1秒間の読み込み量、多分あなたは限界を上げるべきです。それ以外は、どのような虐待を防止しようとしていますか? –
クライアントサイドでURLを隠そうとする理由がわかりません。そして私はあなたが«curlはajaxcallsに簡単にアクセスできない»ということを何を意味するのか理解していません。このコードの目的を説明できますか? –
@egor私はクライアント側のURLを隠すことはできませんが、これはできません。 curlはajax-target-scriptを取得し、そのスクリプトに直接アクセスできます。 curl(php環境では)がindex.htmlにアクセスできず、そこからajax-target-scriptに移動します。最初に必要な2つの値を取得するには、スクリプトをindex.htmlから呼び出す必要があります。 – Email