我有一个JS函数来删除用户自己的帖子。
Function delete(post_id)
{
//Here comes AJAX call to delete.php file
// In delete.php file i have a query to delete the post from DB using that
post_id parameter.
}
我的问题是:
通过inspect元素,用户可以更改函数post_id的值,那么我如何防止它被更改呢?
如果这不能被阻止意味着,我如何保留我的旧值本身,也就是说,无论用户更改什么,都不应该影响原始函数post_id的值。
例如:
用户发布了两个post_id分别为1和2的帖子。
如果用户想要删除第二篇文章,他可以使用第二篇的删除按钮来删除该文章。
功能将类似:
Function delete(2) //post_id is 2
{
//AJAX call to delete.php
}
如何防止用户将函数中的post_id更改为1?
如果这意味着无法阻止,我如何防止将更改后的post_id传递给delete.php
删除.php:
"DELETE FROM `posts` WHERE `postid`='$_POST[post_id]' and user_id='$_SESSION[id]'";
在您的delete.php
中,您可以在继续删除之前,对该用户是否有权访问该数据进行SESSION
检查。
即使用户更改了id
,只要将该id
分配给他/她,他/她就有权删除数据库中的该行。
删除数据库中的一行仍然是他/她一个人的错。
如果您仍然想保留已删除的帖子,您可以为表添加另一列,比如status
。它将只有两种类型的值,1
或0
。值1
表示它是活动的和可查看的,如果它是0
,则表示它是隐藏的(用户实际上会认为删除的帖子被永久删除)。
当用户决定删除他/她自己的帖子时,您只需运行一个UPDATE
查询,并将该行设置为0
。它仍将在您的数据库中,但对他/她和您系统的所有其他用户都是隐藏的。您可以创建一个管理员页面,在其中您可以筛选已删除(隐藏)和活动的帖子。
即使用户更改了URL中的GET
参数,只要您有WHERE status = 0
的条件,他/她就无法查看。
或者您可以限制用户删除他/她自己的旧帖子。通过在DELETE
查询中放入一个范围(假设表中有TIMESTAMP或DATETIME列)。
... WHERE id = ? AND user_id = ? AND date_posted < ? AND date_posted > ?
注意:
没有办法阻止系统的用户最终更改元素。即使您使用javascript禁用right click
,或者在前端进行大量交互式验证,以及任何类似的过程,它仍然会在后端验证中结束。