我正在为PHP和MySQL构建一个实验性网站。
我正在添加更新记录部分,我的登录用户可以在其中更新表格中的某些记录。
要更新记录我通过URL传递记录ID并使用它作为我的主键更新它,但我的问题(我很清楚这是一个巨大的安全问题)是任何用户都可以改变url变量和更新任何其他人的信息。
什么是阻止这种情况的最佳方法?
答案 0 :(得分:3)
很简单,您的Web应用程序需要知道其中的信息是谁,并且当没有适当权限的用户尝试执行此类操作时返回错误页面。
或者,如果您想要非常安全而不是返回“未授权”页面(这将允许人们找出有关您的数据库的信息),只需返回一般错误页面,无论该URL是否有效。
编辑:
正如人们在下面指出的那样,您可以通过基本的PHP会话管理来判断用户是谁,但我原以为您已经知道如何告诉WHO发送请求的用户是。
答案 1 :(得分:1)
一种简单的方法是首先创建一个会话变量来保存登录的用户ID(和用户名,以及其他......)
<?php
session_start();
//store session data
$_SESSION['userid']=$auth->userid();
?>
然后创建一个全局加载的函数或作为身份验证类的一部分,该类将使用当前登录用户的用户ID来检查它是否与数据库中的用户ID匹配。
function permissible($userid) {
if ($userid != $SESSION['userid']) {
header('Location: http://www.404.com/'); //redirect to suitable location
}
}
现在,在php文件顶部的代码中使用这样的内容
permissible($GET['userid']);
这只是一个例子。请记住用适当的变量替换变量。
答案 2 :(得分:0)
典型的方法是在登录时使用会话变量。例如,如果您有一个更新成员行的脚本,请执行以下操作:updatemember.php?id = 8
您修改此脚本,以便不是从$ _GET ['id']获取ID,而是从会话中获取id。
$id = $_SESSION['user_id'];
当然这假设$ _SESSION ['user_id']在用户首次进行身份验证并且已登录时已填充,但这是一种相当标准的技术,其中用户的基本信息从数据库中读取并存储成功登录后,在一个或多个会话变量中。
总之,使用php会话解决了解“这个用户现在试图做这个的人是谁?”的问题。
答案 3 :(得分:0)
这取决于用户编辑的内容,例如,如果他编辑自己的数据,你可以像我上面的人建议的那样做,或者甚至更多,不发布/获取他的ID,只是做“更新data ... ... ... userid = $ _ SESSION ['user_id'],但如果他编辑其他一些信息,例如他的博客帖子,你将不得不选择编辑博客帖子,然后检查看看如果他是海报(所有者,你想要称之为什么),然后如果$ poster_id == $ current_logged_in_user_id编辑,否则重定向,抛出错误ot什么,只是不要编辑博客文章(在这种情况下)
答案 4 :(得分:-1)
为了保护您的网站免受人们滥用网址中的id变量的影响,您必须只允许注册用户进行更新操作,您还可以创建一个历史表,在该表中您将保存该行的旧状态和提及谁改变了它,何时,另一种方法是创建规则和权限,用户只能更新他们插入的数据,你可以添加管理员角色,可以更新属于每个人的数据。
为了保护您的网站免受SQL注入,您可能需要使用准备好的语句:Are PDO prepared statements sufficient to prevent SQL injection?