【问题标题】:Preventing user tampering through changing data values in PHP/AJAX通过更改 PHP/AJAX 中的数据值防止用户篡改
【发布时间】: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 我添加了一些显示我的过程的代码
  • 没有灵丹妙药。每个页面都必须在其查询中执行适当的验证检查。
  • 该死,至少知道没有更好的方法是件好事,而且必须这样做。

标签: php ajax security


【解决方案1】:

你没有可靠的方法来保证the client-side code is doing what you want it to do

您的服务器端软件应该不信任所有输入,无论您已经编写了何种客户端验证。 (例如,用户甚至可能不会运行 JavaScript。)

这不是一个可以神奇地解决的问题。这只是网络计算机和软件开发的现实。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-30
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 2011-06-18
    • 2011-06-13
    • 1970-01-01
    • 2014-11-27
    相关资源
    最近更新 更多