0

mysql にテーブル メッセージがあります

id(bigint)      sender(int)    receiver(int)     message(varchar)
1                 42                420           Hi
2                 80                32            Hello
3                 61                32            I love you

私のdelete.phpコード

if(isset($_POST['id']))mysql_query("Delete from message where id=".$_POST['id']."");

ユーザーが ajax リクエストを使用してメッセージを削除するページ

<div>sender:Romeo
receiver:Juliet
message:I love you</div>
<span id="3">delete</span>//delete message with id 3
<script>
$("span").click(function(){$.post("delete.php",{"id",$("span").attr("id")});
});</script>

私が知る限り、誰でもこのリクエストを行っているページを知ることができ、メソッド post とアクション delete.php および delete message を使用して偽のフォームを簡単に作成できます。これを防ぐ方法を誰か教えてもらえますか?

4

8 に答える 8

5

You need to validate/authenticate the incoming data (i.e. is the current user authorised to delete the specified message?). You also need to prevent SQL injection by using prepared statements, rather than directly inserting user data into the query.

于 2012-06-08T11:10:16.013 に答える
1

データをフィルタリングしてエスケープする場合、ユーザーが Ajax 呼び出しのエンドポイントを学習し、ID を推測してすべてのメッセージを削除することを妨げるものは何もないことに注意してください。

Ed Daniel が指摘するように、承認されたユーザーのみが投稿を削除できるように、認証を使用する必要があります。

于 2012-06-08T11:17:05.027 に答える
1

mysql_real_escape_string()は、MySQL クエリのユーザー入力をサニタイズするために使用する必要があります。

例えば。

$id = mysql_real_escape_string( $_POST['id'] );
mysql_query( "SELECT * FROM blah WHERE id='$id'" );
于 2012-06-08T11:12:51.060 に答える
0

ログに記録されたユーザーIDが受信者IDと等しいかどうかを確認します。

そうでなければ、死ぬ

于 2012-06-08T14:28:05.480 に答える
0

Here's a fix:

$id = array_key_exists('id', $_POST) ? (int) $_POST['id'] : null;
if ($id)
{
    mysql_query("DELETE FROM message WHERE id={$id}");
}

I've checked the item exists in the $_POST array first, to avoid PHP notices, and critically I've sanitised it with (int) before using it.

A couple of recommendations: always use braces in your if statements - it will save you a lot of trouble one day. Also, migrate to PDO or mysqli if you can, so you can use prepared statements. Lastly it's nice to have a case convention for SQL - you can write it in title case if you wish, but I tend to prefer upper for keywords, lower for entity names.

于 2012-06-08T11:10:52.300 に答える
0

このページは、ログインしたユーザーのみがアクセスできる必要があります。user_id または $_SESSION で同様のものをチェックすることで、気象ユーザーがログインしていることを簡単に確認できます。彼の m/c からサーバーにデータを投稿することもできますが、上記の認証チェックを入れているため、追加されません。また、prepare ステートメント、mysql_escape または addSlashes、regexp などを使用して入力をサニタイズすることをお勧めします。

于 2012-06-08T11:16:08.380 に答える
0

あなたの例のコードには、大きな MySQL インジェクションの問題が含まれています。ユーザーによって制御される $_POST、$_GET、$_COOKIE、$_FILES、$_SERVER (USER_AGENT、アップロードされたファイルのファイル名などを含む) の値を使用する場合でも、それを保護する必要があります。

最善の方法は、提案されているように、PDO (PHP データ オブジェクト、データベース アクセスの抽象化レイヤー) を使用することです。 mysql_real_escape_string()" や ' などの引用符をエスケープしますが、すべての種類のインジェクションに対して役立つわけではありません。

あなたの場合、誰かが-1 OR 1=1あなたのテーブル全体を使用すると、クリアされます。またmysql_real_escape_string、セキュリティを提供することはできません。

また、何らかのログインを実装する必要があります。現在、誰もがテーブル内のレコードを削除できます。

詳細については、PDO の PHP マニュアル ( http://de.php.net/manual/en/pdo.prepare.php ) を参照してください。

于 2012-06-08T11:27:51.940 に答える
0

そもそもジュリエットがメッセージを見るためにログインする必要があったことを願っています! 基本的に、それがあなたの答えです - ユーザー認証。POST の送信者がメッセージを削除する権限があることを納得できない場合は、許可しないでください。

そして、Olli Charlesworth が指摘するように、SQL は問題を引き起こしています。

于 2012-06-08T11:14:50.223 に答える