Page 1 sur 2

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

Publié : lun. 26/sept./2011 14:50
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.

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

Publié : lun. 26/sept./2011 15:27
par Geo Trouvpatou
T'as essayé avec un espace :mrgreen:.

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

Publié : lun. 26/sept./2011 16:41
par falsam
HahahahahahaAAAAHHHHHAHAHAImage

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

Publié : lun. 26/sept./2011 22:19
par Ar-S
Cool ça merci :)
falsam a écrit :HahahahahahaAAAAHHHHHAHAHAImage
J'ai rit aussi ayant lu le précédent topic :mrgreen:

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

Publié : lun. 26/sept./2011 23:13
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 ?

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

Publié : lun. 26/sept./2011 23:26
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

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

Publié : lun. 26/sept./2011 23:34
par falsam
J'adopte :)

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

Publié : ven. 30/sept./2011 15:30
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

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

Publié : ven. 30/sept./2011 17:51
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

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

Publié : sam. 01/oct./2011 0:16
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.

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

Publié : sam. 01/oct./2011 3:03
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

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

Publié : sam. 01/oct./2011 11:43
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.

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

Publié : sam. 01/oct./2011 12:20
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)

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

Publié : sam. 01/oct./2011 16:18
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:.

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

Publié : sam. 01/oct./2011 17:54
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