2

Webアプリケーションではもちろん多くの場合CRUD(Create, Retriever, Update, Delete)をサポートします。

基本的なプログラマーは、次のようなことを行います(検証なし):

delete?room_id=12
update?room_id=13

表示される room_id は、ユーザー/クライアントに属するルームのみです。最初の認証は、ユーザーとパスワードのみを使用しています。まあそれは標準です。

しかし、ユーザーを信頼すべきではないと思います。悪意のあるユーザーは、自分のものではない room_id を推測する可能性があります。お気に入りdelete?room_id=199

私はプログラマーの友人に尋ねましたが、彼らはこの問題についてまったく考えていませんでした。

それを防ぐために、関連するオブジェクトの user_id を常に渡すという基本的な解決策があります。アクションの前にそのようなクエリを実行しis the room_id belong to the userます。これが唯一の解決策である場合、既に作成したすべてのクエリを変更する必要があります。

問題は、この基本的な問題に対する適切な解決策があるかどうかです。

ありがとう

4

3 に答える 3

4

あなたのアプローチは良いものです。そして、あなたのプログラマーの友達がそれについて考えていなかったのは本当に驚きではありません。残念ながら、セキュリティはほとんどのプログラマーの心の最後のもののようです。

優れたシステムでは、実行されるほぼすべてのアクションに対して承認チェックを実行して、この特定のユーザーがそのアクションの実行を承認されているかどうかを確認します。許可されているかどうかにかかわらず、通常は気にしないものであっても、アプリ全体にこのチェックインを組み込むことをお勧めします。いつかはそうなる可能性があります。

あなたのシナリオでは、そのアクションは部屋を取得したり、部屋を更新したり、部屋を削除したりすることかもしれません。

それに沿って物事を助けるために、私はいくつかの推奨事項があります:

  1. 可能であれば、room_idを推測できないようにします。すでに主キーとしてintを使用していると仮定すると、簡単な方法は、クライアントブラウザとアプリケーションの間を通過するときに暗号化/復号化することです。

  2. ブラウザ側では、ユーザーIDを渡すのではなく、セッションまたは他のメカニズムを介してそれを取得していることを確認してください。重要なのは、ユーザーがIDを渡すことを信頼したくないということです。

  3. GET以外のアクションは、HTTPPOSTを使用して実行します。つまり、IDをクエリ文字列に入れるのではなく、投稿データとして入れる必要があります。

于 2013-01-11T19:23:24.517 に答える
2

クライアントから渡されたものは決して信用しないでください。すべてのリクエストはサーバー側で検証され、ログインしたユーザーがそのアクションを実行できるかどうかを確認する必要があります。

すべてのテキスト入力は、挿入時または表示時にサニタイズする必要があります。後者は忘れる可能性が高く、 XSSのフィールドを提供します。テンプレートには暗黙的なサニタイズを使用することをお勧めします。

また、批評家のアクションに GET メソッドを使用しないようにしてください。攻撃者はいつでもユーザーに URL (iframe、短縮リンクを送信) にアクセスさせることができます。また、 CSRF 攻撃を防ぐために、特別に生成されたトークンを削除フォームに追加する必要があります。

于 2013-01-11T20:23:01.053 に答える
2

彼がログインするときにセッションにユーザー ID を登録していると仮定します。 session_register("userid");

次に、これを実行して、ログインしたユーザーがルームを所有しているかどうかを確認できます(ルームIDとユーザーIDを同時に含むデータベースがあると述べたように)

$connect = mysql_connect("$server", "$dbuser", "$dbpassword")
    OR die(mysql_error());

$room = intval($_GET['room_id']);
$user = mysql_real_escape_string($_SESSION['userid']);

mysql_select_db("$databasename", $connect);
$select = mysql_query("SELECT userid AS uid FROM table WHERE userid='$user' AND room='$room'");
$fetch = mysql_fetch_assoc($select); 
$found = $fetch['uid']; 

if ($found == $_SESSION['userid']){

// User owns this room let him delete

} else {

// FAIL, This user does not own this room

}

「テーブル」(データベース内のどのテーブルにこの情報の両方が含まれているか)、「userid」(そのテーブルのユーザー ID 列名)、および「room」(そのテーブルの部屋 ID 列名)を変更します。

編集: また、room_ids に文字が含まれている可能性がある場合は、intval(); を削除してください。$room から real_escaping を実行します。room_ids が数字のみの場合は変更しません

于 2013-01-11T19:32:02.787 に答える