Je sais qu'il ne faut JAMAIS faire confiance aux données saisies par l'utilisateur dans un formulaire, principalement en raison du risque d'injection SQL.
Toutefois, cela s'applique-t-il également à un formulaire où la seule entrée est effectuée à partir d'une ou de plusieurs listes déroulantes (voir ci-dessous) ?
Je garde le $_POST['size']
à une session qui est ensuite utilisée dans l'ensemble du site pour interroger les différentes bases de données (avec un code d'accès à la base de données). mysqli
Select query) et toute injection SQL leur porterait définitivement préjudice (voire les ferait tomber).
Il n'y a pas de zone de saisie pour interroger les bases de données, seulement des listes déroulantes.
<form action="welcome.php" method="post">
<select name="size">
<option value="All">Select Size</option>
<option value="Large">Large</option>
<option value="Medium">Medium</option>
<option value="Small">Small</option>
</select>
<input type="submit">
</form>
113 votes
Oui. Rien n'empêche un attaquant de soumettre toutes les valeurs qu'il souhaite dans votre fichier
<select>
entrée. En effet, même un utilisateur un peu technique pourrait ajouter des options supplémentaires à l'aide de la console du navigateur. Si vous conservez une liste blanche des valeurs disponibles et que vous comparez les données saisies à cette liste, vous pouvez atténuer ce problème (et vous devriez le faire, car cela permet d'éviter les valeurs indésirables).0 votes
Bummer.... si je devais lier dynamiquement des paramètres dans une déclaration préparée avec MySQLi, cela protégerait-il mes fichiers ?
13 votes
Vous devez comprendre les principes de base des requêtes et des réponses, et savoir que la façon dont le frontal est construit sur la requête n'a pas d'importance, c'est-à-dire que dans le cas présent, la liste déroulante doit être utilisée.
3 votes
Lier les paramètres vous protégerait de l'injection, oui. Une liste blanche est cependant préférable, pour l'intégrité des données, si vous souhaitez n'accepter que les valeurs actuellement listées dans le fichier
<option>
0 votes
Merci Michael, je n'ai jamais utilisé de liste blanche auparavant mais cela semble être l'option que je recherche (plus de sécurité)... Connaissez-vous de bons tutoriels en ligne ? Je suis un peu un novice de MySQLi.
1 votes
@SamuelTattersfield si vous regardez la réponse ci-dessous j'ai expliqué brièvement comment utiliser une liste blanche.
13 votes
@YourCommonSense Parce que c'est une bonne question. Tout le monde ne se rend pas compte à quel point un client est manipulable. Cela va provoquer des réponses très précieuses pour ce site.
8 votes
@Cruncher Je vois. Pour un stackoverflowien moyen, c'est une science de pointe dont il n'a jamais entendu parler auparavant. Même si c'est la question la plus votée sous le tag PHP.
1 votes
Haha... J'ai voté pour ces deux commentaires. Je ne trouvais pas de question similaire, alors je l'ai posée... je n'ai jamais fait de science-friction.
9 votes
"Je comprends que vous ne devez JAMAIS faire confiance à l'entrée de l'utilisateur". Aucune exception.
0 votes
Je sais que c'est dans l'onglet connexe à côté de la question, mais ici c'est, connexe : stackoverflow.com/questions/60174/
1 votes
Utilisez toujours, toujours, des requêtes paramétrées (déclarations préparées ou quel que soit le nom que vous leur donnez). Il n'y a pas de substitut. Le fait de devoir vérifier manuellement les entrées, en gardant la trace de ce qui est propre et de ce qui est sale, vous rendra toujours vulnérable aux erreurs. Les requêtes paramétrées sont une bonne pratique simple qui ne peut qu'améliorer votre code. Voir une concaténation de chaînes de caractères dans une requête SQL devrait automatiquement déclencher des alarmes dans votre tête.
1 votes
@mcv, "Voir une concaténation de chaîne dans une requête SQL devrait automatiquement déclencher des alarmes dans votre tête." -- C'est toujours utile de temps en temps. Par exemple, construire une chaîne de requête paramétrée de longueur variable ! (J'ai récemment écrit du code qui inclut
$sql .= ' UNION ALL SELECT ?';
dans une boucle for, à titre d'exemple ~_^)1 votes
Est-ce que le
in_array
vérifier y toujours utiliser des requêtes paramétrées. Si vous devez vous préoccuper de l'échappement des données, c'est que vous vous y prenez mal. Quel que soit le degré de "confiance" d'un élément, s'il s'agit d'une variable, c'est un paramètre, et si c'est un paramètre, vous avez besoin d'une requête paramétrée.1 votes
S'il s'agit d'un doublon, votez pour la fermeture au lieu de poster des commentaires passifs-agressifs. La question en elle-même est parfaitement acceptable.
3 votes
L'entrée n'est pas une zone de liste déroulante. C'est un flux d'octets provenant du client.
1 votes
Si vous avez l'intention de travailler en plusieurs langues, l'élément de liste
value
doit être un code agnostique (vous pouvez désigner votre langue maternelle dans certains cas, mais recherchez les codes standard existants lorsque cela est possible), c'est-à-dire qu'il doit être utilisé comme clé et non comme valeur. En outre, vous ne pouvez pas toujours faire confiance aux choses à l'intérieur de votre base de données non plus - si vous concaténer les valeurs des entrées de la base de données qu'un utilisateur a fournies, vous êtes dans le même bateau.0 votes
Consultez les outils de développement de base fournis avec votre navigateur. Vous verrez que vous pouvez facilement modifier les données de la requête soumises au serveur. Si vous voulez vraiment vous amuser, consultez Fiddler. telerik.com/fiddler