Dans la programmation PHP, sprintf et json_encode () sont deux fonctions très couramment utilisées. Sprintf est utilisé pour formater les chaînes, tandis que JSON_ENCODE () est utilisé pour convertir les structures de données PHP en chaînes au format JSON. Bien qu'ils aient chacun des fonctions puissantes, si elles sont utilisées accidentellement, certains problèmes ou risques de sécurité peuvent être introduits. Aujourd'hui, nous analyserons les pièges communs dans l'utilisation de ces deux fonctions et discuterons de la façon de les éviter.
La fonction sprintf peut formater les paramètres passés dans la chaîne spécifiée en fonction de la chaîne de format donné. Les scénarios d'utilisation communs incluent l'insertion de données dans les instructions de requête SQL, la construction de messages de journal, etc. Cependant, une mauvaise utilisation de sprintf peut entraîner les problèmes suivants.
Le premier paramètre de printf et sprintf est la chaîne de format, et les paramètres suivants seront formatés en fonction du format. Si la chaîne de format est erronée, cela peut entraîner une sortie incorrecte ou des erreurs plus graves.
Par exemple:
$number = 123;
echo sprintf("%d is the number", $number); // Sortie correcte:123 is the number
echo sprintf("%s is the number", $number); // Sortie d'erreur:123 is the number
Dans l'exemple ci-dessus, % s est utilisé pour formater les chaînes, pas les nombres et % d est utilisé pour formater les entiers. Si vous ne faites pas attention à la correspondance des formateurs et des types de données, des résultats inattendus peuvent en résulter.
Sprintf est souvent utilisé pour construire des requêtes SQL. Les vulnérabilités d'injection SQL peuvent être causées si l'entrée de l'utilisateur est directement intégrée dans la chaîne de requête SQL sans échappement approprié ou requête paramétrée. Par exemple:
$username = $_GET['username'];
$query = sprintf("SELECT * FROM users WHERE username = '%s'", $username);
Si $ nom d'utilisateur est entré par l'utilisateur et n'est pas correctement filtré ou échappé, un attaquant peut entrer des instructions SQL malveillantes pour attaquer la base de données.
Pratique de sécurité: utilisez toujours des requêtes paramétrées au lieu d'incorporer l'entrée utilisateur directement dans les requêtes SQL. L'APD et MySQLI de PHP soutiennent les requêtes paramétrées, et ils sont recommandés pour éviter le risque d'injection SQL.
Sprintf ne peut pas formater directement les tableaux ou les objets. Bien que % s puisse être utilisé pour formater un tableau ou un objet, il n'appellera que la méthode __toString () , ou le sortira directement sous forme de chaîne, ce qui n'est généralement pas le résultat que vous souhaitez. Par exemple:
$array = [1, 2, 3];
echo sprintf("Array: %s", $array); // Sortir:Array: Array
Pratique de sécurité: si vous avez besoin de formater un tableau ou un objet, vous pouvez d'abord le convertir en chaîne, qui peut généralement être implémenté à l'aide de JSON_ENCODE () ou implode () .
JSON_ENCODE () est utilisé pour convertir les structures de données PHP en chaînes au format JSON. Cette fonction est très courante dans le développement de l'API et l'échange de données. Cependant, dans une utilisation réelle, json_encode () peut également causer des problèmes.
json_encode () prend en charge uniquement correctement les chaînes codées UTF-8 en JSON. Si vous essayez de coder des chaînes d'autres jeux de caractères (tels que GBK), json_encode () renvoie false et ne donne pas de message d'erreur explicite. Pour éviter ce problème, assurez-vous que les chaînes que vous transmettez sont encodées UTF-8.
$string = "Ceci est un texte chinois";
echo json_encode($string); // 正常Sortir: "Ceci est un texte chinois"
Si la chaîne n'est pas un encodage UTF-8, JSON_ENCODE () reviendra False et vous ne pourrez peut-être pas attraper cette erreur directement.
Pratique de sécurité: utilisez MB_Convert_encoding () ou assurez-vous que la chaîne obtenue dans la base de données est déjà encodée UTF-8.
json_encode () ne peut pas gérer certaines structures de données spéciales, telles que la ressource ( ressource ) et la fermeture ( fermeture ). Si vous essayez d'encoder ces données, JSON_ENCODE () renvoie False .
$resource = fopen('file.txt', 'r');
echo json_encode($resource); // retour:false
Pratique de sécurité: assurez-vous que les données ne contiennent pas de types de ressources avant de passer à json_encode () , ou de les traiter avec des fonctions de conversion appropriées.
Si json_encode () renvoie false , cela signifie qu'une erreur s'est produite pendant le processus d'encodage, mais elle ne fournira pas d'informations d'erreur spécifiques. Pour un meilleur débogage, vous pouvez utiliser json_last_error () pour obtenir le code d'erreur et json_last_error_msg () pour obtenir le message d'erreur.
$data = ['key' => "\xB1\x31"];
$json = json_encode($data);
if ($json === false) {
echo 'JSON erreur: ' . json_last_error_msg();
}
Utilisez correctement SprintF pour formater les chaînes : assurez-vous que le formatage correspond au type de données, évitez les vulnérabilités d'injection SQL et convertissez-les en premier lors de la mise en forme d'un tableau.
Évitez de passer des chaînes codées non UTF-8 à json_encode () : assurez-vous que les chaînes transmises à json_encode () sont codées UTF-8 valides.
Gérez la situation où json_encode () renvoie false : utilisez json_last_error_msg () pour déboguer et découvrir la cause spécifique des erreurs d'encodage.
Évitez la mise en forme de ressources ou d'objets : tableaux de processus, objets ou ressources de la manière appropriée pour éviter de causer des erreurs imprévisibles.
En suivant ces spécifications de sécurité, les pièges communs lors de l'utilisation de Sprintf et JSON_encode () peuvent être effectivement évités, améliorant ainsi la sécurité et la robustesse du code.
Fin de l'article