是否有一种简单的方法可以检查是否有人修改了您的HTML?我目前正在编写一些代码,这些代码从DOM中获取数据并将其提交到后端,当然它将被清理并检查其准确性,但我想知道是否有一种方法可以解决这个问题。< / p>
例如,如果我有一个带有数字的隐藏输入并且有人在将其提交到我的服务器之前在Firebug中修改了该数字,那么在提交请求之前是否有办法检查实际的HTML是否被修改服务器,基本上告诉他们嘿嘿嘿嘿哼哼我的屁股。
我不完全确定这是可能的,但如果是的话,我不知道怎么做。
答案 0 :(得分:4)
嗯,我会说用户浏览器上的HTML实际上是他们的。 (也就是说,没有任何问题)如果它以URL,HTML表格输入参数和cookie的形式到达你的服务器,那么它就不会再出现了 - 所有这些当然都可以被你自己修改。所以你应该继续验证这些数据;没有灵丹妙药可以获得值得信赖的客户体验。
答案 1 :(得分:3)
你可以看到是否有人使用JavaScript更改了使用Firebug的隐藏input
元素,但这个想法听起来很愚蠢。
所有关键验证都应该在服务器端完成。
您不能依赖客户发送的任何准确信息。如果有人真的想“弄乱你的东西”,他们可以轻松(例如)编写一个Python脚本来向服务器提交数据。
以下是我在评论中提到的基于jQuery的示例:
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;
});
答案 2 :(得分:3)
您可以将隐藏值发送给您的另一个值,该值是您执行的涉及隐藏值和永远不会发送到客户端的某个秘密值的复杂计算的结果。然后,当您收到隐藏值时,只需执行另一个反转第一个的计算。如果你没有得到你的秘密价值,那么你知道他们已经改变了隐藏价值。
当然,这仍然不会那么安全,因为有人可以轻松地在您的网站上进行一些实验,并根据您的隐藏价值和验证价值找出该秘密价值,然后将验证值更改为好。
有可能提出一种计算,使得破解这种类型的验证变得相当困难(但并非不可能)。然而,由于花费时间和精力来提出这样的计算然后保持最佳状态以确保没有新的漏洞利用出来,你可能最好只是在收到数据时对数据进行清理。
在我看来,最好不要依赖用户收到的任何数据。肯定有一些技巧可以做你要求的事情,这可能是其中之一,但大多数所有这些技巧都是很有可能被攻击者在足够的时间内弄清楚的。
答案 3 :(得分:2)
您可以在JavaScript中执行某些操作,例如保留JavaScript中隐藏的预期值的副本:
var originalHiddenFieldValue = document.getElementById("myHiddenField").value;
...稍后......
if (originalHiddenFieldValue !== document.getElementById("myHiddenField").value)
alert("Hey, stop it!");
但是,在一天结束时,所有用户必须要做的是在提交按钮上分离任何事件处理程序以覆盖任何验证,并且您的代码将毫无用处。如果他们足够聪明,可以使用Firebug覆盖价值,那么你可以打赌他们愿意更进一步修改你的脚本。
如果您正在尝试检查这些内容,那么您可以100%放心地执行此操作的唯一方法是检查隐藏字段服务器端,并比较值,正如您所说的那样。< / p>