5566 sujets

Sémantique web et HTML

Bonjour,
pour une interface web d'un objet embarqué, sans réel problème de sécurité (je peux détailler si besoin), je souhaite avoir une page plus difficilement accessible par un code à 4 chiffres.

J'ai fait un formulaire :

<form action="prefs.html" method="POST" name="codepin">
<ul>
<li><input autocomplete="off" type="password" name="pin" pattern="[0-9]+" maxlength=4></li>
</ul>
<input type="submit" value="Envoyer" style="font-weight:bold; margin-bottom:0em" name="code">
</form>
<form action="/" method="post">


En soit ça fonctionne mais :
1- FF couine par rapport à l'absence de sécurité (http pas S)
2- propose par défaut d'enregistrer le mot de passe (sans nom d'utilisateur évidement)

Y a-t-il un moyen d'éviter 1. ?

Je pensais que
autocomplete="off"
désactiverai la demande d'enregistrement de mdp mais non Smiley decu
Donc comment éviter 2. ?

Je pourrais bien sur proposer un clavier virtuel à 10 chiffres et valider 4 clics successifs mais ça va faire inutilement lourd sur le code côté serveur (un ESP32)

Merci de tous conseils ou propositions.
Modifié par ChristianW (22 Apr 2024 - 09:23)
Modérateur
ChristianW a écrit :
Bonjour,
pour une interface web d'un objet embarqué, sans réel problème de sécurité (je peux détailler si besoin), je souhaite avoir une page plus difficilement accessible par un code à 4 chiffres.


En 30 secondes, je te casse ton système et je rentre dans ta/tes pages privée/privées
ChristianW a écrit :

2- propose par défaut d'enregistrer le mot de passe (sans nom d'utilisateur évidement)


Qui est ce ?
niuxe a écrit :
En 30 secondes, je te casse ton système et je rentre dans ta/tes pages privée/privées

OK, je ne suis clairement pas au point sur la sécu informatique, je ne m'en cache pas, mais je pense devoir préciser le contexte pour clarifier les enjeux...

Le dispositif est un projet de matériel pédagogique de TP de physique-chimie. Un ESP32, un ou deux capteurs et une interface web. Les pages publiques : les mesures. La page privée la config de l'appareil (nom de l'accesspoint, deux-trois réglages liés au matériel)
Le méchant pirate : les élèves
La gentille victime : le prof
L'enjeu : faire ièch' le prof.

C'est dans ce contexte que je pensais que la sécurité n'était pas nécessairement digne de la Banque de France mais tu vas peut-être me prouver le contraire, je serai attentif aux arguments. Ensuite je reconnais que le défi technique peut être une bonne motivation chez les élèves et je veux bien que tu m'expliques comment passer en 30 s à la page privée.
(sachant que mon job étant l'humain et pas la technique, en 30 s j'identifie et je botte les fesses du galopin Smiley lol )

En marge de ma question, je suis tout à fait ouvert à toute autre méthode permettant de protéger cette page à la hauteur de l'enjeu.

EDIT : si jamais je veux faire fonctionner le bidule dans un réseau wifi "normal" et pas en accesspoint autonome, il faudra mettre dans cette page privée le SSID et password du réseau et là effectivement, le niveau de sécurité mérite clairement d'être renforcé.
Ce n'était pas prévu initialement mais à la réflexion je suis encore plus intéressé par des proposition plus sérieuses que mon idée initiale !
Modifié par ChristianW (22 Apr 2024 - 10:57)
niuxe a écrit :
Qui est ce ?


Comme il y a un champ password sans champ de nom d'utilisateur, FF propose d'enregistrer le mot de passe mais n'y associe pas de nom d'utilisateur
Modérateur
ChristianW a écrit :

...j'identifie et je botte les fesses du galopin Smiley lol ...

Smiley lol

Je comprends mieux le contexte. Avec quel langage comptes-tu élaborer ce système de password ? (En Javascript côté navigateur, oublie). En php ?
Modérateur
Je ne connais pas le sujet. J'ai fait quelques recherches et je suis tombé sur cette doc. Elle devrait t'aider
Bonjour Niuxe,
niuxe a écrit :
En 30 secondes, je te casse ton système et je rentre dans ta/tes pages privée/privées

Comment ferais-tu cela ? Tu créerais un script qui soumettrait tous les nombres de 0000 à 9999 ?
Modifié par Olivier C (22 Apr 2024 - 15:51)
Modérateur
Olivier C a écrit :
Bonjour Niuxe,

Comment ferais-tu cela ? Tu créerais un script qui soumettrait tous les nombres de 0000 à 9999 ?


Bonjour Olivier, Smiley smile

Il y a des outils qui te font ça pour tester un formulaire (attaque par combinaisons, dictionnaires, etc.). Pas besoin de créer. Sinon, il y a dans itertools les méthodes combinations et combinations_with_replacement. En sortie, tu obtiendras une série de tuples* avec toutes les combinaisons possibles.

exemple** :

from itertools import combinations_with_replacement
values = list(range(10)) # une liste de 0 à 9
print(list(combinations_with_replacement(values, 4)))


* un tuple est une liste de valeurs immuables :

un_tuple = ('one','two', 'three')

** Si tu sais que le formulaire est à 4 chiffres. Mais comme je l'ai indiqué, il y a des outils pour ça

ps : un script en php ou en js, ce n'est pas très difficile à faire.
Modifié par niuxe (22 Apr 2024 - 18:48)
niuxe a écrit :
Je ne connais pas le sujet. J'ai fait quelques recherches et je suis tombé sur cette doc. Elle devrait t'aider

Merci, je vais regarder cela. Je connais le site mais ce tuto m'avait échappé...
Modifié par ChristianW (22 Apr 2024 - 21:16)
niuxe a écrit :
Il y a des outils qui te font ça pour tester un formulaire (attaque par combinaisons, dictionnaires, etc.)

Si on impose un délai (éventuellement de plus en plus long) ça devrait être plus robuste non ?
niuxe a écrit :
ps : un script en php ou en js, ce n'est pas très difficile à faire.

Jamais testé mais ce serait rigolo. En sachant que l'ado dispose de quelques infos grâce aux attributs de l'input :
pattern="[0-9]+" maxlength=4

Il pourrait faire un truc du genre :
function testerEtSoumettre() {
    let pinInput = document.getElementById("pin");
    let i = 0;
    let interval = setInterval(function() {
        let pinValue = pad(i++, 4); // Formatage du nombre avec des zéros devant
        // Remplir le champ avec le nouveau PIN
        pinInput.value = pinValue;
        // Valider et soumettre le formulaire si le PIN est valide
        if (validerPIN(pinValue)) {
            document.forms["codepin"].submit();
            clearInterval(interval); // Arrêter la boucle d'itération
        }
        // Arrêter la boucle d'itération une fois que tous les chiffres ont été testés
        if (i > 9999) {
            clearInterval(interval);
            alert("Aucun PIN valide trouvé.");
        }
    }, 10); // Délai entre chaque itération (en millisecondes)
}

function validerPIN(pin) {
    // Validation du PIN, vérifier s'il est rempli
    return pin !== "";
}

// Fonction pour ajouter des zéros devant un nombre jusqu'à atteindre une certaine longueur
function pad(num, size) {
    let s = num + "";
    while (s.length < size) s = "0" + s;
    return s;
}

testerEtSoumettre()

Je ne sais pas si ça marche, c'est juste pour le fun (je suis un galopin, je vais me faire botter les fesses).

ChristianW a écrit :
Si on impose un délai (éventuellement de plus en plus long) ça devrait être plus robuste non ?

Il me semble que oui, c'est ce que je ferais en tout cas. Mais je préfère laisser Niuxe vous répondre sur ce point, je ne suis pas compétent en la matière.
Modifié par Olivier C (23 Apr 2024 - 00:02)
Modérateur
Olivier C a écrit :

Jamais testé mais ce serait rigolo. En sachant que l'ado dispose de quelques infos grâce aux attributs de l'input :
pattern="[0-9]+" maxlength=4


exact Smiley smile

À noter que la valeur d'un attribut en html traditionnel est toujours entourée par des guillemets.

Olivier C a écrit :


Il pourrait faire un truc du genre :
function testerEtSoumettre() {
    let pinInput = document.getElementById("pin");
    let i = 0;
    let interval = setInterval(function() {
        let pinValue = pad(i++, 4); // Formatage du nombre avec des zéros devant
        // Remplir le champ avec le nouveau PIN
        pinInput.value = pinValue;
        // Valider et soumettre le formulaire si le PIN est valide
        if (validerPIN(pinValue)) {
            document.forms["codepin"].submit();
            clearInterval(interval); // Arrêter la boucle d'itération
        }
        // Arrêter la boucle d'itération une fois que tous les chiffres ont été testés
        if (i < 9999) {
            clearInterval(interval);
            alert("Aucun PIN valide trouvé.");
        }
    }, 10); // Délai entre chaque itération (en millisecondes)
}

function validerPIN(pin) {
    // Validation du PIN, vérifier s'il est rempli
    return pin !== "";
}

// Fonction pour ajouter des zéros devant un nombre jusqu'à atteindre une certaine longueur
function pad(num, size) {
    let s = num + "";
    while (s.length &lt; size) s = "0" + s;
    return s;
}

testerEtSoumettre()


J'ai lu vite fait et en effet, l'idée est là.
Olivier C a écrit :

Je ne sais pas si ça marche, c'est juste pour le fun (je suis un galopin, je vais me faire botter les fesses).

Smiley lol
Olivier C a écrit :

Il me semble que oui, c'est ce que je ferais en tout cas. Mais je préfère laisser Niuxe vous répondre sur ce point, je ne suis pas compétent en la matière.


Un anti brute force parait une solution simple. Au bout de 3 ou ... tentatives, un cookie est créé. Et si le système détecte ce cookie, ça renvoie une 404 ou un semblant de page qui ne fait rien (plus vicieux). Le souci et que je ne pourrai pas aider dans l'ESP32. Je ne connais pas du tout le sujet.

Une bonne manière de concevoir un bon mot de passe :
un mot de passe long de 8 caractères minimum, chiffre, lettre, majuscule, "caractères spéciaux". Pas de mots évidents. Le mieux étant une ou deux phrases longues (en leet ou pas) :
Que faisaient les élèves ? Les 3 élèves jouaient aux échecs pendant la récréation !
Modifié par niuxe (23 Apr 2024 - 01:50)
Meilleure solution
Olivier C a écrit :
Je ne sais pas si ça marche, c'est juste pour le fun (je suis un galopin, je vais me faire botter les fesses).
Smiley ravi j'ai une affection particulière pour ce genre d'élèves... à faire une connerie et venir ensuite « m'sieur faut que j'vous montre un truc ! »
Je n'ai jamais été ce genre d'élève, j'étais bien trop sage. Mais cette description me rappelle des souvenirs !
Modérateur
Olivier C a écrit :

Ce qu'il y a de bien avec toi c'est que l'on découvre toujours pleins de trucs qui sortent de l'ordinaire.


Merci Smiley smile