intval() , mysql_real_escape_string()...

Eléphanteau du PHP | 10 Messages

10 sept. 2009, 19:15

Bonsoir,

J'aurais une question concernant ces fonctions,

Prenons un exemple :
// $_POST['blabla'] doit normalement contenir une valeur numérique
$variable = intval($_POST['blabla']);

$test = rand(1,5);
$variable = $test;
J'aimerais savoir si il fallait protéger uniquement les données $_POST / $_GET ou autre modifiable par le visiteur, ou si il fallait protéger aussi les variables présentent dans le code php et que l'utilisateur ne peut pas directement modifié (d'ailleurs est-il possible de les modifier?)

De même faut-il protéger des $_SESSION?

Et dans ce cas :
if ( $_POST['blabla'] == 3 ) {
}
Faut il aussi protéger la variable $_POST ?

Mammouth du PHP | 985 Messages

10 sept. 2009, 19:38

Mon avis est qu'il faut protéger toutes les variables $_POST, $_GET et les insertions dans ta base de donnée.
Les fonctions preg_match et preg_replace sont ultra efficaces surtout quand tu peux spécifier grâce aux Regex une seule et même syntaxe (donc taille mini et max comprises...).
Elles le sont beaucoup moins quand tu interdits juste des caractères et/ou syntaxes spécifiques...
Pour les insertions dans une base de donnée, j'utilise avant tout: mysql_real_escape_string() qui me parait indispensable le plus souvent...
Pour le reste, les fonctions qui peuvent être aussi pratiques:
is_numeric(), is_null(), empty()...

[EDIT]
Ah j'oubliais le minimum: l'indispendable isset()
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

ViPHP
ViPHP | 1136 Messages

10 sept. 2009, 21:00

Il est bon ( enfin je le pense ) , de maitriser ses données entrantes , comme sortantes !

Il est donc effectivement fortement conseiller d'échapper au minimum les données que l'utilisateur peut fournir , et aussi de supprimer/stériliser tout code possible !

Car imagines que tu échappes tes données entrantes , avant l'insertion en base .. ok , l'injection sql est mise de coté , cependant , l'injection de code non ! , si tu affiche les données enregistrées dans ta base , et que celles-ci contiennent de code js par exemple , ce code sera interprété ( faille XSS possible ).

Utilise donc par exemple , htmlentities() , strip_tags() , en plus de mysql_real_escape_string() .

Ensuite , pour ce qui est des données de fonctionnement interne , j'aime aussi être certain d'avoir un type que j'attends ! dans le cas contraire => exception ! mais là c'est plus pour avoir un résultat toujours parfait ( dans le meilleurs des mondes ) , et eviter les bugs

Pour les sessions , peut importe au finale ce qu'il y a dedans , sauf si tu enregistres tes sessions en base !

Eléphanteau du PHP | 10 Messages

11 sept. 2009, 19:50

Merci pour vos réponses, même si elles ne répondent pas clairement à la question que je me pose, pourquoi protéger des variable ($exemple) dont la valeur est calculée ou donnée en interne, je veux dire par la que même si le résultat de cette variable dépend d'un $_POST ou $_GET par exemple, le $_POST ou $_GET sera 'sécurisé'

En gros il me semble vachement intéressant de savoir si il est possible, pour le visiteur de modifier ces variables ($exemple) sans passer par des $_POST ou $_GET
Pour les sessions , peut importe au finale ce qu'il y a dedans , sauf si tu enregistres tes sessions en base !
Donc, en prenant un exemple :
- l'utilisateur à l'aide d'un formulaire donne le contenu de
$_POST['nombre']
- je met en session et sécurise
$_SESSION['nombre'] = intval($_POST['nombre']);
- dans une autre page je fais appel au contenu enregistré dans la session pour le mettre dans une bdd
$num1 = intval($_POST['numero1']);
$num2 = intval($_POST['numero2']);
$exemple = 1;
$blabla = "exemple";
$test = $num1 + $num2;
mysql_query("UPDATE `matable` SET `monchamp` = '". $_SESSION['nombre'] ."', `blabla` = '". $blabla ."', `test` = '". $test."' WHERE `blabla` = "' . $exemple . '"");
Selon vous je prend un risque en ne sécurisant pas la variable $blabla, $test et la $_SESSION? Si oui pourriez vous m'expliquer pourquoi?

Je sais c'est pas très très clair :mrgreen:

Mammouth du PHP | 985 Messages

11 sept. 2009, 20:56

//si 
$_POST['numero1'] = '@@';
//quel effet sur:
intval($_POST['numero1']);
//Ou plus simplement sur un: 
echo intval($_POST['numero1']);
[EDIT]
Ajout du code Php -> c'est plus clair
Modifié en dernier par Dr@ke le 11 sept. 2009, 21:04, modifié 2 fois.
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

ViPHP
ViPHP | 1136 Messages

11 sept. 2009, 21:00

Normalement ,
tu ne peux pas modifier les donnés de ta session toi même !

Le risque est donc minime .
Cependant , tout filtrer te permet d'être certain du résultat .

Filtrer certaines données , et pas d'autres , peut conduire à des oublis .. donc des failles majeurs !

Ne fais donc confiance à personne , ni aux sessions !