5546 sujets

Sémantique web et HTML

Bonjour,
Je profite du confinement pour faire des trucs auxquels j’avais pensé !
Et là, je tombe sur un drôle d’os !
Je voulais sécuriser l’accès de quelques pages sur mon site. J’ai trouvé un programme qui fait exactement ce que je veux, sauf qu’il ne fonctionne qu’en local.

<form onSubmit="Verifie();return false;" action="#" method="get" name="flog">
	<font size=2 face="arial">Votre identifiant : </font>
	<input type="text" name="password" size=30>
	<input type='submit' name="bouton" value='Validez'>
</form>

Mais dès que je passe sur le réseau, ça ne fonctionne plus.
La faute au type "password":

<input type="password" name="password" size=30>


Par contre, si je mets le type "text", ça passe !

<input type="text" name="password" size=30>


Bien sûr, je pourrai passer en https, mais à 100 € par année, ce n’est pas la peine !
Le probéème, si je suis en "text", un buffer quelconque garde quelque part les mots de passe utilisés, et on peut assez facilement les récupérer !
Comment faite pour vider ces buffers ?
Grand merci si quelqu’un a un idée, ou une piste.
J’utilise Firefox, mais le même résultat avec Chrome !
H.
Modérateur
Bonjour,

Je ne vois pas trop ce qui pourrait empêcher ton code de marcher que ce soit avec un champ "password" ou un champ "text". La phrase "Mais dès que je passe sur le réseau, ça ne fonctionne plus." me laisse dubitatif. C'est quoi les symptômes ?

Mais tout ça dépend de ce que tu as dans la fonction Verifie() dont on n'a pas le code.

Ceci étant, si Verifie() ne contacte pas le serveur pour valider le mot de passe, tu peux mettre ta solution à la poubelle, car tout sera effectué sur l'ordinateur de l'internaute, et c'est un très mauvais principe du point de vue de la sécurité.

Et si Verifie() contacte le serveur pour valider le mot de passe, tu peux mettre ta solution à la poubelle aussi, car c'est bien plus propre de faire cette vérification sur le serveur dans le script (php?) exécuté après l'envoi du formulaire.

D'une manière générale, en sécurité, il ne faut pas trop s'écarter des méthodes normales, car sinon, on a vite fait de faire des grosses bêtises. Ou alors, on est un expert (mais dans ce cas, on ne pose pas les questions que tu poses).

Amicalement,
Bonjour,
Merci de ta réponse ! Non, je ne suis pas un spécialiste de la sécurité, loin de là. Mais je ne suis ni une banque, ni la NSA, ni un organisme de vente par correspondance. Juste un peu de discrétion me suffit amplement.
Pour simplifier les échanges, je te passe les quelques pages de test :
La première, la fonction "Verifie"

var total_erreur = 0;

function Check() {
	var tabc = Check.arguments;
	var ok = 0;
	var tab = "                   azertyuiopqsdfghjklmwxcvbnAZERTYUIOPQSDFGHJKLMWXCVBN0123456789_$&#@";
	for (var no = 0; no < tabc.length; no++) {
		checksum = tabc[no];
		
		var login = "alsacreation";
		var nblog = login.length;
		
		var password = document.forms["flog"].elements["password"].value;
		var nbpass = password.length;
		
		var sum = 1;

// Calcul de la checksum. La fonction est modifiable !
		var n = Math.max(nblog, nbpass)
		for (var i = 0; i < n; i++) {
			var index1 = tab.indexOf(login.substring(i, i + 1)) + 10;
			var index2 = tab.indexOf(password.substring(i, i + 1)) + 10;
			sum = sum + (index1 * n * (i + 1)) * (index2 * (i + 1) * (i + 1));
		}
// Test de la checksum
// Checksum OK
		if (sum == checksum) {
			location = "P2.html";
			ok = 1;
			no = 100;
		}
//Checksum not OK
	}
	if (ok == 0) {
		total_erreur++;
		alert("Mauvais login ou mot de passe");
// Après 3 essais, redirection...
		if (total_erreur > 2) { 
			alert("Vous avez atteint les 3 essais !\n");
			location = "./erreur.html";
		}
	}
}

function Verifie() {
	Check(32336389)
}

Deuxième page, la page d'appel :

<!DOCTYPE html>
<html>

<head>
	<meta charset="utf-8" />
	<title>Page 1 test</title>
	<script src="psw.js"></script>

</head>

<body>

	<div>
			<p><center>
			<form onSubmit="Verifie();return false;" action="#" method="get" name="flog">
				<font size=2 face="arial">Votre identifiant : </font>
				<input type="password" name="password" size=30>
				<input type='submit' name="bouton" value='Validez'>
			</form>
			</center>
			</p>
	</div>
</body>

</html>

Troisième page, la page appelée :

<!DOCTYPE html>
<html>

<head>
	<meta charset="utf-8" />
	<title>Page 2 test</title>
</head>

<body>

	<div>
			<p><center>
			Vous êtes dans la page 2
			</center></p>
	</div>
</body>

</html>

Et enfin le générateur de clé, qui lui ne tourne que sur ma machine personnelle :

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Calculer son checks - Logins et mots de passe multiples</title>
    <SCRIPT LANGUAGE="JavaScript">
        function Calculer() {
            var tab = "                   azertyuiopqsdfghjklmwxcvbnAZERTYUIOPQSDFGHJKLMWXCVBN0123456789_$&#@";
            var login = document.forms[0].elements["login"].value;
            var password = document.forms[0].elements["password"].value;
            var nblog = login.length;
            var nbpass = password.length;
            var sum = 1;
            var n = Math.max(nblog, nbpass)
            for (var i = 0; i < n; i++) {
                var index1 = tab.indexOf(login.substring(i, i + 1)) + 10;
                var index2 = tab.indexOf(password.substring(i, i + 1)) + 10;
                sum = sum + (index1 * n * (i + 1)) * (index2 * (i + 1) * (i + 1));
            }
            document.forms[0].elements["checksum"].value = sum;
        }
    </SCRIPT>
</head>

<body>
    <h1>Protection par logins et mots de passe multiples</h1>
   <h2>Comment ça marche ?</h2>

    <p>Le principe est simple : le LOGIN est le nom de la page HTML qu'il protége.
        Le navigateur charge donc la page <B>login+".html"</B> quand le couple LOGIN / MOT DE PASSE est valide.<BR>
        Pour éviter de charger une page qui n'existe pas (cas d'un login erroné),
        on calcule une checksum à partir des caractéres du login et du mot de passe saisi.<BR>
        On compare ensuite cette checkcum avec celle du script. Si elles sont égales,
        on a (presque) toutes les chances pour que le login saisi soit le bon. Ainsi, la page à charger
        existe et on ne risque pas l'erreur 404 - Page non trouvée.<BR>
        Cette checksum rend un chiffre assez grand (pour éviter de tomber par hasard sur la même
        avec un mot de passe différent). Mais elle ne permet pas de trouver le mot de passe.<BR>
        La seule solution pour trouver le login et le mot de passe est d'essayer toutes les combinaisons !<BR><BR>
        Pour trouver la checksum d'un nouveau couple LOGIN / MOT DE PASSE, voyez la suite.<BR><BR>

        Une fois que vous avez toutes les checksum de vos mots de passe, vous les ajoutez dans l'entête de la page
        qui contient le formulaire de saisie de cette façon :<BR>
        function Verifie() {<BR>
        Check(1111111,2222222,3333333)<BR>
        }<BR>
        en remplaçant par les vraies valeurs de checksum.
    </p>
<hr>
    <div id="cal">
        <h2 id="h2cal">le login et le mot de passe associé</h2>
        <center><FORM>
            <TABLE border=0>
                <TR>
                    <TD>
                        <FONT size=2 face="arial">LOGIN : ></FONT>
                    </TD>
                    <TD><INPUT name="login" type='text' size=20></TD>
                </TR>
                <TR>
                    <TD>
                        <FONT size=2 face="arial">PASSWORD : ></FONT>
                    </TD>
                    <TD><INPUT type="text" name="password" size=20></TD>
                </TR>
                <TR>
                    <TD colspan=2 align=center><INPUT type='button' value='Calculer la checksum' onClick="Calculer()">
                    </TD>
                </TR>
                <TR>
                    <TD colspan=2 align=center><INPUT type='text' name="checksum" size=20></TD>
                </TR>
            </TABLE>
        </FORM>
    </center>
    </div>
</body>


Donc, à aucun moment les mots de passe ne transitent par le réseau. Comme dit dans mon précédent message, si, dan la page 1 je laisse type = "password", peut-être que les pare-feux en route bloquent tout. Par contre, si je passe en type = "text", ça passe.
Si vous lancez le page 1, le mot de passe est "zorro", mais en suivant les infos du générateur, et en utilisant le login"alsacreation", vous pouvez faire ce que vous
Ma configuration :
Le serveur sur Raspberry Pi 3 B+, avec Nginx, derrière une Freebox.
J'espère avoir été assez clair dans mes explications
Avec mes remerciements et mes meilleures salutations
H.
A moi la honte !
Que s'est-il passé dans mon transfert par FTP ? Ais-je mal choisi le fichier à transférer ? Va savoir ...
Mais j'ai repassé toutes mes pages html et tous mes programmes JS, et maintenant, ça fonctionne. Juste le petit message au moment de saisir le mot de passe, avisant l'opérateur que le site n'est pas sûr !
Super, et merci de t'être penché sur mon problème.
Cordiales salutations
H.