安全地更新或插入当前登录用户的“拥有”行

时间:2012-04-05 05:02:51

标签: php mysql security

我正在试图弄清楚如何构建这个db:

enter image description here

我有表格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

最佳做法是什么? 感谢

3 个答案:

答案 0 :(得分:2)

如果images表中的gallery_id列不是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']与任何行都不匹配,SELECT会将gallery_id返回为NULL,因此INSERT将失败。

答案 1 :(得分:1)

不,在你真正接受上传的文件并将记录添加到images表之前 - 你只需要检查用户是否是正确的查询:

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

如果此查询不返回0 - 那么一切正常,继续处理。否则中止

答案 2 :(得分:-1)

用你来解释 - 问题在于,有人可以通过更改gallery_id来篡改数据并将图片上传到其他人的图库。

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

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