我正在创建一个页面,允许用户访问我网站的某个部分,如果他们按正确顺序点击25个复选框中的8个。
首先感谢Reigel的原始代码,他拿走了我所拥有的并重写了它,它的方式比我最初开始的方式更好。还要感谢Peter Ajtai帮助我优化代码。
我的问题是,我如何清理输出,防止任何人利用任何东西,或添加任何会弄乱服务器的东西。需要吗?
这是一个实时版本:Click Here to see a live working version
我的代码如下:
<body onLoad="clearForms()" onUnload="clearForms()">
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<form id="form1" name="form1" method="post" action="check_combination.php">
<table width="200" border="1" align="center">
<tr>
<td width="20" align="center" valign="middle"><input name="checkbox" type="checkbox" value="1" /></td>
<td width="20" align="center" valign="middle"><input name="checkbox" type="checkbox" value="2"/></td>
<td width="20" align="center" valign="middle"><input name="checkbox" type="checkbox" value="3"/></td>
<td width="20" align="center" valign="middle"><input name="checkbox" type="checkbox" value="4"/></td>
<td width="20" align="center" valign="middle"><input name="checkbox" type="checkbox" value="5"/></td>
</tr>
<tr>
<td width="20" align="center" valign="middle"><input name="checkbox" type="checkbox" value="6"/></td>
<td width="20" align="center" valign="middle"><input name="checkbox" type="checkbox" value="7"/></td>
<td width="20" align="center" valign="middle"><input name="checkbox" type="checkbox" value="8"/></td>
<td width="20" align="center" valign="middle"><input name="checkbox" type="checkbox" value="9"/></td>
<td width="20" align="center" valign="middle"><input name="checkbox" type="checkbox" value="10"/></td>
</tr>
<tr>
<td width="20" align="center" valign="middle"><input name="checkbox" type="checkbox" value="11"/></td>
<td width="20" align="center" valign="middle"><input name="checkbox" type="checkbox" value="12"/></td>
<td width="20" align="center" valign="middle"><input name="checkbox" type="checkbox" value="13"/></td>
<td width="20" align="center" valign="middle"><input name="checkbox" type="checkbox" value="14"/></td>
<td width="20" align="center" valign="middle"><input name="checkbox" type="checkbox" value="15"/></td>
</tr>
<tr>
<td width="20" align="center" valign="middle"><input name="checkbox" type="checkbox" value="16"/></td>
<td width="20" align="center" valign="middle"><input name="checkbox" type="checkbox" value="17"/></td>
<td width="20" align="center" valign="middle"><input name="checkbox" type="checkbox" value="18"/></td>
<td width="20" align="center" valign="middle"><input name="checkbox" type="checkbox" value="19"/></td>
<td width="20" align="center" valign="middle"><input name="checkbox" type="checkbox" value="20"/></td>
</tr>
<tr>
<td width="20" align="center" valign="middle"><input name="checkbox" type="checkbox" value="21"/></td>
<td width="20" align="center" valign="middle"><input name="checkbox" type="checkbox" value="22"/></td>
<td width="20" align="center" valign="middle"><input name="checkbox" type="checkbox" value="23"/></td>
<td width="20" align="center" valign="middle"><input name="checkbox" type="checkbox" value="24"/></td>
<td width="20" align="center" valign="middle"><input name="checkbox" type="checkbox" value="25"/></td>
</tr>
<tr>
<td height="23" colspan="5" align="center" valign="middle" class="label"></td>
</tr>
<tr>
<td height="28" colspan="5" align="center" valign="middle"><input type="button" value="Test length" id="test" /></td>
</tr>
<tr>
<td height="28" colspan="5" align="center" valign="middle"><input type="submit" name="button" id="button" value="Submit" /></td>
</tr>
<tr>
<td height="28" colspan="5" align="center" valign="middle"><input type="button" name="button" id="button2" value="Test hidden input value" /></td>
</tr>
</table>
<input name="result" type="hidden" id="result" />
</form>
</body>
和javascript:
function clearForms() {
var i;
for (i = 0; (i < document.forms.length); i++) {
document.forms[i].reset();
$(':checkbox[name=checkbox]:disabled').attr('disabled', false);
}
}
//initial checkCount of zero
var checkCount = 0;
//maximum number of allowed checked boxes
var maxChecks = 8;
$(document).ready(function() {
clearForms();
$("#form1").submit(function(e) {
if($("input:checkbox:checked").length < 8) {
alert("You must select at least 8 options before submitting!");
e.preventDefault();
}
});
var $nameCheckbox = $('input:checkbox[name=checkbox]');
$nameCheckbox.click(function() {
//update checkCount
checkCount = $('input:checked').length;
if (checkCount >= maxChecks) {
//alert('you may only choose up to ' + maxChecks + ' options');
$nameCheckbox.not(':checked').attr('disabled', true);
} else {
$nameCheckbox.filter(':disabled').attr('disabled', false);
}
if (this.checked) {
$("td.label").append('<label>' + this.value + ' </label>');
} else {
$("td.label").find(':contains(' + this.value + ')').remove();
}
$('input[name="result"]').val($("td.label").text());
});
$("#test").click(function() {
alert($('input:checked').length)
});
$('#button2').click(function() {
alert($('input[name="result"]').val());
});
});
答案 0 :(得分:5)
首先,感谢那里的提及和您的欢迎。
我的问题是,我如何清理输出,防止任何人利用任何东西,或添加任何会弄乱服务器的东西。需要吗?
我的建议总是在服务器端进行检查。是的,您可以在客户端进行检查,但是当它在客户端时,客户端/用户有权更改内容。所以,如果可以(我建议您必须),请同时进行检查 - 服务器端和客户端端。
答案 1 :(得分:1)
这不可能。 Javascript总是可以被泄露,并且不能信任用户输入。
您可以尝试对代码进行模糊处理,但它永远不会是100%(甚至不接近)。
答案 2 :(得分:1)
不要!
这是一个糟糕的安全计划 - 如果没有其他原因,它对蛮力来说已经成熟。 认真考虑使用已建立的身份验证机制 - 您喜欢的语言有很多选项。
答案 3 :(得分:0)
您可以根据表单结构在服务器上生成哈希值(例如MD5或更好的SHA-1或其他东西),然后在表单提交时将其发送回服务器,并在服务器上重新计算以查看如果用户篡改了表格中的任何内容。旧版CGI Programming in Perl Book概述了这一点,这是我读过的最好的网络编程安全书之一。
我不推荐它,但为了兴趣,可以非常确保用户没有篡改您的表单。