Oui, MySQL peut stocker n'importe quel type de texte techniquement en toute sécurité. Ce qui signifie que MySQL enregistrera le texte tel quel et le renverra à nouveau sans perdre de données.
Mysql ne diffère pas entre le contenu du texte, donc cela ne fait aucune différence s'il s'agit de code HTML, CSS, JS ou du dernier e-mail de vos amis.
Cependant, si vous sortez le texte plus tard, vous devez veiller à ce qu'il n'y ait pas d'injection de code indésirable après avoir extrait les données de mysql. Mais ce n'est pas lié à MySQL en fait.
Pour vous rendre sql plus sécurisé, transmettez le handle de la base de données à mysql_real_escape_string
ou encore mieux utiliser MySQLi
et/ou AOP
et relevés préparés.
Votre code
Votre code donne l'impression que vous essayez beaucoup d'empêcher quelque chose, mais au final, il s'avère plutôt inutile :
function filter($data) {
$data = trim(htmlentities(strip_tags($data)));
if (get_magic_quotes_gpc())
$data = stripslashes($data);
$data= strip_tags($data);
$data = mysql_real_escape_string($data);
return $data;}
Normaliser les données avant de les traiter
Tout d'abord, vous devez changer la position du chèque pour get_magic_quotes_gpc
pour normaliser les données sur lesquelles la fonction travaille. Ce serait encore mieux si votre application ne s'y fiait pas mais refusait simplement de fonctionner si cette option était activée - voir ces informations importantes ici à ce sujet
si vous vous souciez de la sécurité.
Mais pour la sécurité de votre code publié, normalisons d'abord la valeur d'entrée de la fonction avant de la traiter davantage. Cela se fait en déplaçant la coche en haut de la fonction.
function filter($data)
{
// normalize $data because of get_magic_quotes_gpc
$dataNeedsStripSlashes = get_magic_quotes_gpc();
if ($dataNeedsStripSlashes)
{
$data = stripslashes($data);
}
// normalize $data because of whitespace on beginning and end
$data = trim($data);
// strip tags
$data = strip_tags($data);
// replace characters with their HTML entitites
$data = htmlentities($data);
// mysql escape string
$data = mysql_real_escape_string($data);
return $data;
}
Dans cette fonction modifiée, les guillemets magiques (que vous ne devriez pas utiliser) ont été déplacés vers le haut. Cela garantit que, quelle que soit l'option activée ou désactivée, les données seront toujours traitées de la même manière. Votre fonction ne l'a pas fait, elle aurait créé des résultats différents pour les mêmes données transmises. Cela a donc été corrigé.
Plus de problèmes avec votre fonction
Même la fonction semble meilleure maintenant, elle a encore de nombreux problèmes. Par exemple, on ne sait pas ce que la fonction fait réellement. Il fait plusieurs choses à la fois et certaines d'entre elles sont contradictoires :
- Il supprime les balises HTML qui sont un signe que
$data
ne doit pas contenir de HTML - Mais ensuite vous convertissez le texte de
$data
contenir en fait des entités HTML.
Alors, quelles devraient être les données ? HTML ou pas ? Cela n'introduit pas plus de sécurité si les choses deviennent floues, car cela profitera au fait que des erreurs entrent dans votre programme et finissent même par passer vos précautions de sécurité.
Vous devriez donc simplement jeter le code et considérer ce qui suit :
- Si l'entrée de votre application n'est pas valide, ne la filtrez pas. Au lieu de cela, empêchez toute utilisation ultérieure d'entrées non valides. Vous avez donc besoin d'une fonction pour valider l'entrée avant de l'utiliser.
- Ne modifiez pas les données simplement parce que vous pensez cela pourrait rendre quelque chose de plus sûr. Au lieu de cela, modifiez et encodez les données là où elles sont nécessaires et appropriées.
- Faites en sorte que votre application ne fonctionne qu'avec les guillemets magiques désactivés. S'appuyer sur cette fonctionnalité est fortement déconseillé. Et puis, il n'est pas nécessaire de vérifier tout cela dans votre code.
- Pour stocker quelque chose en toute sécurité dans la base de données, échappez les données avant de les utiliser uniquement dans la requête. Pas à un autre endroit de votre application. Utilisez des déclarations préparées pour cela.
- Pas besoin de brouiller les données avant de les mettre dans la base de données si elles sont valides. Mais vous devez l'encoder correctement lors de sa sortie sur la page Web . Et seulement là, une application sait dans quel encodage cela doit être. Vous ne le savez pas lorsque vous mettez les données dans la base de données.
Donc, si vous voulez rendre votre code plus sûr, il ne s'agit pas de jeter un tas de fonctions sur certaines données parce que vous pensez que celles-ci sont liées à la sécurité. Ce faisant, vous ne rendez pas votre logiciel plus sécurisé mais moins sécurisé.
- Ne faites jamais confiance aux données des utilisateurs.
- Assurez-vous que les données sont au format dont vous avez besoin traitement préalable .
- Utilisez le bon outil pour le travail au bon endroit.
- N'utilisez jamais d'outils pour deviner. Obtenez des connaissances à la place, qui ne rapportent pas seulement en termes de sécurité.