PureBasic

Forums PureBasic
Nous sommes le Sam 18/Mai/2013 23:27

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 17 messages ]  Aller à la page 1, 2  Suivante
Auteur Message
 Sujet du message: J'aime quand ça marche (Envoyer des données à un serveur)
MessagePosté: Lun 26/Sep/2011 14:50 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 22/Aoû/2010 15:24
Messages: 1488
Localisation: IDF (Yvelines)
C'est ma méthode pour envoyer des données à un serveur (Apache, Php)

Vous trouverez ci-dessous le code Pure Basic ainsi que le script simplifié se trouvant sur le serveur.
Le serveur est un hébergement mutualisé chez 1and1.

Code:
;Se connecter et envoyer des données à un serveur (Apache, Php)
If InitNetwork()
 
   HostConnection.i=0                     ;je suis connecté ou pas
   HostName.s = "s242132022.onlinehome.fr";Adresse du serveur
   HostPort.i = 80                        ;port
   HostFolder.s="/racal/"                 ;dossier ou se trouve les scripts php
   HostUrl.s=""                           ;Url qui permettra d'envoyer les données     
   Buffer.s=""                            ;Récupération du resultat de la soumission de l'url
   
   ;Pour notre test, on va demander à un script de calculer une surface
   ;et de nous renvoyer le resultat
   Largeur.s = "5"
   Longueur.s = "10"
   
   ;On se connecte
   HostConnection = OpenNetworkConnection(HostName, HostPort, #PB_Network_TCP)
   
   ;Suis je connecté ?
   If HostConnection
     Debug "J'aime ça quand ça marche !"
   
     ;Formatage de l'url
   
     ;Methode Post
     HostUrl = "POST "
   
     ;Script à lancer sur le serveur (? indique que le script attend des données)
     HostUrl + HostFolder + "jaime.php?"
   
     ;Donnée à envoyer
     HostUrl + "&largeur=" + URLEncoder(largeur) ;Envoi de la variable largeur
     HostUrl + "&longueur=" + URLEncoder(longueur) ;Envoi de la variable longueur
   
     ;Fin du formatage
     HostUrl + " HTTP/1.0" + #CRLF$
     HostUrl + "Host: " + HostName + #CRLF$ + #CRLF$
     Debug hosturl
     
     ;Envoie de l'url
     If SendNetworkString(HostConnection, HostUrl)
       Delay(200)
       *buffer = AllocateMemory(65535)
       dwBytes = 1
       While dwBytes > 0
         dwBytes = ReceiveNetworkData(HostConnection, *buffer, 65535)
       Wend
       
     Else
       Debug "Erreur lors de l'envoi des données !!!"
     EndIf
   
     ;fermeture de la connexion
     CloseNetworkConnection(HostConnection)
   
     ;Affichage du résultat
     Buffer=PeekS(*buffer)
     Debug buffer
     
     ;Regardez les 2 derniéres lignes
     For i=1 To CountString(Buffer, Chr(13)) + 1
      Debug StringField(Buffer, i, Chr(13))
     Next
     
     ;Libère la zone mémoire
     FreeMemory(*Buffer)
     
   Else
     ;Connexsion impossible
     Debug "Connexion impossible"
   EndIf
   ;Fin initnextwork
EndIf


le script php
Code:
<?php
   //Reception des données
   $longueur = urldecode($_GET['longueur']);
   $largeur = urldecode($_GET['largeur']);
   
   //Envoi du résultat
   echo "moi aussi j'aime quand ça marche".chr(13);
   echo "La surface calculée est de : ".$largeur*$longueur;
?>


N'hésitez pas à faire des test.

_________________
Noob Inside ■ (Windows 7 & 8 - PB 4.51 & 5.10 Full version) ■ Mode politiquement Correct
SQLite Vision : Éditeur de fichiers SQLite


Dernière édition par falsam le Lun 26/Sep/2011 23:11, édité 1 fois.

Haut
 Profil  
 
 Sujet du message: Re: J'aime quand ça marche (Envoyer des données à un serveur
MessagePosté: Lun 26/Sep/2011 15:27 
Hors ligne

Inscription: Dim 23/Déc/2007 18:10
Messages: 471
T'as essayé avec un espace :mrgreen:.


Haut
 Profil  
 
 Sujet du message: Re: J'aime quand ça marche (Envoyer des données à un serveur
MessagePosté: Lun 26/Sep/2011 16:41 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 22/Aoû/2010 15:24
Messages: 1488
Localisation: IDF (Yvelines)
HahahahahahaAAAAHHHHHAHAHAImage

_________________
Noob Inside ■ (Windows 7 & 8 - PB 4.51 & 5.10 Full version) ■ Mode politiquement Correct
SQLite Vision : Éditeur de fichiers SQLite


Haut
 Profil  
 
 Sujet du message: Re: J'aime quand ça marche (Envoyer des données à un serveur
MessagePosté: Lun 26/Sep/2011 22:19 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 09/Oct/2005 16:51
Messages: 5210
Cool ça merci :)

falsam a écrit:
HahahahahahaAAAAHHHHHAHAHAImage


J'ai rit aussi ayant lu le précédent topic :mrgreen:

_________________
.: Ar-S :. - Windows 8 x64 - Radeon HD 7870 - PB 5.11
LDV MULTIMEDIA : Assistance informatique Isère (38) Oyeu
PURE BASIC forum non officiel : Forum PB


Haut
 Profil  
 
 Sujet du message: Re: J'aime quand ça marche (Envoyer des données à un serveur
MessagePosté: Lun 26/Sep/2011 23:13 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 22/Aoû/2010 15:24
Messages: 1488
Localisation: IDF (Yvelines)
Question :
Vaut il mieux ouvrir une connexion avec un serveur en début de programme et la fermer à la fin du programme, ou bien ouvrir une connexion pour chaque transaction avec le serveur et la fermer ensuite ?

_________________
Noob Inside ■ (Windows 7 & 8 - PB 4.51 & 5.10 Full version) ■ Mode politiquement Correct
SQLite Vision : Éditeur de fichiers SQLite


Haut
 Profil  
 
 Sujet du message: Re: J'aime quand ça marche (Envoyer des données à un serveur
MessagePosté: Lun 26/Sep/2011 23:26 
Hors ligne

Inscription: Mer 11/Fév/2004 0:32
Messages: 1015
Localisation: Québec, Canada
falsam a écrit:
Question :
Vaut il mieux ouvrir une connexion avec un serveur en début de programme et la fermer à la fin du programme, ou bien ouvrir une connexion pour chaque transaction avec le serveur et la fermer ensuite ?


Moi je dirais on l'ouvre une fois, on la laisse ouverte, on met en place un chronomètre et si aucune requête est envoyée au serveur après x minutes on ferme la connexion. Bien sûr, si le programme s'arrête avant les x minutes, on ferme la connexion. (Je pense qu'à la fermeture du programme elles se ferment automatiquement)
Et avoir un bouton de contrôle pour fermer la connexion manuellement est également un plus. (Ou un raccourci dans un menu déroulant)

A+
Guimauve


Dernière édition par Guimauve le Lun 26/Sep/2011 23:38, édité 1 fois.

Haut
 Profil  
 
 Sujet du message: Re: J'aime quand ça marche (Envoyer des données à un serveur
MessagePosté: Lun 26/Sep/2011 23:34 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 22/Aoû/2010 15:24
Messages: 1488
Localisation: IDF (Yvelines)
J'adopte :)

_________________
Noob Inside ■ (Windows 7 & 8 - PB 4.51 & 5.10 Full version) ■ Mode politiquement Correct
SQLite Vision : Éditeur de fichiers SQLite


Haut
 Profil  
 
 Sujet du message: Re: J'aime quand ça marche (Envoyer des données à un serveur
MessagePosté: Ven 30/Sep/2011 15:30 
Hors ligne

Inscription: Dim 23/Déc/2007 18:10
Messages: 471
Ce que tu fais Falsam n'est pas une requête POST, mais GET
Supprimé : & pour HostUrl + "largeur=" + URLEncoder(largeur)
Ajouté : HostUrl + "Connection: Close" + #CRLF$ + #CRLF$

Comme ça la requête finale est plus jolie :wink:.

Mais ATTENTION parce qu'en l'état, le code de Falsam comme le mien à une belle faille de sécurité.
Code:
;Se connecter et envoyer des données à un serveur (Apache, Php)
If InitNetwork()
     
      HostConnection.i=0                     ;je suis connecté ou pas
      ;HostName.s = "s242132022.onlinehome.fr" ;Adresse du serveur
      HostName.s = "localhost" ;Adresse du serveur
      HostPort.i = 80                        ;port
      ;HostFolder.s="/racal/"                 ;dossier ou se trouve les scripts php
      HostFolder.s = "/post/"                 ;dossier ou se trouve les scripts php
      HostUrl.s=""                           ;Url qui permettra d'envoyer les données     
      Buffer.s=""                            ;Récupération du resultat de la soumission de l'url
     
      ;Pour notre test, on va demander à un script de calculer une surface
      ;et de nous renvoyer le resultat
      Largeur.s = "5"
      Longueur.s = "10"
     
      ;On se connecte
      HostConnection = OpenNetworkConnection(HostName, HostPort, #PB_Network_TCP)
     
      ;Suis je connecté ?
      If HostConnection
            Debug "J'aime ça quand ça marche !"
           
            ;Formatage de l'url
           
            ;Methode Get
            HostUrl = "GET "
           
            ;Script à lancer sur le serveur (? indique que le script attend des données)
            HostUrl + HostFolder + "jaime.php?"
           
            ;Donnée à envoyer
            HostUrl + "largeur=" + URLEncoder(largeur) ;Envoi de la variable largeur
            HostUrl + "&longueur=" + URLEncoder(longueur) ;Envoi de la variable longueur
           
            ;Fin du formatage
            HostUrl + " HTTP/1.1" + #CRLF$
            HostUrl + "Host: " + HostName + #CRLF$
            HostUrl + "Connection: Close" + #CRLF$ + #CRLF$
            Debug hosturl
           
            ;Envoie de l'url
            If SendNetworkString(HostConnection, HostUrl)
                  Delay(200)
                  *buffer = AllocateMemory(65535)
                  dwBytes = 1
                  While dwBytes > 0
                        dwBytes = ReceiveNetworkData(HostConnection, *buffer, 65535)
                  Wend
                 
            Else
                  Debug "Erreur lors de l'envoi des données !!!"
            EndIf
           
            ;fermeture de la connexion
            CloseNetworkConnection(HostConnection)
           
            ;Affichage du résultat
            Buffer=PeekS(*buffer)
            ;Debug buffer
           
            ;Regardez les 2 derniéres lignes
            For i=1 To CountString(Buffer, Chr(13)) + 1
                  Debug StringField(Buffer, i, Chr(13))
            Next
           
            ;Libère la zone mémoire
            FreeMemory(*Buffer)
           
      Else
            ;Connexsion impossible
            Debug "Connexion impossible"
      EndIf
      ;Fin initnextwork
EndIf


Haut
 Profil  
 
 Sujet du message: Re: J'aime quand ça marche (Envoyer des données à un serveur
MessagePosté: Ven 30/Sep/2011 17:51 
Hors ligne

Inscription: Mer 11/Fév/2004 0:32
Messages: 1015
Localisation: Québec, Canada
Geo Trouvpatou a écrit:
Mais ATTENTION parce qu'en l'état, le code de Falsam comme le mien à une belle faille de sécurité.


Et comment on fait pour la rendre sécurisé ? Moi j'y connais un gros 0 dans ce domaine alors ...

Merci à l'avance.
Guimauve


Haut
 Profil  
 
 Sujet du message: Re: J'aime quand ça marche (Envoyer des données à un serveur
MessagePosté: Sam 01/Oct/2011 0:16 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 22/Aoû/2010 15:24
Messages: 1488
Localisation: IDF (Yvelines)
Geo Trouvpatou a écrit:
Mais ATTENTION parce qu'en l'état, le code de Falsam comme le mien à une belle faille de sécurité.
Rhoooooo le vilain !!!!

Guimauve a écrit:
Et comment on fait pour la rendre sécurisé ?
Le code Purebasic que je fourni pour cet exemple est largement suffisant et ne pose pas de problème de sécurité.

Par contre le script Php est épuré au maximum de manière à montrer le principe de réception des données cotés serveur.

Pour mémo, le code purebasic permet de demander à un script php de calculer une surface. Le script Php reçoit deux variable : largeur + longueur.

Il est facile de demander à ce script de calculer cette surface en se passant du programme PureBasic. Pour cela il suffit d'ouvrir un navigateur, et de passer ces deux variables au script Php en passant par l'url.

essayer l'url ci dessous dans votre navigateur.
Code:
http://s242132022.onlinehome.fr/racal/jaime.php?&longueur=10&largeur=10
Comme tu peux voir, il est facile pour un utilisateur mal intentionner de passer du code html, Php ou JavaScript en utilisant une des variables. (Rien à craindre pour les donnés dans l'exemple fourni.)

Le code Php doit impérativement contrôler chaque variable reçu.
Tu peux contrôler manuellement chacune de ces variables pour qu'elles soient conformes à ce que tu attends.

Une autre méthode consiste à éliminer ou à transformer toutes balises html php ou javascript.

strip_tags(String) tente de retourner la chaîne String après avoir supprimé tous les octets nuls, toutes les balises PHP et HTML.

htmlspecialchars() évite que des données fournies par les utilisateurs contiennent des balises HTML ou Php ou JavaScript.
le caractère "<" (inférieur à) devient "&lt;"
le caractère ">" (supérieur à) devient "&gt;"
le caractère "&" (et commercial) devient "&amp;"

Mon code Php fourni devient donc :
Code:
<?php
   //Reception des données
   $longueur = htmlspecialchars(urldecode($_GET['longueur']));
   $largeur = htmlspecialchars(urldecode($_GET['largeur']));
   
   //Envoi du résultat
   echo "moi aussi j'aime quand ça marche".chr(13);
   echo "La surface calculée est de : ".$largeur*$longueur;
?>
Il existe d'autres méthodes pour sécuriser un script. Quand on parle de sécurisé un script Php on dit souvent Échapper les caractère spéciaux. Une recherche sur internet te permettra d'en savoir un peu plus.

_________________
Noob Inside ■ (Windows 7 & 8 - PB 4.51 & 5.10 Full version) ■ Mode politiquement Correct
SQLite Vision : Éditeur de fichiers SQLite


Haut
 Profil  
 
 Sujet du message: Re: J'aime quand ça marche (Envoyer des données à un serveur
MessagePosté: Sam 01/Oct/2011 3:03 
Hors ligne

Inscription: Mer 11/Fév/2004 0:32
Messages: 1015
Localisation: Québec, Canada
Vous auriez dû mentionner que le problème était du coté serveur dans le script php. J'essayais de voir comment le code PB pouvait représenter un problème sans comprendre pourquoi.

Merci pour tes explications.

A+
Guimauve


Haut
 Profil  
 
 Sujet du message: Re: J'aime quand ça marche (Envoyer des données à un serveur
MessagePosté: Sam 01/Oct/2011 11:43 
Hors ligne

Inscription: Dim 23/Déc/2007 18:10
Messages: 471
Pour moi un faille est la possibilité d'altérer les données de façon à ce que le programme ne fasse plus ce qu'il devrait faire.
Dans le cas présent, rien de bien grave puisque tu ne fais que récupérer un résultat.
Dans le cas d'une requête POST où tu envois des données dans un fichier ou une BDD, tu dois
Citation:
Le code Php doit impérativement contrôler chaque variable reçu.
Tu peux contrôler manuellement chacune de ces variables pour qu'elles soient conformes à ce que tu attends.

Tu veux voir un problème du côté PB, alors OK.
Déjà, il faut imaginer que l'on a pas le code de la requête en dur.
Que tu as 2 StringGadget, une pour entrer la largeur et l'autre pour la longueur.
Dans l'état actuel, imagine que dans le StringGadget longueur, tu entres : 1254&largeur=125
Ce qui donne ça dans le code
HostUrl + "largeur=" + URLEncoder("5")
HostUrl + "&longueur=" + URLEncoder("1254&largeur=125")
Ce qui donnerait cette requête :
jaime.php?largeur=5&longueur=1254&largeur=125
Donc tu peux tester sur le serveur de Falsam, tu n'auras plus 5*1254 mais 125*1254
Dans ce cas là pas de dommage et ici aucun intérêt de modifier la valeur largeur que tu entres toi-même dans l'autre StringGadget largeur, mais il faut imaginer qu'il y ai d'autres champs et que ceux-ci ne soit pas ou mal controlés et tu pourrais y envoyer des données mal intentionnées.

Voici l'url pour faire un test vite fait.
Code:
http://s242132022.onlinehome.fr/racal/jaime.php?largeur=5&longueur=1254&largeur=125

Je le rappelle à qui veut l'entendre et cette phrase est assez connu : "Ne jamais faire confiance aux entrées utilisateurs".
S'il est possible de contourner le fonctionnement normal d'un programme ou script, alors c'est qu'il y a un problème et qu'il faut le résoudre.

D'ailleurs j'ai oublié de préciser que ci-dessus, il fallait traiter les caractères, & et =.
HS : je fais actuellement une gui pour simuler un petit système de news, donc GUI PB et script PHP, et dans mon cas d'autres caractères peuvent être génant comme ?
Donc il faut les traiter avant la sortie (l'envoi) de ta requête.

Autre chose, contrairement à ce que je disais au début de ce post, que ce soit en GET ou POST, si le script est mal protégé, rien ne t'empêche de mettre dans le StringGadget carrément un bout de script PHP qui sera interprété.
Et le simple URLEncoder() dans PB limite déjà cette possibilité.

@Falsam, c'est moche ton jaime.php?& derrière le point d'interro tu n'en a pas besoin.
Si tu continues, je vais te balancer à Rasmus.

Bye.


Haut
 Profil  
 
 Sujet du message: Re: J'aime quand ça marche (Envoyer des données à un serveur
MessagePosté: Sam 01/Oct/2011 12:20 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 22/Aoû/2010 15:24
Messages: 1488
Localisation: IDF (Yvelines)
@Geo Trouvpatou : Tu n'as pas l'impression d'avoir répéter exactement ce que j'ai dit ?

Tu veux prouver que l'on peut passer n'importe quoi à travers une url
Geo Trouvpatou a écrit:
http://s242132022.onlinehome.fr/racal/jaime.php?largeur=5&longueur=1254&largeur=125

Regarde bien j'ai fourni cet exemple aussi juste dans ma réponse précédente.
falsam a écrit:
http://s242132022.onlinehome.fr/racal/jaime.php?&longueur=10&largeur=10

Geo Trouvpatou a écrit:
Je le rappelle à qui veut l'entendre et cette phrase est assez connu : "Ne jamais faire confiance aux entrées utilisateurs".

Qu'est ce que j'ai dit de différente ?
falsam a écrit:
Comme tu peux voir, il est facile pour un utilisateur mal intentionner de passer du code html, Php ou JavaScript en utilisant une des variables.
Le code Php doit impérativement contrôler chaque variable reçu.

Geo Trouvpatou a écrit:
....le simple URLEncoder() dans PB limite déjà cette possibilité.
ça tombe bien car c'est exactement ce qu'il y a dans le code purebasic que je fourni :)
Geo Trouvpatou a écrit:
@Falsam, c'est moche ton jaime.php?& derrière le point d'interro tu n'en a pas besoin. Si tu continues, je vais te balancer à Rasmus.
C'est juste pour avoir le plaisir de te voir râler (Je t'épargne le smiley adéquate)

_________________
Noob Inside ■ (Windows 7 & 8 - PB 4.51 & 5.10 Full version) ■ Mode politiquement Correct
SQLite Vision : Éditeur de fichiers SQLite


Haut
 Profil  
 
 Sujet du message: Re: J'aime quand ça marche (Envoyer des données à un serveur
MessagePosté: Sam 01/Oct/2011 16:18 
Hors ligne

Inscription: Dim 23/Déc/2007 18:10
Messages: 471
La différence entre
Citation:
http://s242132022.onlinehome.fr/racal/jaime.php?&longueur=10&largeur=10

et le mien
Citation:
http://s242132022.onlinehome.fr/racal/jaime.php?largeur=5&longueur=1254&largeur=125
c'est que je montre que l'on pouvait falsifier la valeur d'une variable en passant par un StringGadget.
En simulant que ce n'est pas "1254" mais "1254&largeur=125" qui a été entré dans ce StringGadget et donc que l'on à modifié "largeur".
En précisant bien qu'ici cela n'avait aucun intérêt.

Et si tu en veux une preuve ben vas sur ton post de PBContribution et je montre une petite faille de ton script.
Et encore je n'ose pas certains tests pouvant être destructeurs.
Si sans les sources tu peux déjà falsifier des trucs, alors imagine avec :wink:.
Bien que justement avec les sources, cela permet de sécuriser un truc plus vite.

Je reprends juste cette partie :
Falsam a écrit:
Geo Trouvpatou a écrit:
....le simple URLEncoder() dans PB limite déjà cette possibilité.
ça tombe bien car c'est exactement ce qu'il y a dans le code purebasic que je fourni :)
J'explique la chose à Guimauve qui pourrait se poser la question du pourquoi du comment de la chose et pas à toi qui est l'auteur du script et qui a comprit le but.
Toi tu l'écris, moi je l'explique.
Même si tu laisses des failles ouvertes :lol:.


Haut
 Profil  
 
 Sujet du message: Re: J'aime quand ça marche (Envoyer des données à un serveur
MessagePosté: Sam 01/Oct/2011 17:54 
Hors ligne

Inscription: Mer 11/Fév/2004 0:32
Messages: 1015
Localisation: Québec, Canada
Il faudrait vraiment que je me mette au code php pour vraiment comprendre comment ça marche et tout ce que l'on peut faire.

Merci pour les explications, elles aident un peu à comprendre.

A+
Guimauve


Haut
 Profil  
 
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 17 messages ]  Aller à la page 1, 2  Suivante

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye