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 列不为空,那么您可以执行以下操作

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'] 不匹配任何行,则 SELECT 将返回 gallery_id 作为 NULL,因此 INSERT 将失败。

于 2012-04-05T06:16:10.020 回答
1

不,在您实际接受上传的文件并将记录添加到images表之前 - 您只需执行一个微小的检查用户是否是正确的查询:

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

如果这个查询没有返回0- 那么一切都很好,继续处理。否则中止

于 2012-04-05T05:05:12.250 回答
-1

套用你 -问题是有人可以通过更改gallery_id来篡改数据并将图像上传到其他人的画廊。

您将 存储user_id在会话变量中,为什么不存储gallery_id在会话中...这将防止最终用户意外篡改数据流。

通过将gallery_idurl /传递gallery_id给用户,总会有滥用的机会。由于此变量更改直接影响您的数据(它不是只读的,它会修改数据),因此公开传播并不是一个好主意,将其留给操作/数据完整性错误。

于 2012-04-05T05:19:27.580 回答