Javascript 如何防止伪造表单验证
所以我有一个简单形式的页面。要提交此表格,我需要有人提交复选框(一些隐私政策等) 我有这样的表格:Javascript 如何防止伪造表单验证,javascript,jquery,html,forms,Javascript,Jquery,Html,Forms,所以我有一个简单形式的页面。要提交此表格,我需要有人提交复选框(一些隐私政策等) 我有这样的表格: <form role="form" class="form" id="zamowienie" action="send_order.php" method="post"> <button type="button" id="wyslijZamowienie">SEND</button> <input type="checkbox" id="regCheck
<form role="form" class="form" id="zamowienie" action="send_order.php" method="post">
<button type="button" id="wyslijZamowienie">SEND</button>
<input type="checkbox" id="regCheckbox" value="">
</form>
不幸的是,我发现用户可以在本地将按钮类型从“button”更改为“submit”,并且可以忽略我的提交保护脚本来提交表单
和补充问题。我不是一个专家,但我开始思考用户还可以用FireBug或开发工具做些什么。他能用这种方式进行攻击吗
非常感谢您的回答或指导。这就是您总是在服务器上验证的原因之一。 在前端进行验证没有问题,但您需要服务器进行双重检查,以确保所有数据都符合预期
至于Firebug/Chrome开发工具问题,任何人都可以从前端编辑所有内容。从CSS到JS。即使你缩小它 考虑用户可以做任何他想做的事情。他可以修改表单中的所有内容,甚至可以针对同一url创建另一个表单,并创建脚本提交1000次 这就是为什么你经常阅读: 永远不要相信用户的输入 这意味着您必须在服务器端检查整个请求:检查所使用的方法,检查预期字段是否设置了预期的数据类型
总而言之:前端只是用来帮助“普通”用户与服务器进行通信,但在服务器端(后端),您必须期待所有可能的输入。用户可以通过许多其他方式更改表单,而不仅仅是更改按钮的类型属性,最好的方法是在服务器端检查它,例如,您应该执行以下操作:
<form role="form" class="form" id="zamowienie" action="send_order.php" method="post">
<button type="button" id="wyslijZamowienie">SEND</button>
<input type="checkbox" id="regCheckbox" value="">
</form>
通过Jquery验证:
在后端验证:
例如,如果在后端使用PHP
,则必须检查复选框是否已选中,如下所示:注意:您的复选框需要一个name属性,比如说
mycheckbox
始终在后端验证您的代码,Javascript验证只是可用性和用户体验的一个加号。祝贺您!您已经了解了为什么必须在服务器上进行验证。JavaScript验证只是一个UI奖励。在客户端上,您无法阻止这一点。您必须在服务器上进行验证以确保完全安全。
用户使用FireBug或开发工具还可以做些什么
他们可以使用JavaScript做任何事情。正如@Juhana所说,这就是为什么您也必须在服务器上验证请求数据的原因。可以肯定的是,客户端JavaScript验证应该是一种方便,可以节省每个人因服务器端验证失败而占用的时间和带宽。换句话说:首先实现服务器端验证,然后实现客户端验证。是的!确切地在ChromeDevTools中,单击一下就可以呈现新的样式表规则。这里的任何人都可以在JavaScript控制台上用三行代码更改按钮的类型。简单。而且,这也是recaptcha想要得到你答案的地方。老实说,我不想在我的表单中添加任何类型的验证码来减少提交失败的次数(因为这是一个订购产品的表单)。我会尝试用一些PHP和API来保护自己不受1000次提交的影响,但我不知道如何做到这一点。我还计划验证是否有任何其他字段被添加到表单中并提交-为此,我想我有一个想法。我将产生一些代码,并问另一个问题,如果这是保护自己不受不必要的活动。谢谢你的回答。我不一定完全理解为什么要用jquery进行验证,但我会尝试找出:)我知道在发现数据有问题后应该重新打开表单页面。或者改用Ajax来防止页面刷新。
$("#zamowienie").submit(function(e) {
if(!$('input[type=checkbox]#regCheckbox:checked').length) {
//stop the form from submitting
return false;
}
//Continue and submit the form
return true;
});
if (isset($_POST['mycheckbox'])) {
//Process your form
}
else{
//Checkbox was not checked, print an error message or something
}