begin process at 2012 02 15 23:48:10
  Trouver un code source :
 
dans
 
Accueil > Forum > 

PHP

 > 

Divers

 > 

Débutant(e)

 > 

Encore des questions sur la sécurité en PHP ...


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Encore des questions sur la sécurité en PHP ...

lundi 21 juillet 2008 à 18:25:28 | Encore des questions sur la sécurité en PHP ...

shinnokamui

Bonjour,

J'ai encore quelques question sur la sécurité en PHP.

Jusqu'à présent, j'utilisais des variable sensibles (GET/POST/...) de type numériques, donc un simple "intval" suffisais à les protéger...

J'ai maintenant besoin de l'utilisation de variables type chaine de caractères. On m'a proposer sur ce forum d'utiliser des str_replace, avec tous les caractères malicieux remplacé par le vide. Le problème c'est qu'il est difficile de connaître tous ces caractères (avec en plus unicode etc.). J'ai donc pensé a faire l'inverse : copier uniquement les caractères valides avec une regex :

$test2 = preg_replace('#[^0-9a-zA-Z]#u', ' ', $test);

Cette fonction va créer une chaine de caractères qui contient uniquement des chiffres et des lettres (min et maj).

Je voulais avoir votre avis sur cette fonction ; si je l'utilise je serais tranquille en ce qui conserne les problèmes d'injection ? SQL, et autre ?

Une dernière question ; j'ai un switch de ce type :

        switch($_GET['p'])
        {
            case 'nouvelles':
                include('/nouvelles.php');
                break;
...
        }

en gros il permet, en récupérant la variable GET 'p' (donc modifiable par l'user), et de charger la page correspondante avec un include.

est ce qu'il est necessaire de protéger la variable GET['p'] ? ou je peut directement l'utiliser dans le switch comme ça sans problème ?

Merci :)
mardi 22 juillet 2008 à 09:34:17 | Re : Encore des questions sur la sécurité en PHP ...

pysco68

bonjour,

de cette façon ton switch est relativement sur (enfin moi tout de suite je ne vois pas vraiment de façon d'exploiter ça (bon signe? )... les injections SQL ne peuvent qu'êtres exploitées si une variable récupèrée va directemenet sans vérification dans une requête, ce qui ne semble pas être le cas ici (enfin sauf si je me trompe, la requête dans les différentes pages (du moins dans nouvelles.php) est invariante (??)

Donc de mon point de vue rien de critique
Bonne journée!


Developpement Web Yannic GraphiX | Mon CMS yArt et sa démo

mardi 22 juillet 2008 à 10:14:45 | Re : Encore des questions sur la sécurité en PHP ...

JoJo738

Membre Club
Salut ^^

Je vais commencer par le Switch
Le switch, étant une sorte de "if/else" vérifie les valeurs avec celle passé en paramètre ... donc, si ta variable n'est pas protégé, rien de grave ! Puisque si c'est une variable hacker, elle ne sera pas demandée dans le Switch, et donc ira dans default:
Toutefois, vérifie quand même l'existance de ta variable, c'est le minimum requis ;)
Dans ce cas là, je ferais ça :
$get_switch = isset($_GET['p']) ? urldecode($_GET['p']) : null; // On décode quand même les caratères spéciaux ;)
switch(strtolower($get_switch))
{
    case '': break;
    default : echo 'Vilain méchant !'; break;
}

Après, pour protéger ton code, il existe différentes manières :

  • preg_replace('`[^a-zA-Z0-9]`', ' ', $var);
    Quand tu as besoin d'une variable qui ne contient que des lettres et chifres, avec leur case (min/maj). Ca limite beaucoup ! Au pire, on peut rajouter certains caractères comme [^0-9A-Za-z_\+-]
  • htmlentities()et  htmlspecialchars()
    Vont convertir (selon la focntion) certains ou tous les caractères spéciaux en leur équivalent Html. Permet de protèger efficassement.
  • addslashes()
    La protection minimum qu'il existe ... Permet d'ajouter des slashes pour éviter par exemple des Injections SQL ...
  • mysql_real_escape_string()
    The protection ! Permet d'éviter toute injecion SQL en convertissants les caractères qui doivent être encodés.

         ' SELECT bla, bla, bla FROM table WHERE bla = "' . mysql_real_escape_string($_GET['p']) . '" '; // if isset($_GET['p'])



Si ma reponse te convient, merci de l'accepter ! 
mardi 22 juillet 2008 à 12:36:59 | Re : Encore des questions sur la sécurité en PHP ...

shinnokamui

Bonjour, et merci pour vos réponses :)

Donc pour le switch c'est bon, j'ai juste oublié de verifier si la variable existe :p Maintenant pour la fonction Regex :

En fait, j'utilisais déjà jusqu'à présent htmlspecialchars() et mysql_real_escape_string(), mais j'ai rencontré un problème : magic_code_gpc, qui ajoute automatiquement des "\" si ON, ou pas si OFF. Le problème est qu'il faut vérifier ça sur chaque serveur, ce qui complique les choses.

Et je pari qu'il ne s'ajit pas du seul cas à connaitre, personnelement je suis débutant en PHP, et je pense qu'il y aura toujours des choses à savoir ; des évolutions avec les version à venir de PHP etc.

Donc j'ai pensé à faire une fonction
...

$test2 = preg_replace('#[^0-9a-zA-Z]#u', ' ', $test);

... qui marche à tous les coups, quel que soit les évolution a venir des fontions PHP, ou les connaissances techniques qui me manque. C'est sur que faire une Regex juste pour ça, ça doit ralentir la génération de la page, mais au moins avec cette fonction je suis tranquille, du moins je l'espère :p donc je voulais juste savoir si c'est vraiment sure dans 100% des cas (SQL, echo, etc.)

Merci :)
mardi 22 juillet 2008 à 12:41:49 | Re : Encore des questions sur la sécurité en PHP ...

banbanfr

Membre Club
Bonjour,

regarde peut etre ce genre de fonction :

[ Lien ]

Sinon tu peux aussi passer tes variables via $_SESSION plus dur a modifier si on ne s'y connait pas malgrès ce que l'on peut penser $_SESSION contient des failles de sécurité.

Pour ton switch je peux te proposer une autre solution :

if(isset($_GET['p']))
{
$chemin = './tondossier/'.$_GET['p'].'.fichier.php';

if(file_exists($chemin))
    require_once $chemin;
else
    require_once 'chemin par defaut';
}
else
    require_once 'chemin par defaut';

Cordialement Banban
-------------------------------------------------------------------------->
Developpement sous MAC
Firefox - Safarie - Internet Explorer - Opéra
Mon site pro : www.wubart.net
Mon site perso : www.mafiacity.fr
mardi 22 juillet 2008 à 18:19:07 | Re : Encore des questions sur la sécurité en PHP ...

JoJo738

Membre Club
Hello ^^

Petite alternative à ton code, beaucoup plus sur ;) (mais le './tondossier/' permet une protection optimale ;)

Note : Quand tu fais une include, vérifie toujours que le fichier existe sur le serveur, c'st à dire avoir au moins un './' . $url_fichier (quand c'est dynamique ) ex : file_exists('./' . $url_fichier)


Ah concernant les foncitons html*() : http://fr.php.net/htmlentities (par exemple), tu peux spécifier le Quote_style
Constantes disponibles pour quote_style
ConstanteDescription
ENT_COMPATConvertit les guillemets doubles, et ignore les guillemets simples.
ENT_QUOTESConvertit les guillemets doubles et les guillemets simples.
ENT_NOQUOTESIgnore les guillemets doubles et les guillemets simples.


Le code :
if( isset($_GET['p']) )
{
    $path = realpath(dirname(__FILE__)) . DIRECTORY_SEPARATOR;
    $uri_file = $path . urldecode($_GET['p']); // . '.php' / . '/fichier.php'; / ...
    if( file_exists($uri_file) )
    {
        include $uri_file;
    }
    else
    {
        include 'fichier_defauf.php';
    }
}

Et en version rapide :

if( isset($_GET['p']) AND file_exists($path = realpath(dirname(__FILE__)) . DIRECTORY_SEPARATOR . urldecode($_GET['p']) .'.php') )
{
     include $path;
}
else
{
    include 'fichier_defauf.php';
}

Si ma reponse te convient, merci de l'accepter ! 
mardi 22 juillet 2008 à 18:22:12 | Re : Encore des questions sur la sécurité en PHP ...

banbanfr

Membre Club
include_once plutot mais sinon ton code est mieux :)

Cordialement Banban
-------------------------------------------------------------------------->
Developpement sous MAC
Firefox - Safarie - Internet Explorer - Opéra
Mon site pro : www.wubart.net
Mon site perso : www.mafiacity.fr
mardi 22 juillet 2008 à 19:03:01 | Re : Encore des questions sur la sécurité en PHP ...

JoJo738

Membre Club
Mouef,

include_once n'est pas vraiment approprié pour ce genre d'include ...
Là on inclu un fichier dynamiquement, donc, logiquement on l'inclu à un endroit bien précis et une seule fois. Biensur, à l'intérieur de celui ci, et si jamais on inclus des fichiers annexes (class, fonctions, ...), là, on utilisera les (include|require)_once()

^__^


Si ma reponse te convient, merci de l'accepter ! 


Cette discussion est classée dans : variable, php, sécurité, get, caractères


Répondre à ce message

Sujets en rapport avec ce message

Questions de sécurité... [ par shinnokamui ] Bonjour,J'utilise une variabe dans l'addresse d'une page PHP (type : fichier.php?page=1), j'ai put voir sur le net qu'il était necessaire de proteger PHP & JAVASCRIPT [ par nassayagh ] BonjourJ'ai un probléme au niveau de la création de mon site.J'ai une liste avec un montant.Je veux tout simplement, lorsque je modifie ma listele con variable en php [ par theboubourse ] bonjour voila j'ai un petit problème je voudrais savoir pourquoi easyPhp m'indique une erreur de varible non défini ? normalement les variable ne doiv Rajouter qqch dans une chaine de caractères? [ par zut69 ] Bonjour,J'ai un pti prob sur un traitement de chaine de caractères.En fait, j'ai un chemin dans une variable, de la forme: dossier/dossier2/dossier_n/ php variables avec un '->' [ par SuperChouquette ] Bonjour, je débute en php et dans beaucoup de script je rencontre des variable de cette forme :$result->type = 'test';$result->add('xxx');J'ai compris passage de variable html vers php [ par chartoire ] bonjour voila ce que j'essaie de faire ! J'ai un fichier html dans lequel je voudrais appeler un fichier php je dois passer une variable au fichie Mod rewrite, regex et autres joyeuseries [ par zmc ] Bonsoir,J'utilise actuellement de la redirection d'URL via .htaccess, aucun problemes jusqu'ici, par exemple "site.com/avis=xxxx" est redirigé vers "s Regex PHP [ par Yann2704 ] Bonjours, Tous d'abord desoler si j'ai poster au mauvaise endroit, je savais pas ou poster alors j'ai mis dans divers... $OSuppr = fopen("Admin/DB/For Mettre résolution d'écran en variable php [ par babatt92 ] Bonjour,J'ai mis la résolution d'écran en variable php.Le problème est vraiment étrange (mon code est ci-dessous). Sur une résolution par exemple 1600 Récupérer une variable d'une méthode envoyer par un formulaire [ par Noizet ] Hello,J'ai une fonction en javaScript qui me retourne un tableau et j'aimerai la récupèrer une fois que j'ai cliquer sur mon bouton et qu'il m'a amene


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,952 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales