4

有没有一种简单的方法可以检查是否有人修改了您的 HTML?我目前正在编写一些代码,这些代码从 DOM 获取数据并将其提交到后端,在那里它当然会被清理并检查其准确性,但我想知道是否有一种方法可以在传递时阻止它。

例如,如果我有一个带有数字的隐藏输入,并且有人在将其提交到我的服务器之前在 Firebug 中修改了该数字,有没有办法在将请求提交到服务器之前检查实际的 HTML 是否被修改基本上是告诉他们,嘿,伙计,别再弄乱我的东西了。

我不完全确定这是可能的,但如果是的话,我不知道该怎么做。

4

4 回答 4

4

嗯,我会说您用户浏览器上的 HTML 实际上是他们的. (即,greasemonkey 没有任何问题) 直到以 URL、HTML 表单输入参数和 cookie 的形式到达您的服务器之前,这些东西都不再属于您了——当然,所有这些都可以在您不知道的情况下进行修改。所以你应该继续验证这些数据;没有什么灵丹妙药可以提供值得信赖的客户体验。

于 2011-03-06T02:33:46.520 回答
3

您可以查看是否有人input使用 JavaScript 使用 Firebug 更改隐藏元素,但这个想法听起来很愚蠢。

您所有的关键验证都应该在服务器端完成。

您不能依赖客户发送的任何准确信息。如果有人真的想“弄乱你的东西”,他们可以轻松地(例如)编写一个 Python 脚本来向你的服务器提交数据。


这是我在评论中提到的基于 jQuery 的示例:

现场演示#2

  • 单击提交:背景将变为绿色 - 没有任何更改。
  • 更改 hidden 的值input,单击提交:背景将变为红色 - 某些内容已更改。

HTML:

<form id="myForm" method="post" action="">
    <input type="hidden" value="123" />
    <input type="hidden" value="456" />
    <input type="submit" />
</form>

JS #2:

$('#myForm input[type="hidden"]').each(function() {
    $(this).data('originalValue', $(this).val());
});

$('#myForm').submit(function(){
    $(this).find('input[type="hidden"]').each(function() {
        if ($(this).val() != $(this).data('originalValue')) {
            $('body').css('background', 'red');
            return false;
        }
        //just for testing:
        $('body').css('background', 'green');
    });
    return false;
});
于 2011-03-06T02:35:11.950 回答
3

您可以与隐藏值一起发送另一个值,该值是您执行的复杂计算的结果,涉及隐藏值和一些永远不会发送给客户端的秘密值。然后,当您收到隐藏值时,只需执行另一个计算来反转第一个计算。如果您没有取回您的秘密值,那么您就知道他们已经更改了隐藏值。

当然,这仍然不会那么安全,因为有人可以轻松地在您的网站上进行一些实验,并仅根据您的隐藏值和验证值找出该秘密值是什么,然后也更改验证值。

有可能提出一种计算方法,使破解这种类型的验证变得相当困难(但并非不可能)。但是,由于提出这样的计算需要花费大量的时间和精力,然后保持在它之上以确保不会出现新的漏洞利用,因此您最好在收到数据时对数据进行清理。

在我看来,你最好不要依赖用户收到的任何数据。当然有一些技巧可以做你所要求的,这可能是其中之一,但大多数所有这些技巧都是攻击者最有可能在足够的时间下找出来的。

于 2011-03-06T02:50:40.007 回答
2

你可以在 JavaScript 中做一些事情,比如在 JavaScript 中保留一份期望值的副本:

var originalHiddenFieldValue = document.getElementById("myHiddenField").value;

... 之后...

if (originalHiddenFieldValue !== document.getElementById("myHiddenField").value)
    alert("Hey, stop it!");

不过,归根结底,用户所要做的就是分离提交按钮上的任何事件处理程序以覆盖任何验证,而您的代码将毫无用处。如果他们足够聪明,可以使用 Firebug 覆盖值,那么您可以打赌他们也愿意进一步修改您的脚本。

如果您正在尝试检查这些事情,那么您可以 100% 自信地做到这一点的唯一方法是检查隐藏字段服务器端,并比较这些值,正如您所说的那样。

于 2011-03-06T02:50:37.030 回答