【发布时间】:2018-04-27 19:58:18
【问题描述】:
我有几种表单,用户可以在其中更改与其帐户相关的事件,但我不确定如何处理涉及用户更改 data-employeeID 中设置的值的安全问题。
我最初设置了一个安全检查脚本,它会在它继续实际使用它之前查看通过 ajax 请求传入的识别数据。它将首先执行一系列 mysql 连接以返回到用户表,然后进行最后检查以确保用户表的 ID_NO 可以使用会话存储的用户 ID 连接。
我认为这会起作用并且是安全的。但是该站点相当大,并且经常通过 ajax 调用传递 5 或 6 个值。因此,在每个面向公众的功能上,我都需要为每个变量重复该过程(除非它们可以一路捆绑在一起;并不总是可能的),然后再继续。
在谷歌搜索之后,虽然我只发现了与 php/ajax 处理错误或发出请求的用户周围的安全性相关的结果。
如果用户是合法的,但他们仍然可以在页面上进行更改,并保留所有正确的信息,除了将会议 ID 更改为其他内容。如果我只通过我的回调链检查用户 CompanyID 或 DepartmentID 并跳过会议 ID,他们将能够将不准确的数据插入到数据库中,因为我没有创建回调链,因此会议可能被操纵在 ajax 和 PHP 之间传递的每一个变量。
我觉得一定有更好的方法,而且这是一个已解决的问题,所以我希望有人能指出我正确的方向,然后再深入研究过于复杂的过程。谢谢。
请求的示例代码:
$.ajax({
type: "POST",
url: "<?php echo base_url().'meetings/addstarttime/'?>",
data: {
validDaysID: this.dataset.validdaysid,
departmentID: this.dataset.departmentID,
companyID: this.dataset.companyID,
employees: employeesArray,
start: this.dataset.start
},
success: function(data){
//update html to show updated values
$validDaysID = $_POST['validDaysID'];//unencoded
$securityArray[] = array("validDays", $validDaysID)//Check if access to this value is OK
$tieItBack[] = array("Buildings", "BuildingID");
$tieItBack[] = array("Location", "LocationID");
$tieItBack[] = array("Department", "DepartmentID");
$tieItBack[] = array("Companies", "CompanyID");
从那里我进行查询,选择最初请求的表的 COUNT(*) 行,validDays,INNER JOINS 加入 tieItBack 链中指定的表,然后最后检查 Companies.ID_NO == $this->session ->userdata('CompanyID');
如果有命中,那么他们可以访问,如果没有行,那么他们没有。
对于这个例子,三个变量可以在一个查询中被取消,但情况并非总是如此。这也是使用替换的表/列名称,因为我猜我很偏执,但结构是相同的。
【问题讨论】:
-
执行任务的服务器端验证是唯一的方法。
-
您有可以提供的示例代码吗?一种好方法是利用不容易猜到并且可以匹配的哈希值,例如对用户端的 ID 进行散列和加盐,并与服务器上的散列和加盐值进行比较。正如 MonkeyZeus 所提到的,服务器端验证是必须的——你不能依赖客户端脚本来阻止用户篡改数据。
-
@SteveKnau 我添加了一些显示我的过程的代码
-
没有灵丹妙药。每个页面都必须在其查询中执行适当的验证检查。
-
该死,至少知道没有更好的方法是件好事,而且必须这样做。