2010-10-05 21 views
1

Je crée une page qui permet aux utilisateurs d'accéder à une certaine section de mon site Web s'ils cliquent sur 8 cases sur 25 dans le bon ordre. Tout d'abord grâce à Reigel pour le code orignal, il a pris ce que j'avais et l'a réécrit, ce qui est bien mieux que ce que j'ai d'abord commencé. Merci également à Peter Ajtai pour m'avoir aidé à optimiser le code.Empêcher l'exploitation du code, sécuriser Javascript et les formulaires

Ma question est, comment puis-je nettoyer la sortie, empêcher quiconque d'exploiter quoi que ce soit, ou d'ajouter quelque chose qui va gâcher le serveur. Est-ce nécessaire?

Voici une version live: Click Here to see a live working version

Mon code est le suivant:

<body onLoad="clearForms()" onUnload="clearForms()"> 

<p>&nbsp;</p> 
<p>&nbsp;</p> 
<p>&nbsp;</p> 
<p>&nbsp;</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> 

Et le 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()); 
    }); 

}); 
+1

chaque fois que je vois votre code, je * veux * vraiment jouer à un jeu de cuirassés ... peut-être que si la sécurité ne marche pas, vous pourriez aller pour le marché des jeux occasionnels =) –

+0

lol, ce serait cool . Quand j'ai d'abord pensé à cette idée, j'ai réalisé qu'une chose aussi simple pouvait avoir un potentiel décent en tant que simple jeu. Si je peux passer la courbe d'apprentissage du codage, je pourrais utiliser cela pour quelques idées différentes que j'ai. Évidemment, n'importe qui est libre d'utiliser ce code, après tout, beaucoup ont aidé. La plus grande partie de ma participation vient d'être assis ici en pensant aux bonnes questions à poser, et en jouant du mieux que je peux. – James

Répondre

5

Tout d'abord, merci pour l'y mention et votre très bienvenue. Ma question est, comment puis-je nettoyer la sortie, empêcher quiconque d'exploiter quoi que ce soit, ou ajouter quelque chose qui gâcherait le serveur. Est-ce nécessaire? Ma suggestion est toujours de faire une vérification sur le côté serveur. Oui, vous pouvez faire une vérification côté client, mais quand c'est du côté client, le client/utilisateur a le pouvoir de changer les choses. Donc, si vous le pouvez (je vous suggère de le faire), faites les deux vérifications - côté serveur et côté client.

+1

+1 pour toujours vérifier les choses sur le serveur. La validation de formulaire côté client de HTML 5 envoie des frissons dans ma colonne vertébrale en pensant à la façon dont les gens vont l'utiliser et oublier de vérifier sur le serveur. –

+0

Pas un problème, vous m'avez vraiment aidé à simplifier le code, le moins que je puisse faire est de donner crédit et merci où il est dû :) Je cherche à autoriser uniquement les entiers ou les nombres, je veux créer une fonction qui vérifie cela mais je ne sais pas exactement comment s'y prendre. J'ai quelques sites Web, qui ont des fonctions de type htmlentity, mais je ne sais pas dans quelle mesure je dois aller pour créer ceci. J'ai peur de l'exagération, y a-t-il une fonction standard là-bas qui nettoie tout ce qui est soumis que vous connaissez? – James

+0

Jetez un coup d'oeil à http://php.net/filter_input_array –

1

Cela ne peut pas être fait. Javascript peut toujours être compromis et aucune entrée de l'utilisateur ne peut être approuvée.

Vous pourriez essayer d'obfusciter le code, mais il ne sera jamais 100% (même pas proche).

+2

Je suis d'accord, et souligner que obfuscating le JavaScript est plus susceptible de piquer l'intérêt des gens qui, autrement, seraient simplement égarés. Ceux * déterminés * à visser avec son site auront toujours leurs motivations, même si cela peut être difficile (théoriquement) pour eux. –

+0

Je suppose que ce que je me demande n'est pas tellement de savoir si l'utilisateur a trafiqué le formulaire, mais plus sur l'entrée qui pourrait ouvrir l'accès à mon serveur, laissez-moi d'abord dire que je suis un noob extrême. mais j'ai lu auparavant comment quelqu'un peut entrer quelque chose comme 'hi-x = 4' et y accéder. Je pourrais me tromper totalement, mais c'est ce dont je m'inquiétais. – James

+0

@James - 'mais j'ai lu avant comment quelqu'un peut entrer quelque chose comme 'salut-x = 4' et accéder '- vous vous inquiétez trop. ;) Si vous êtes bon côté serveur (pas moi, je suis un client), alors vous n'avez pas à vous inquiéter. Disons, dans 'php' vous pourriez faire quelque chose comme' if ($ _GET [inputName] == 'hi-x = 4') {echo 'Quelque chose ne va pas, je pars'; exit} '- Je ne suis pas sûr que ce soit le bon code' php' mais je suppose que vous aurez l'idée. – Reigel

1

Ne le faites pas!

C'est un schéma de sécurité médiocre - si pour aucune autre raison il est mûr pour la force brute. Sérieusement pensez à utiliser un mécanisme d'authentification établi - il y a des tonnes d'options dans n'importe quelle langue que vous préférez.

+0

Cela allait être ma prochaine question, s'il était possible d'enregistrer des tentatives par ip, et d'interdire ips basé sur un nombre spécifié de tentatives par seconde ou minute. Je pense que j'ai assez de code pour le coller dans un de mes anciens sites web qui kepts track de hits ip. mais je préférerais avoir quelque chose qui a été écrit spécifiquement pour ce code. – James

+0

@James - tout est possible, mais trop compliqué pour être une bonne idée. Quelle langue/plateforme utilisez-vous pour votre serveur? – STW

+0

apache & php, si je l'utilise pour d'autres idées Je vais avoir besoin de mysql pour suivre les tentatives, bannir les ips etc.Im def va l'utiliser pour donner à certaines personnes l'accès à certaines zones de mon site, mais rien de trop important ne sera derrière. Cependant j'ai Ive cette idée pour elle, qui a évolué au cours des derniers jours, et pour cette idée, il doit avoir une vérification côté serveur. Pour l'instant, c'est juste une notion amusante. – James

0

Vous pouvez générer un hachage sur le serveur (tel qu'un MD5 ou un SHA-1 ou un autre) en fonction de la structure du formulaire, que vous renvoyez ensuite au serveur lors de la soumission du formulaire et recalculez sur le serveur voir si l'utilisateur a trafiqué quelque chose dans le formulaire. Ceci est décrit dans le vieux CGI Programming in Perl Book, qui est d'ailleurs l'un des meilleurs livres sur la sécurité de programmation Web que j'ai jamais lu.

Je ne le recommande pas, mais par intérêt, il est possible d'être joli sûr qu'un utilisateur n'a pas altéré votre formulaire.

+0

J'espère que je vais travailler mon chemin jusqu'à ce niveau, merci pour votre réponse :) – James