Dans PHP, lors du traitement des données de formulaire HTML soumises par l'utilisateur, les données sont souvent traitées et échappées pour éviter les vulnérabilités de sécurité potentielles, en particulier lors de l'interaction avec une base de données ou de la génération de contenu HTML. L'une des méthodes d'échappement courantes consiste à utiliser la fonction ADDCSLASHES . Cependant, lors du traitement des données du formulaire, de nombreux développeurs utilisent souvent ADDCSLASHES comme solution générale et les utilisent directement pour traiter les données saisies par les utilisateurs. Alors, AddcSlashes fonctionne-t-il pour tous les cas? Y a-t-il une autre méthode plus appropriée?
AddcSlashes est une fonction de chaîne en PHP qui échappe à certains caractères dans une chaîne. Sa fonction consiste à échapper aux caractères appartenant à l'ensemble de caractères dans la chaîne dans une forme de caractères borlles plus basée sur le jeu de caractères spécifié. Par exemple:
<span><span><span class="hljs-variable">$str</span></span><span> = </span><span><span class="hljs-string">"Hello, World!"</span></span><span>;
</span><span><span class="hljs-variable">$escaped</span></span><span> = </span><span><span class="hljs-title function_ invoke__">addcslashes</span></span><span>(</span><span><span class="hljs-variable">$str</span></span><span>, </span><span><span class="hljs-string">'l'</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$escaped</span></span><span>; </span><span><span class="hljs-comment">// Sortir: He\l\lo, Wor\l\d!</span></span><span>
</span></span>Dans l'exemple ci-dessus, addcslashes échappe à toutes les lettres l dans \ l .
Bien que AddCSlashes puisse être utilisé pour échapper aux caractères spécifiques dans une chaîne, il ne convient pas à la gestion des données de formulaire HTML, en particulier en termes de sécurité. Les raisons sont les suivantes:
Impossible d'éviter l'injection HTML : AddCSlashes échappe simplement aux caractères, il ne traite pas les balises HTML. Si les données de formulaire contient des balises <cript> malveillantes ou d'autres éléments HTML, AddCSlashes ne peut pas empêcher l'exécution de ces contenus, ce qui peut conduire à une vulnérabilité XSS (attaque de script de site croisée).
L'échappement des caractères est trop simple : AddcSlashs est principalement utilisé pour échapper aux caractères de contrôle ou à des caractères spéciaux, tels que des citations, des barreaux de barreaux, etc., mais il ne prend pas en compte certains problèmes de sécurité courants. Par exemple, AddCSlashes ne peut pas protéger efficacement contre le code JavaScript malveillant ou l'injection SQL qui peut être inclus dans l'entrée de l'utilisateur.
Non applicable pour les requêtes de base de données : Si vous stockez des données de formulaire dans la base de données, AddCSlashes ne remplace pas la méthode d'échappement SQL appropriée. Par exemple, pour une base de données MySQL, les requêtes paramétrées doivent être utilisées au lieu d'échapper manuellement à l'entrée.
Pour le traitement des données du formulaire HTML, voici quelques méthodes plus appropriées:
Si vous devez sortir les données saisies par l'utilisateur directement sur la page Web pour empêcher les attaques XSS, vous devez utiliser la fonction HTMLSpecialCars ou Htmlentities . Ils peuvent échapper aux caractères HTML spéciaux pour empêcher l'exécution de HTML ou JavaScript malveillant.
<span><span><span class="hljs-variable">$user_input</span></span><span> = </span><span><span class="hljs-variable">$_POST</span></span><span>[</span><span><span class="hljs-string">'user_input'</span></span><span>];
</span><span><span class="hljs-variable">$safe_input</span></span><span> = </span><span><span class="hljs-title function_ invoke__">htmlspecialchars</span></span><span>(</span><span><span class="hljs-variable">$user_input</span></span><span>, ENT_QUOTES, </span><span><span class="hljs-string">'UTF-8'</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$safe_input</span></span><span>; </span><span><span class="hljs-comment">// Sortir安全的 HTML</span></span><span>
</span></span>HTMLSpecialCars convertira < , > , et , " et ' en entités HTML pour éviter d'être analysée en éléments HTML par le navigateur.
Le paramètre ENT_QUOTES garantit que les citations doubles et simples sont échappées.
Pour les requêtes SQL, n'utilisez jamais ADDCSLASHES pour échapper aux données d'entrée. La méthode de requête paramétrée fournie par le pilote de base de données doit être utilisée pour gérer automatiquement les problèmes d'échappement et empêcher l'injection SQL.
Par exemple, si vous utilisez MySQLI ou PDO, vous pouvez utiliser la méthode suivante:
Utilisation de mysqli:
<span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"SELECT * FROM users WHERE username = ?"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bind_param</span></span><span>(</span><span><span class="hljs-string">"s"</span></span><span>, </span><span><span class="hljs-variable">$user_input</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
</span></span>Utilisation de l'APD:
<span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"SELECT * FROM users WHERE username = :username"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bindParam</span></span><span>(</span><span><span class="hljs-string">':username'</span></span><span>, </span><span><span class="hljs-variable">$user_input</span></span><span>, PDO::</span><span><span class="hljs-variable constant_">PARAM_STR</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
</span></span>De cette façon, la base de données traitera automatiquement les données d'entrée, en évitant les risques de sécurité provoqués par échappement manuel.
Pour une validation d'entrée spécifique, vous devrez peut-être utiliser des expressions régulières pour limiter les entrées utilisateur. Par exemple, restreindre les noms d'utilisateur pour autoriser uniquement les lettres et les chiffres:
<span><span><span class="hljs-variable">$user_input</span></span><span> = </span><span><span class="hljs-variable">$_POST</span></span><span>[</span><span><span class="hljs-string">'username'</span></span><span>];
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">preg_match</span></span><span>(</span><span><span class="hljs-string">"/^[a-zA-Z0-9]+$/"</span></span><span>, </span><span><span class="hljs-variable">$user_input</span></span><span>)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Valid username!"</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Invalid username!"</span></span><span>;
}
</span></span>Cette approche garantit que la saisie de l'utilisateur répond au format attendu, mais il ne remplace pas complètement les protections de sécurité HTML ou SQL.
AddCSlashes ne convient pas au traitement des données de formulaire HTML car son mécanisme d'échappement est simple et n'a pas de sécurité suffisante. Pour les données saisies par les utilisateurs, la bonne façon de le gérer devrait être à utiliser:
htmlSpecialchars ou htmlentities pour empêcher les attaques XSS;
Requête paramétrée pour empêcher l'injection SQL;
Utilisez des expressions régulières appropriées pour vérifier le format d'entrée de l'utilisateur.
Ces méthodes amélioreront efficacement la sécurité des applications et éviteront les vulnérabilités communes. Par conséquent, les développeurs doivent comprendre les scénarios applicables de diverses fonctions et choisir la façon la plus appropriée de traiter les données d'entrée des utilisateurs.
Étiquettes associées:
HTML addcslashes