Mantendo o código de ser explorado, protegendo JavaScript e formulários
-
27-09-2019 - |
Pergunta
Estou criando uma página que permita aos usuários acesso a uma determinada seção do meu site se eles clicarem em 8 de 25 caixas de seleção na sequência correta.
Primeiro de tudo graças a Reigel Para o código orignal, ele pegou o que eu tinha e o reescrevi, é melhor do que o que iniciava. Também obrigado a Peter Ajtai por me ajudar a otimizar o código.
Minha pergunta é: como posso limpar a saída, impedindo que alguém explore qualquer coisa ou adicionando qualquer coisa que atrapalhe o servidor. É necessário?
Aqui está uma versão ao vivo: Clique aqui para ver uma versão de trabalho ao vivo
Meu código é o seguinte:
<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>
E o 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());
});
});
Solução
Primeiro de tudo, obrigado pela menção lá e pelo seu mais bem -vindo.
Minha pergunta é: como posso limpar a saída, impedindo que alguém explore qualquer coisa ou adicionando qualquer coisa que atrapalhe o servidor. É necessário?
Minha sugestão é sempre fazer uma verificação no lado do servidor. Sim, você pode fazer uma verificação no lado do cliente, mas quando está no lado do cliente, o cliente/usuário tem o poder de mudar as coisas. Portanto, se você puder (sugiro que você deve), faça a verificação - servidor e lado do cliente.
Outras dicas
Isso não pode ser feito. O JavaScript sempre pode ser comprometido e nenhuma entrada do usuário pode ser confiável.
Você pode tentar ofuscar o código, mas nunca será 100% (nem mesmo perto).
Não!
Esse é um esquema de segurança ruim-se, por nenhum outro motivo, estiver maduro para a força bruta. Seriamente Considere usar um mecanismo de autenticação estabelecido-existem toneladas de opções em qualquer idioma que você preferir.
Você pode gerar um hash no servidor (como um MD5 ou melhor SHA-1 ou algo assim) com base na estrutura do formulário, que você envia de volta ao servidor no envio do formulário, e recalcular no servidor para ver se o usuário adulterado com qualquer coisa na forma. Isso é descrito no velho Programação CGI no livro Perl, que aliás é um dos melhores livros sobre segurança de programação da web que já li.
Eu não recomendo, mas por interesse é possível ser bonito Claro que um usuário não participou do seu formulário.