post を使用してデータベースを更新したいのですが、手動で行う必要はありません。つまり、クライアントで AJAX を介してのみ可能にする必要があります。このシナリオで使用できるよく知られた暗号化トリックはありますか?
のデータベースに新しいユーザーを挿入するために GET 要求を発行しているとしますsite.com/adduser/<userid>
。誰かが偽のリクエストを発行して、私のデータベースを過密にする可能性があります。
この場合、偽造されたリクエストを回避する方法はありません。クライアント ブラウザには、リクエストを行うために必要なものがすべて含まれているためです。悪意のあるユーザーがバックエンドに任意のリクエストを送信する方法を理解するのは、デバッグだけの問題であり、おそらくそれを簡単にするために独自のコードを使用することさえあります. 「暗号化のトリック」は必要ありません。難読化だけが必要です。これにより、偽造が少し不便になりますが、それでも不可能ではありません。
それを達成することができます。
あなたがそのような要求をすることになっているページをレンダリングするときはいつでも。ランダムトークンを生成し、セッション(認証されたユーザーの場合)またはデータベース(この要求が公に許可されている場合)に保存します。
トークンが有効かどうか(セッションまたはデータベースから)にそのような要求を受信するたびに呼び出しを呼び出す
代わりに、
トークンが正しい場合は、要求を処理し、セッション/データベースから使用済みトークンを削除します
。トークンが正しくない場合は、要求を拒否します。site.com/adduser/<userid>
site.com/adduser/<userid>/<token>
サーバーへのアクセスを実際に制限する必要はありません (それは素晴らしいことですが)。サーバーがアプリケーションからのものであり、ユーザーがスニッフィングされたトークン。
これはできません。これは、クライアント/サーバー アプリケーションの基本的な問題のほぼ 1 つです。これが機能しない理由は次のとおりです。クライアント アプリがサーバーに対して自身を認証する方法があったとします。それが秘密のパスワードであろうと、その他の方法であろうと。アプリが必要とする情報は、必ずアプリからアクセスできます (パスワードはどこかに隠されています)。しかし、それはユーザーのコンピューター上で実行されるため、ユーザーもこの情報にアクセスできることを意味します。必要なのは、ソース、バイナリ、またはアプリとサーバー間のネットワーク トラフィックを確認することだけです。アプリが認証し、それを複製するメカニズム。たぶん彼らもそれをコピーするでしょう。多分彼らは' アプリに面倒な作業をさせる巧妙なハックを書きましょう (偽のユーザー入力をいつでもアプリに送信できます)。しかし、どのような方法であれ、彼らは必要な情報をすべて手に入れており、彼らがそれを手に入れるのを止める方法はありません。
これは CSRF と同じ問題であり、解決策も同じです。以前に eslewhere に保存した AJAX リクエストでトークンを使用します (または、キーとしてセッション ID を使用してパラメーターを暗号化することにより、再生成できます)。Chriss Shiflettはこれについていくつかの賢明なメモを持っています。また、PHP で CSRF を検出するためのOWASP プロジェクトがあります。
Ajax関数によって呼び出されたファイルへの直接アクセスを防止する は、問題に対処しているようです。
あなたはできる(他の解決策の中でも、私は確信している)...
しかし、人々が十分に努力すれば、何でもなりすましが可能です。完全に安全なシステムは、誰もアクセスできないシステムだけです。
これは認証の問題です。認証されたリクエストのみが新しいユーザーの作成につながるはずです。したがって、このようなリクエストを受信した場合、サーバーは、新しいユーザーの作成を許可されているクライアントからのものかどうかを確認する必要があります。
ここでの主な問題は、どのリクエストが承認されるかを決定する方法です。ほとんどの場合、これはユーザー ロールおよび/または何らかのチケット システムを介して行われます。ユーザーの役割を使用すると、ユーザーの識別やユーザーの認証など、解決すべき追加の問題が発生します。しかし、それがすでに解決されている場合は、Alice が管理者でBob が通常のユーザーであり、管理者のみが新しいユーザーの作成を許可されているなど、ユーザーをロールに簡単にマッピングできます。
解決策は、太字の行を ajax リクエストに追加することです。また、基本認証に注目する必要があります。これが唯一の保護ではありません。これらのコードを使用して、ajax ページから収入を得ることができます。
Ajax 呼び出し
function callit()
{
if(window.XMLHttpRequest){xmlhttp=new XMLHttpRequest();}else{xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");}
xmlhttp.onreadystatechange=function(){if(xmlhttp.readyState==4&&xmlhttp.status==200){document.getElementById('alp').innerHTML=xmlhttp.responseText;}}
xmlhttp.open("get", "call.asp", true);
**xmlhttp.setRequestHeader("X-Requested-With","XMLHttpRequest");**
xmlhttp.send();
}
PHP/ASP 要求されたページの回答
ASP
If Request.ServerVariables("HTTP_X-Requested-With") = "XMLHttpRequest" Then
'Do stuff
Else
'Kill it
End If
PHP
if( isset( $_SERVER['HTTP_X_REQUESTED_WITH'] ) && ( $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest' ) )
{
//Do stuff
} else {
//Kill it
}
他の Web ページと同じように機能します: ログイン認証、リファラーのチェック。