1

私はこのデータベースを構造化する方法を理解しようとしています:

ここに画像の説明を入力してください

私はテーブルUsers、テーブル、テーブルGalleriesを持っていますImages

ユーザーがログインすると、IDを次のように保存します$_SESSION[user_id]


テーブルGalleriesには、所有者を格納するための列user_idがあります。

テーブルImagesには、それらが属するギャラリーを格納するためのgallery_idがあります。

クライアント側では、新しい画像を画像にアップロードするときに、現在のギャラリーIDを使用して画像のを設定しgallery_idます。

それに関する問題は、誰かがデータを改ざんし、を変更することによって他の誰かのギャラリーに画像をアップロードできることですgallery_id

user_id画像テーブルにもを追加して、$_SESSION[user_id]画像、ギャラリー、ユーザーごとに完全に一意のIDを確認するか、生成してクライアント側で使用する必要がありますか、それとも3つのテーブルすべてを結合してから確認する必要がありuser_idますか?

ベストプラクティスは何ですか?ありがとう

4

3 に答える 3

2

images テーブルの gallery_id 列が NOT NULL の場合、次のようなことができる場合があります

INSERT INTO images (gallery_id,image_file) 
    SELECT id,'$image_file'
    FROM Galleries 
    WHERE id = $gallery_id AND user_id = {$_SESSION[user_id]}

$gallery_id と $_SESSION['user_id'] がどの行とも一致せず、したがって INSERT が失敗する場合、SELECT は gallery_id を NULL として返すことを (テストなしで) 確信しています。

于 2012-04-05T06:16:10.020 に答える
1

いいえ、アップロードされたファイルを実際に受け入れてimagesテーブルにレコードを追加する前に、ユーザーがクエリを使用して正しいかどうかを少しチェックするだけです。

SELECT COUNT(*) AS cnt FROM Galleries WHERE id = $gallery_id AND user_id = {$_SESSION[user_id]}

このクエリがnotを返した場合0-すべてが正常である場合は、処理を続行します。それ以外の場合は中止

于 2012-04-05T05:05:12.250 に答える
-1

言い換えると、問題は、誰かがデータを改ざんし、gallery_id を変更することで、他の人のギャラリーに画像をアップロードできることです。

セッション変数に保存していますが、セッションにも保存しuser_idないのはなぜgallery_idですか...これにより、エンドユーザーによるデータフローの偶発的な改ざんを防ぐことができます。

URLを渡したり、ユーザーにgallery_idを提示したりするgallery_idと、常に悪用される可能性があります。この変数の変更はデータに直接影響するため (読み取り専用ではなく、データを変更します)、操作やデータ整合性エラーに任せて公然と伝播することはお勧めできません。

于 2012-04-05T05:19:27.580 に答える