PHP sûr $ _GET ou non
Nous avons url:
http://site.com/index.php?action=show
$_GET['action']
est utilisé dans les modèles de vérifier la valeur de ?action=
:
switch ($_GET['action']) {
case = "show" {
$match_show = true;
}
}
et dans d'autres lieu:
echo $_GET['action'];
Il est absolument sûr à utiliser cet constructions?
Façon à les rendre plus sûrs?
Grâce.
source d'informationauteur James
Vous devez vous connecter pour publier un commentaire.
Le commutateur chose est bon, parce que vous êtes le comparant à une valeur codée en dur (cependant, il est
case "show":
btw).@Bruce mentionne dans les commentaires, vous devez ajouter un
default:
cas ainsi d'attraper des valeurs qui ne sont pas sur la liste, ou des valeurs vides:La deuxième chose, c'est potentiellement dangereux, comme il serait possible d'injecter de l'HTML et le plus important, du code JavaScript dans le corps du document. Il convient d'appliquer un
htmlspecialchars()
sur la variable avant de l'écho.La
$_GET
superglobale n'est pas sûr par défaut car il peut contenir des particuliers ou des caractères encodés et autres indésirables texte séquences.Vous pouvez utiliser le construit en fonction PHP
filter_input
pour désinfecter la chaîne selon plusieurs filtres standard (voir la liste des filtres pour avoir une idée de ce qui est possible).Exemple:
Avantages:
S'appuie sur intégrée de désinfecter le filtrage, ce qui permet à la fois:
Inconvénients:
filter_input
si vous modifiez la superglobale$_GET
(que vous ne devriez probablement pas le faire de toute façon).Note de côté
Vous pouvez aussi vérifier que le domaine était l'un d'un ensemble à l'aide de
in_array
qui est un des plus dynamique de la méthode de vérification si vous avez un de un ensemble.L'approche dynamique permet de faire exécuter ou rechercher la cible d'action en toute sécurité, tout en stockant l'ensemble des choix potentiels dans une structure de données versus statique de code.
Oui, comme mentionné, vous devez valider la valeur de toutes les
$_GET
variable avant de l'utiliser à l'aveuglette. Mais...Vous devriez également vérifier qu'elle existe avant de l'utiliser. Selon la façon dont vous avez la fonction error_reporting() situé sur votre serveur, si vous essayez d'utiliser
$_GET['action']
et?action=something
n'a pas été spécifié dans l'URL, alors vous aurez une E_NOTICE - Undefined index : actionqui sera soit polluer vos journaux d'erreur ou pire, s'affiche dans le navigateur.Parfois, quand j'ai beaucoup les débutants de créer des plugins ou moduldes pour un site que j'ai utiliser quelque chose comme...
... et tous les get et post valeurs sont 'magie' nettoyés ou supprimé donc je n'ai pas besoin de vous soucier de quelqu'un elses sql-injection plugin.
Ou, si vous êtes un fan de lazy-loading ...
ps. le code a été écrit ici directement, les erreurs sont probables!
PHP
$_GET
par lui-même est mal fixé, il peut être exploité dans plusieurs domaines, pour une bonne lecture et des exemples, je vous recommande de lire cet articlehttp://articles.sitepoint.com/article/php-security-blunders
Pour remplacer le vide (pas de jeu) valeurs avec ceux par défaut, essayez ceci: