Asp.net MVCのQueryString値によるセキュリティ
-
05-07-2019 - |
質問
ユーザーがクエリ文字列値またはアクションURL値を改ざんしていないことをどのように適切に確認しますか?たとえば、CommentIDを取得するCommentControllerでコメントの削除アクションを実行できます。アクションURLは、/ Comments / Delete / 3のようになり、ID 3のコメントを削除します。
コメント3をだれにも削除できないようにしたいのは明らかです。通常、コメントの所有者または管理者には、削除する権限があります。このセキュリティがさまざまな方法で実施されているのを見たことがあります。あなたの一部がどのようにそれを行っているのか知りたいです。
複数のデータベース呼び出しを行ってコメントを取得し、コメントの作成者が削除アクションを呼び出したユーザーと一致することを確認しますか?
代わりに、CommentIDとUserIDを、削除を実行するストアドプロシージャに渡し、UserIDとCommentIDが渡された値と等しい削除を実行しますか?
クエリ文字列値を暗号化する方が良いですか?
解決
あなたはしません。
ユーザー、ブラウザ、クライアントなどからの入力を決して信用しないことが、プログラミングの基本的なルールです。特に、この日と年齢では
また、プログラミングの基本的なルールであり、自分が何をしているのかを本当に理解していない限り、おそらく自分で暗号化とセキュリティを実装しようとしないでください。そして、あなたが何をしているのかを知っていたとしても、あなたは遅刻者の一歩先を行くだけです。賢い人はまだあなたを笑っています。
追加のクエリを実行して、ログインしているユーザーに適切な権限セットがあることを確認します。これにより、全員の生活が非常に簡単になります。
他のヒント
クエリパラメータの暗号化と復号化は簡単なプロセスであり、StackOverflowのHttpModuleを使用してこれを行う方法の優れた例がいくつかあります。
"あなたはしない、"することはできません&quot ;、または「それは簡単ではありません」この日と年齢では単に受け入れられない応答です...
Vyrotek:入力方法は重要ではありません。 GET、POST、暗号化/難読化GET-実質的な違いはありません。アプリケーションがコマンドを受け取る方法に関係なく、管理アクションを実行するには、発行ユーザーが必要なことを実行できることを確認する必要があります。許可チェックは、コマンドを受け取って実行する前に実行する必要があります。それ以外の場合、セキュリティはまったくありません。
Stephen Waltherの記事ヒント#46– [AcceptVerbs(HttpVerbs.Delete)]
を使用するセキュリティホールを作成するため、削除リンクを使用しないでください。以下に示すように、「動詞の受け入れ」属性を使用して、コントローラー要求を削除する投稿要求のみを許可することもできます。
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Delete(int? id)
{
//Delete
}
次に、ここで説明したように偽造防止トークンを使用することもできます。
クエリ文字列の取得、圧縮、Base64、または16進エンコードのみでファンキーな処理を行ったため、" commentid = 4& userid = 12345" 「code = 1a2b23de12769」になります
基本的には、「隠蔽によるセキュリティ」です。ただし、サイトをハッキングしようとする人にとっては多くの作業が必要になります。
これを簡単に行うことはできません。
アクションURLを使用して削除を行ったサイトの思い出があります。
イントラネットの検索クロールを開始するまでは、すべて良好でした。
おっと、さよならデータ。
編集したくないものにはクエリ文字列を使用しないソリューションをお勧めします。