【问题标题】:Google Chrome Inspect Element Issue With Hidden ID's谷歌浏览器检查隐藏 ID 的元素问题
【发布时间】:2013-07-20 19:12:33
【问题描述】:

我不是 100% 确定这是否是一个大问题,我似乎认为它现在是,但我认为我可能发现了一个问题,或者在 Chrome 中的 Inspect Element 查看器中发现了一个漏洞。

我正在使用(我现在更改了我的设置)隐藏 ID 来设置一些默认值,一个是用户级别,另一个是默认情况下使用户处于活动状态。

但是,当我在检查元素视图中查看这些 ID 然后更改值时,提交表单会将新值提交给服务器,而不是我给它的值。

例如:

我的代码中有如下内容,

    <input type="hidden" name="data[user][level][id]" value="1" id="MyID">

然后我在 Inspect 视图中将其更改为,

    <input type="hidden" name="data[user][level][id]" value="2" id="MyID">

然后我提交了表单,很惊讶新值被提交了,我一直认为隐藏的 ID 是不可更改的,浏览器应该只提交其中保存的默认值。

我现在已将其更改为让数据库默认为基本用户,然后我可以根据需要更改用户设置。但在某些情况下,这可能不是一个选择,所以我希望得到答案或一些反馈,了解如何让这更安全。

我是不是有点慢,是否有更好的方法(不同的方法)将“隐藏”数据从表单传递到服务器?

我在考虑是否可以在用户选择/提交表单后使用 JQuery 将所需的隐藏字段添加到表单中,但我不确定这是否 100% 安全,或者即使它是一个好主意。

非常欢迎任何想法/反馈.....

非常感谢,

格伦。

【问题讨论】:

    标签: forms google-chrome inspect-element


    【解决方案1】:

    我在将数据库数据传递到模式时遇到了同样的问题,我知道的解决方案是使用 jquery ajax 从请求文件的数据库中获取信息,将它们添加到变量中并比较变量

        $.ajax({
      url: "test.html",
      context: document.body
    }).done(function() {
      $(this).addClass("done");
    });
    

    我使用此代码示例来执行此操作。 当然,根据您的脚本需要进行一些修改

    【讨论】:

      【解决方案2】:

      我找到了一种更好的方法,至少在 CakePHP 中是这样。 CakePHP 框架具有内置的安全调用。这些内置功能在添加时会为您提供各种东西,但我使用它们的主要原因是阻止这种形式的篡改。

      我不是 100% 确定它是如何做到的,但它会向所有表单添加一个令牌,并检查提交的表单是否正确?再次不确定令牌是如何工作的。

      但这是我使用的代码::

       public function beforeFilter() {
          $this->Auth->allow('index', 'SystemAccess');
          $this->Security->blackHoleCallback = 'blackhole';
       }
      
       public function blackhole($type) {
          $this->Auth->logout();
          $this->Session->setFlash('Sorry a security issue has been detected, please try again or contact us for support.', 'default', array(), 'bad');
          $this->redirect($this->Auth->redirect('/'));
       }
      

      现在我将添加调用 Auth logout 我添加到此以增加安全性,因为用户可能已登录系统,而不是他们试图做他们不应该做的事情。

      希望能帮助别人!

      但这只是在使用 CakePHP 时的修复。我会认为其他框架会有他们的选择,但如果你只使用基本的 HTML?或者像 Drupal 这样的 CMS 可能也有内置的安全性。

      非常感谢

      格伦。

      【讨论】:

        【解决方案3】:

        我为这个问题找到的唯一安全和最佳的解决方案是在服务器端检查表单发送的 user_id 是否与登录时使用的 user_id 相同。

        虽然使用 jquery 是个好主意,但是,在我使用数据的情况下并没有工作:$(this).serialize(),

        但是,这是我在服务器端的代码(注意,我使用的是 Laravel 5.4,但我确信这与您的情况无关)

            if ($request->user_id != Auth::user()->id)
                return json_encode("F**K YOU ! Don't Play Smart -_- !");
            else
                raw_material_category::create($request->all());
        

        希望这会有所帮助;)

        【讨论】:

          猜你喜欢
          • 2016-10-30
          • 2016-02-02
          • 2012-02-02
          • 2014-03-07
          • 2012-12-13
          • 1970-01-01
          • 1970-01-01
          • 2016-10-26
          • 1970-01-01
          相关资源
          最近更新 更多