Page 1 sur 2

Sécuriser un script Php

Publié : mar. 24/avr./2018 15:10
par falsam
J'aurais besoin de sécuriser un script Php exécuté depuis une application codée avec PureBasic.

■ Ce code simule la création d'un compte, la connexion et la déconnexion.

Code : Tout sélectionner

Enumeration
  #PR_Sign_Up
  #PR_Sign_In
  #PR_Sign_Out
EndEnumeration

Define url.s = "http://s242132022.onlinehome.fr/game01/"
Define script.s = "test.php"
Define parameters.s = "?process=" + #PR_Sign_In

Define header.s, buffer.s, *buffer 

InitNetwork()

header = GetHTTPHeader(url + script)
Buffer = StringField(Header, 1, #LF$)

If FindString(Buffer, "200 OK")
  *buffer = ReceiveHTTPMemory(url + script + "/" + URLEncoder(parameters))
  
  If *buffer
    Size = MemorySize(*buffer)
    buffer = PeekS(*buffer, Size, #PB_UTF8|#PB_ByteLength)
    FreeMemory(*buffer)
  EndIf
  
  Debug buffer
Else
  Debug "connexion failed"
EndIf
■ Le script php test.php exécuté depuis le code PureBasic

Code : Tout sélectionner

<?php
	define("PR_Sign_Up", 0);
	define("PR_Sign_In", 1);
	define("PR_Sign_Out", 2);
	
	if (isset($_GET['process'])) {
		switch (($_GET['process'])) {
			case PR_Sign_Up :
				echo "Account create";
				break;

				case PR_Sign_In :
				echo "welcome";
				break;
			
			case PR_Sign_Out :
				echo "bye";
				break;
			
			default:
				echo '-1';
		}
	}	
?> 
:?: Comment empêcher l’exécution du script php en ligne de commande ?
Exemple : http://s242132022.onlinehome.fr/game01/ ... ?process=1

:idea: La piste que je vois actuellement est d'envoyer un ou plusieurs paramètres supplémentaires comme le nom de l'application et la taille de l'application et de tester ces paramètres depuis le script php.

Re: Sécuriser un script Php

Publié : mar. 24/avr./2018 16:14
par Marc56
Il faut que tu utilises le mécanisme des sessions.
Si tu ne veux pas imposer de cookie à tes clients, tu peux passer l'ID de session par URL.
Si tu ne veux pas qu'ensuite quelqu'un d'autre réutilise l'URL avec ID tu stocke l'ID en base de données et tu le verrouille au logout ou après un certain délai.

(de mémoire, car ça fait plus de 10 ans que je n'ai plus fait cela, donc ne compte pas sur moi pour plus d'explications :cry: )

Re: Sécuriser un script Php

Publié : mar. 24/avr./2018 16:52
par falsam
Marc56 a écrit :Si tu ne veux pas imposer de cookie à tes clients, tu peux passer l'ID de session par URL.
Cookies ou paramétrés je sais faire dans le cadre d'un dev 100% web.

Avec PureBasic je ne suis pas certain qu'on puisse gérer des cookies et des variables de session. En tout cas je ne sais pas faire.

session_start() depuis PB ça va être compliquer :wink:

Re: Sécuriser un script Php

Publié : mar. 24/avr./2018 17:06
par Marc56
session_start() depuis PB ça va être compliquer
:arrow: RunProgram("php", "-f " + script, "" etc)

Même si PHP s'utilise le plus souvent en tant que module, et pour des applis web, c'est un langage script à part entière

Code : Tout sélectionner

EXE = RunProgram("C:\PHP\PHP.EXE", "-v", "", #PB_Program_Open | #PB_Program_Read)
If EXE 
    While ProgramRunning(EXE)
        If AvailableProgramOutput(EXE)
            Debug ReadProgramString(EXE) 
        EndIf
    Wend 
    CloseProgram(EXE)
EndIf
php -f file

:arrow: Depuis la v4? 5 ? il peut même agir comme son propre serveur web
PHP -S <addr>:<port> Run with built-in web server

:wink:

Re: Sécuriser un script Php

Publié : mar. 24/avr./2018 17:07
par Ar-S
Tu ne peux pas créer une variable $truc vierge dans ton php qui serait initialisé par PB lors du lancement ?
Si oui à ce moment dans ton script tu check la longueur de $truc..

Code : Tout sélectionner

<?php
si strlen($truc) == 0 alors ;
echo 'Get out b!tch !';
?> 

Re: Sécuriser un script Php

Publié : mar. 24/avr./2018 17:08
par djes
Tu peux bricoler ton propre système de vérification, tu crées un code selon un algo perso en pb, et le décodeur en php pour vérification. Simple et efficace. D'ailleurs je me demande si je n'en avais pas posté un il y a un moment déjà.

Re: Sécuriser un script Php

Publié : mar. 24/avr./2018 17:11
par falsam
@Marc : Je ne cherche pas à lancer Php.exe.

Re: Sécuriser un script Php

Publié : mar. 24/avr./2018 17:18
par GallyHC
Bonjour,

Pour moi le plus simple est d'utiliser le "useragent" avec un codage personnel qui change en fonction de (a toi de faire)... Pour cela en PB cela donne :

Code : Tout sélectionner

ReceiveHTTPMemory (.............., #PB_HTTP_Asynchronous, **le codage perso du useragent**)
et en PHP :

Code : Tout sélectionner

if ($_SERVER['HTTP_USER_AGENT'] != '**la verification du useragent**')
{
	echo "forbidden";
	exit();
}
Cordialement,
GallyHC

Re: Sécuriser un script Php

Publié : mar. 24/avr./2018 17:29
par TazNormand
Salut Falsounet,

Mets ton scripts php dans un dossier, et dans ce dossier, tu mets un .htaccess qui empêche l'accès extérieur. Comme ça ton "serveur" est le seul qui peut aller exécuter ton script.

Un peu dans ce style :

Code : Tout sélectionner

order deny,allow
deny from all
Normalement, ton code étant exécuté par ton "serveur", il pourra lancer le script via les permissions de dossier.

Un autre moyen est de stocker ton script php en dehors de ton dossier www : si ton serveur est du genre /home/var/www, tu crées un dossier /home/var/mesPHP et tu vas les chercher via "include"

Re: Sécuriser un script Php

Publié : mar. 24/avr./2018 18:08
par falsam
Merci Tazou mais je préfère pour le moment la solution de Gally.

La petite phrase qui fera le lien entre le code PB et PHP

Code : Tout sélectionner

Define useragent.s = "The quick brown fox jumps over the lazy dog."
Le md5 de cette phrase calculé par le script Php est "e4d909c290d0fb1ca068ffaddf22cbd0"

Code : Tout sélectionner

define("USER_AGENT_MD5", "e4d909c290d0fb1ca068ffaddf22cbd0");
■ Code PureBasic

Code : Tout sélectionner

Enumeration
  #PR_Sign_Up
  #PR_Sign_In
  #PR_Sign_Out
EndEnumeration

Define url.s = "http://s242132022.onlinehome.fr/game01/"
Define script.s = "testuseragent.php"
Define parameters.s = "?process=" + #PR_Sign_In

Define header.s, buffer.s, *buffer 

Define useragent.s = "The quick brown fox jumps over the lazy dog."

InitNetwork()

header = GetHTTPHeader(url + script)
Buffer = StringField(Header, 1, #LF$)

If FindString(Buffer, "200 OK")
  *buffer = ReceiveHTTPMemory(url + script + "/" + URLEncoder(parameters), #PB_HTTP_NoRedirect, useragent)
  
  If *buffer
    Size = MemorySize(*buffer)
    buffer = PeekS(*buffer, Size, #PB_UTF8|#PB_ByteLength)
    FreeMemory(*buffer)
  EndIf
  
  Debug buffer
Else
  Debug "connexion failed"
EndIf
■ Code Php

Code : Tout sélectionner

<?php
	define("PR_Sign_Up", 0);
	define("PR_Sign_In", 1);
	define("PR_Sign_Out", 2);
	
	define("USER_AGENT_MD5", "e4d909c290d0fb1ca068ffaddf22cbd0");
	
	if (isset($_GET['process']) AND (md5($_SERVER['HTTP_USER_AGENT']) == USER_AGENT_MD5)) {
		switch (($_GET['process'])) {
			case PR_Sign_Up :
				echo "Account create";
				break;

			case PR_Sign_In :
				echo "welcome";
				break;
			
			case PR_Sign_Out :
				echo "bye";
				break;
			
			default:
				echo '-1';
		}
	} else {
		echo "Go away ^-^";
	}	
?> 
Le code PureBasic renverra bien "Welcome" alors que le lancement manuel depuis un navigateur par exemple renverra "Go away ^-^"

:arrow: http://s242132022.onlinehome.fr/game01/ ... ?process=1

Merci pour toutes vos suggestions.

Re: Sécuriser un script Php

Publié : mar. 24/avr./2018 20:40
par Ar-S
J'ai essayé de bypasser ça, pas réussi :)
par contre si les gens ont ton exe, ça sera pas dur de trouver la variable.

Re: Sécuriser un script Php

Publié : mar. 24/avr./2018 22:33
par falsam
Ar-S a écrit :si les gens ont ton exe, ça sera pas dur de trouver la variable.
Ils auront l'exe. Mais de cette manière le ou les variables du code seront compliquées à trouver je pense.

Code : Tout sélectionner

!macro ppublic name{
!if name eq _SYS_StaticStringEnd
!repeat $-_SYS_StaticStringStart
!load zczc from _SYS_StaticStringStart+%-1
!store zczc xor 137 at _SYS_StaticStringStart+%-1
!end repeat
!end if
!public name}
!public fix ppublic
CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
  !mov edi,_SYS_StaticStringStart
  !mov ecx,_SYS_StaticStringEnd-_SYS_StaticStringStart
  !@@:
  !xor byte[edi],137
  !inc edi
  !dec ecx
CompilerElse
  !mov rdi,_SYS_StaticStringStart
  !mov rcx,_SYS_StaticStringEnd-_SYS_StaticStringStart
  !@@:
  !xor byte[rdi],137
  !inc rdi
  !dec rcx
CompilerEndIf
!jnz @b


Enumeration
  #PR_Sign_Up
  #PR_Sign_In
  #PR_Sign_Out
EndEnumeration

Define url.s = "http://s242132022.onlinehome.fr/game01/"
Define script.s = "testuseragent.php"
Define parameters.s = "?process=" + #PR_Sign_Up + "&username=falsam&userpassword=fasilatrouver"

Define header.s, buffer.s, *buffer 

Define useragent.s = "The quick brown fox jumps over the lazy dog."

InitNetwork()

header = GetHTTPHeader(url + script)
Buffer = StringField(Header, 1, #LF$)

If FindString(Buffer, "200 OK")
  *buffer = ReceiveHTTPMemory(url + script + "/" + URLEncoder(parameters), #PB_HTTP_NoRedirect, useragent)
  
  If *buffer
    Size = MemorySize(*buffer)
    buffer = PeekS(*buffer, Size, #PB_UTF8|#PB_ByteLength)
    FreeMemory(*buffer)
  EndIf
  
  Debug buffer
Else
  Debug "connexion failed"
EndIf
Et bien entendu je ne me contenterais pas d'avoir une phrase de ce type.

Crée un exe avec ce code et cherches les variables avec un outil adéquate :wink:

Re: Sécuriser un script Php

Publié : mar. 24/avr./2018 22:40
par Ar-S
Explique ce que fait cet asm 8O stp

Re: Sécuriser un script Php

Publié : mar. 24/avr./2018 22:44
par falsam
Ar-S a écrit :Explique ce que fait cet asm 8O stp
C'est un code de User_Russian (Forum anglophone) donné par CaptainCrunch il y a pas mal de temps sur le chat de PureBasic. Dans le détail je ne te donnerais pas les explications. L'objectif est de cacher le contenu de chacune des variables.

Source http://www.purebasic.fr/english/viewtop ... 52#p468652

On le trouve aussi sur le site de Gally http://www.koakdesign.info/pbfrance/?ur ... wer&val=69

J'avais fait un sujet dessus mais impossible de le retrouver.

Re: Sécuriser un script Php

Publié : mar. 24/avr./2018 22:57
par GallyHC
En fait cette macro de mémoire crypte tout les textes visibles (variables, constantes, tableaux, ....) avec un xor. Le cryptage ce fait à la volé pendant la compilation et pour le décryptage c'est la même chose mais au lancement de l'application.

Je n'ai pas retrouver le topic de cette macro, mais ça fait déjà quelque temps et je l'utilise depuis j'avous ^^.

Cordialement,
GallyHC