我正在试图弄清楚如何构建这个db:
我有表格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
?
最佳做法是什么? 感谢
答案 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
,总会有滥用的可能性。由于此变量更改直接影响您的数据(它不是只读的,它会修改数据),因此公开传播并将其留给操作/数据完整性错误不是一个好主意。