J'aime quand ça marche (Envoyer des données à un serveur)

Sujets variés concernant le développement en PureBasic
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

J'aime quand ça marche (Envoyer des données à un serveur)

Message par falsam »

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 : Tout sélectionner

;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 : Tout sélectionner

<?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.
Dernière modification par falsam le lun. 26/sept./2011 23:11, modifié 1 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Geo Trouvpatou
Messages : 471
Inscription : dim. 23/déc./2007 18:10

Re: J'aime quand ça marche (Envoyer des données à un serveur

Message par Geo Trouvpatou »

T'as essayé avec un espace :mrgreen:.
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: J'aime quand ça marche (Envoyer des données à un serveur

Message par falsam »

HahahahahahaAAAAHHHHHAHAHAImage
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: J'aime quand ça marche (Envoyer des données à un serveur

Message par Ar-S »

Cool ça merci :)
falsam a écrit :HahahahahahaAAAAHHHHHAHAHAImage
J'ai rit aussi ayant lu le précédent topic :mrgreen:
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: J'aime quand ça marche (Envoyer des données à un serveur

Message par falsam »

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 ?
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Re: J'aime quand ça marche (Envoyer des données à un serveur

Message par Guimauve »

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 modification par Guimauve le lun. 26/sept./2011 23:38, modifié 1 fois.
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: J'aime quand ça marche (Envoyer des données à un serveur

Message par falsam »

J'adopte :)
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Geo Trouvpatou
Messages : 471
Inscription : dim. 23/déc./2007 18:10

Re: J'aime quand ça marche (Envoyer des données à un serveur

Message par Geo Trouvpatou »

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 : Tout sélectionner

;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
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Re: J'aime quand ça marche (Envoyer des données à un serveur

Message par Guimauve »

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
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: J'aime quand ça marche (Envoyer des données à un serveur

Message par falsam »

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 : Tout sélectionner

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 "<"
le caractère ">" (supérieur à) devient ">"
le caractère "&" (et commercial) devient "&"

Mon code Php fourni devient donc :

Code : Tout sélectionner

<?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.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Re: J'aime quand ça marche (Envoyer des données à un serveur

Message par Guimauve »

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
Geo Trouvpatou
Messages : 471
Inscription : dim. 23/déc./2007 18:10

Re: J'aime quand ça marche (Envoyer des données à un serveur

Message par Geo Trouvpatou »

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
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 : Tout sélectionner

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.
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: J'aime quand ça marche (Envoyer des données à un serveur

Message par falsam »

@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
Regarde bien j'ai fourni cet exemple aussi juste dans ma réponse précédente.
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)
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Geo Trouvpatou
Messages : 471
Inscription : dim. 23/déc./2007 18:10

Re: J'aime quand ça marche (Envoyer des données à un serveur

Message par Geo Trouvpatou »

La différence entre
et le mien
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:.
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Re: J'aime quand ça marche (Envoyer des données à un serveur

Message par Guimauve »

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
Répondre