Go Down

Topic: Comment sécuriser mon serveur Web ESP8266 Arduino (Read 1 time) previous topic - next topic

hbachetti

Transformer chaque ligne contenant du HTML :

Quote
MdPWeb += "<form action=\"/login\" method=\"POST\"><center><input type=\"text\" name=\"username\" ></br></br><input type=\"submit\" value=\"Connexion\"></form>";
Comme ceci :

Quote
client.println("<form action=\"/login\" method=\"POST\"><center><input type=\"text\" name=\"username\" ></br></br><input type=\"submit\" value=\"Connexion\"></form>");
C'est ça que tu ne parviens pas à faire ? :smiley-confuse:
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...


Sebboit

#17
Jan 18, 2020, 08:03 am Last Edit: Jan 18, 2020, 02:52 pm by Sebboit
bonjour,


Bon finalement ça ne fonctionne pas :

  server.on("/", HTTP_GET, handleRoot);  //  function when a client requests URI "/"
  server.on("/login", HTTP_POST, handleLogin); //  function when a POST request is made to URI "/login"
  server.onNotFound(handleNotFound); 

ses élément ne sont pas recevable

je lance bien ses 3 fonctions en amont du setup

 ->  void handleRoot();              // function prototypes for HTTP handlers
 ->  void handleLogin();
 ->  void handleNotFound();


j'ai bien reconstruit mes fonctions avec client.println()


Code: [Select]


void handleRoot()
{

   // écouter les clients entrants
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    // une demande http se termine par une ligne vide
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        // si vous êtes arrivé au bout de la ligne (reçu une nouvelle ligne
        // caractère) et la ligne est vide, la demande http est terminée,
        // afin que vous puissiez envoyer une réponse
     
        if (c == '\n' && currentLineIsBlank) {
          // envoyer un en-tête de réponse http standard
          client.println(F("HTTP/1.1 200 OK"));
          client.println(F("Content-Type: text/html"));
          client.println(F("Connection: close"));  // the connection will be closed after completion of the response
          client.println(F("Refresh: 10"));  // rafraîchir la page automatiquement toutes les 5 secondes
          client.println();
          client.println(F("<!DOCTYPE HTML>"));
          client.println(F("<html>"));

          client.println(F("<body style=\"color: rgb(43, 43, 56); background-color: rgb(174, 231, 249);\">"));
          client.println(F("<center>"));
          client.println(F("<font size=7>"));
          client.println(F("<font color=blue>"));
          client.println(F("<font color=#7401DF>"));
          client.println(F( "<font face=\"Comic Sans MS\" size=\"6\" color=#FF9933><i>Gestion piscine </i></font>"));
          client.println(F("</br></br>"));
          client.println(F( "<font face=\"Comic Sans MS\" size=\"3\" color=#009900><i>Se connecter</i></font>"));
          client.println(F( "</br></br>"));
          client.println(F( "<form action=\"/login\" method=\"POST\"><center><input type=\"text\" name=\"username\" ></br></br><input type=\"submit\" value=\"Connexion\"></form>"));

 client.println(F("</font>"));
          client.println(F("</html>"));
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        } else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
   
  }
}




mais je ne vois pas comment initialiser ses " server.on " avec cette librairie ?

Code: [Select]


server.on("/", HTTP_GET, handleRoot);        // Call the 'handleRoot' function when a client requests URI "/"
  server.on("/login", HTTP_POST, handleLogin); // Call the 'handleLogin' function when a POST request is made to URI "/login"
  server.onNotFound(handleNotFound);           // When a client requests an unknown URI (i.e. something other than "/"), call function "handleNotFound"

  server.begin();                            // Actually start the server
  Serial.println("HTTP server started");




 
Merci de ton aide.


hbachetti

#18
Jan 18, 2020, 09:15 am Last Edit: Jan 18, 2020, 09:30 am by hbachetti
Avec 33 posts au compteur tu ignores encore ceci :

https://forum.arduino.cc/index.php?topic=315372.0

Les balises code : avec des [], pas avec des <>
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

Sebboit

Avec 33 posts au compteur tu ignores encore ceci :

https://forum.arduino.cc/index.php?topic=315372.0

Les balises code : avec des [], pas avec des <>

Oups ! Non pas une ignorance juste une erreur !

hbachetti

#20
Jan 18, 2020, 04:47 pm Last Edit: Jan 18, 2020, 04:47 pm by hbachetti
Quote
mais je ne vois pas comment initialiser ses " server.on " avec cette librairie ?
Il n'y en a pas. Il faut décortiquer la requête.

Tu peux t'inspirer de l'exemple précédent.

Code: [Select]

        // ce que tu fais :
        char c = client.read();
        Serial.write(c);


        // ce est fait dans l'exemple :
        char c = client.read();         
        if (readString.length() < 100) { 
          readString += c; 
        }
        // ensuite il faut interpréter readString


Il y a aussi une librairie : Webduino avec des exemples.

Il y a aussi un projet personnel : https://riton-duino.blogspot.com/2019/02/un-web-server-sur-ethernet.html

La méthode http_request::read() du fichier http.cpp fait le boulot.

La méthode http_request::setHandler() fait la même chose que server::on() sur ESP8266.

Tu peux même carrément utiliser http.cpp + http.h + debug.h
Il te faudra cette librairie aussi : mpp-console-logger

Le sketch est directement exécutable sur une MEGA. Essaye-le.

Voilà : de multiples possibilités ...
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

Sebboit

Super, je te remercie je vais décortiquer tout ça et je ferais un retour.

Merci encore de tes exemples.

Sebboit

Bonjour,

Alors malgré les conseil de @ hbachetti, je narrive pas à construire la page d'identification pour appeler ma page de fonction suivante.


J'ai donc repris le code de nanard mais en vain !

Si qqn a une idée.

Merci d'avance

hbachetti

Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

Sebboit

#24
Jan 23, 2020, 01:53 pm Last Edit: Jan 23, 2020, 01:54 pm by Sebboit
le voici

Code: [Select]


void handleRoot()
{

   // écouter les clients entrants
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    // une demande http se termine par une ligne vide
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        //Serial.write(c);
        if (readString.length() < 100) {  
          readString += c;  
         }
      if (c == '\n' && currentLineIsBlank) {
          // envoyer un en-tête de réponse http standard
          client.println(F("HTTP/1.1 200 OK"));
          client.println(F("Content-Type: text/html"));
          client.println(F("Connection: close"));  // the connection will be closed after completion of the response
          client.println(F("Refresh: 10"));  // rafraîchir la page automatiquement toutes les 5 secondes
          client.println();
          client.println(F("<!DOCTYPE HTML>"));
          client.println(F("<html>"));

          client.println(F("<body style=\"color: rgb(43, 43, 56); background-color: rgb(174, 231, 249);\">"));
          client.println(F("<img src=\"http://www.projet-dev.fr/images/plogo.png\"> </LEFT>"));
          client.println(F("<form action=\"/login\" method=\"POST\"><center><input type=\"text\" name=\"username\" ></br></br><input type=\"submit\" value=\"Connexion\"></form>"));
           client.println(F("</font>"));
          client.println(F("</html>"));
           break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        } else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    Serial.println(F("client disconnected"));
  }
}
/***********************************************************************************************************************************
 *                          Page de validation  et renvoie à la page connecté
 * *********************************************************************************************************************************                        
 */
void handleLogin() {                          // Si une demande POST est faite à l'URI / à la connexion
//  if( ! server.hasArg("username") || ! server.hasArg("password")
//      || server.arg("username") == NULL || server.arg("password") == NULL) {            // Si la demande POST ne contient pas de nom d'utilisateur

    if( ! server.hasArg("username")|| server.arg("username") == NULL)  {             // Si la demande POST ne contient pas de nom d'utilisateur et de mot de passe
    client.println(F("400: Saisie invalide..."));       // La requette est invalide, on affiche l'erreur 400
                              
    return;
  }
 if(server.arg("username") == "stest" && server.arg("password") == "test") {         // Si le nom d'utilisateur et le mot de passe sont corrects
 
  //if(server.arg("username") == "nanard" ) {                         // j'affiche ma page web                    
                                                                      
   ethernet();
        
  }
  else {                                                                            
      client.println(F("401: Pas autorise!"));
  }
}
/********************************************************************************************************************
 *                              Erreur 404
 *******************************************************************************************************************
 */
void handleNotFound(){
  client.println(F("404: Not found"));                                       // Send HTTP status 404 (Not Found) when there's no handler for the URI in the request
}


hbachetti

Le problème est simple :
Tu places les caractère reçus dans readString mais tu n'en fais rien.
Comment veux-tu que la fonction handleLogin soit appelée ?

Il me semblait que l'exemple donné en #1 était parlant :

Code: [Select]

           if (readString.indexOf("?button1on") >0){
               digitalWrite(fan, HIGH);
           }
           if (readString.indexOf("?button1off") >0){
               digitalWrite(fan, LOW);
           }      


Dans ton cas il faut comparer readString à "/login" et récupérer la valeur de username.
Cela s'appelle du parsing.
Il faut rechercher dans readString le caractère '?', puis les éventuels caractères '&' qui séparent les arguments.

Code: [Select]

    if( ! server.hasArg("username")|| server.arg("username") == NULL)  {
    // ...
 if(server.arg("username") == "stest" && server.arg("password") == "test") {


La classe EthernetServer W5100 n'a pas de méthode hasarg().
Ton formulaire n'a pas de champ texte "password"

Tout ce boulot est à faire par toi-même :
- appel de la fonction handleLogin si la requête reçue commence par /login
- récupération des arguments

Je l'ai déjà dit :

Quote
La méthode http_request::read() du fichier http.cpp fait le boulot.
Sinon, adopte plutôt un ESP8266.
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

Sebboit

Un grand merci de ses point d'éclaircissement, je refait des essais.


Sebboit

Bonsoir,

j'ai parfaitement réussi a faire mes fonctions, les essaie en ligne fonctionne bien mais je rencontre un souci avec

readString=""; pour me remettre a zero lors du rechargement de la page dans le la requette GEt celle-ci ne se vide pas peut importe ou je la positionne.


quand a la page d'identification je n'arrive pas a la traiter j'ai beau tourner les problèmes dans tous les sens impossible.

si quelqu'un à un exemple un peut plus concret  sur ses points   :



La classe EthernetServer W5100 n'a pas de méthode hasarg().
Ton formulaire n'a pas de champ texte "password"

Tout ce boulot est à faire par toi-même :
- appel de la fonction handleLogin si la requête reçue commence par /login
- récupération des arguments

hbachetti

Quote
je rencontre un souci avec readString=""; pour me remettre a zero lors du rechargement de la page dans le la requette GEt celle-ci ne se vide pas peut importe ou je la positionne.
C'est pourtant ce qui est fait dans l'exemple dont je parle depuis le début.
Si tu fais la même chose il n'y a aucune raison que cela ne marche pas.

Quote
si quelqu'un à un exemple un peut plus concret  sur ses points   :
Tu as l'air de penser que les exemples que je t'ai donné ne sont pas concrets.

Quote
- appel de la fonction handleLogin si la requête reçue commence par /login
- récupération des arguments
Rechercher le mot "/login" dans une chaîne de caractères te pose problème ?
Découper une chaîne avec des séparateurs '?', '&' et '='  idem ?

Il va falloir sérieusement penser à étudier en profondeur la classe String, en particulier startsWith(), indexOf(), substring(), etc.

Quote
Ton formulaire n'a pas de champ texte "password"
Quote
client.println(F( "<form action=\"/login\" method=\"POST\"><center><input type=\"text\" name=\"username\" ></br></br><input type=\"submit\" value=\"Connexion\"></form>"));
C'est simple pourtant. Je vois un champ username mais pas de champ password.
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

Go Up