J'apprends PHP moi-même et je suis devenu conscient de la fonction strip_tags (). Est-ce la seule façon d'augmenter la sécurité?

StackOverflow https://stackoverflow.com/questions/2258808

  •  20-09-2019
  •  | 
  •  

Question

Je suis nouveau à PHP et je suis un tutoriel ici: lien

Il est assez effrayant qu'un utilisateur peut écrire du code PHP dans une entrée et vis essentiellement votre site, à droite?

Eh bien, maintenant, je suis un peu paranoïaque et je préfère apprendre les meilleures pratiques de sécurité dès le départ que d'essayer de les entasser dans une fois que j'ai quelques habitudes en moi.

Depuis que je suis tout nouveau à PHP (littéralement il y a deux jours choisis) pour, je peux apprendre quoi que ce soit à peu près facilement sans se confondre.

Quelle autre façon puis-je empêcher manigances sur mon site? : D

Était-ce utile?

La solution

Il y a plusieurs choses à garder à l'esprit lors de l'élaboration d'une application PHP, strip_tags() aide uniquement avec un de ceux. En fait strip_tags(), tout en étant efficace, pourrait même faire plus que nécessaire. Conversion des caractères potentiellement dangereux avec htmlspecialchars() devrait même être préférable, en fonction de la situation

En général, tout se résume à deux règles simples: filtrer toutes les entrées, échapper à toute sortie Maintenant, vous devez comprendre ce qui constitue exactement entrée et de sortie..

La sortie est facile, tout ce que votre application envoie au navigateur est sortie, utilisez donc htmlspecialchars() ou toute autre fonction échapper chaque fois que vous les données de sortie que vous ne vous êtes pas écrire.

L'entrée est des données non codées en dur dans votre code PHP: les choses provenant d'un formulaire via POST, à partir d'une chaîne de requête via GET, à partir des cookies, tous les doivent filtrer la manière la plus appropriée en fonction sur vos besoins. Même les données provenant d'une base de données devraient être considérés comme potentiellement dangereux; en particulier sur le serveur partagé, vous ne savez jamais si la base de données a été compromise ailleurs d'une manière qui pourrait affecter votre application aussi.

Il existe différentes façons de filtrer les données: listes blanches pour autoriser les valeurs sélectionnées, validation basée sur le format d'entrée expcted et ainsi de suite. Une chose que je suggère ne l'est jamais essayer de fixer les données que vous obtenez des utilisateurs. Faire jouer par vos règles, si vous ne recevez pas ce que vous attendez, rejeter la demande au lieu d'essayer de le nettoyer

Une attention particulière, si vous faites affaire avec une base de données, doit être versé à des injections SQL: ce genre d'attaque repose sur vous ne pas construire correctement les chaînes de requête que vous envoyez à la base de données, de sorte que l'attaquant peut les falsifier essayer d'exécuter l'instruction malveillante . Vous devriez toujours utiliser une fonction échapper, comme mysql_real_escape_string() ou, mieux, utiliser les commandes préparées avec MySQLi l'extension ou en utilisant PDO .

Il y a plus à dire sur ce sujet, mais ces points devraient vous aider à démarrer.

HTH

EDIT : pour clarifier, par « entrée de filtrage » Je veux dire de décider ce qui est bon et ce qui est mauvais, pas modifier les données d'entrée en aucune façon. Comme je l'ai dit que je ne l'avais jamais modifier les données utilisateur à moins que sa sortie au navigateur.

Autres conseils

strip_tags n'est pas la meilleure chose à utiliser vraiment, il ne protège pas dans tous les cas.

HTML Purifier: http://htmlpurifier.org/

est une vraie bonne option pour le traitement des données entrantes, mais il se sera toujours pas répondre à tous les cas d'utilisation -. Mais il est certainement un bon point de départ

Je dois dire que le tutoriel que vous avez mentionné est un peu trompeur sur la sécurité :

  

Il est important de noter que vous ne voulez jamais travailler directement avec le $ _GET et $ _POST valeurs. Toujours envoyer leur valeur à une variable locale, et travailler avec lui là-bas. Il y a plusieurs conséquences sur la sécurité impliqués avec les valeurs lorsque vous accédez directement (ou   sortie) $ _GET et $ _POST.

Ceci est un non-sens. Copie d'une valeur à une variable locale est plus sûr que d'utiliser les $ _GET ou $ _POST directement.

En fait, il n'y a rien d'intrinsèquement dangereux au sujet des données. Ce qui importe est ce que vous faites avec elle . Il y a des raisons parfaitement légitimes pour lesquelles vous pourriez avoir une variable $ _POST qui contient ; rm -rf /. Ceci est très bien pour la sortie sur une page HTML ou le stockage dans une base de données, par exemple.

La seule fois où il est dangereux est lorsque vous utilisez une commande comme system ou exec. Et c'est le temps dont vous avez besoin à vous soucier de ce que les variables que vous utilisez. Dans ce cas, vous voulez probablement utiliser quelque chose comme une liste blanche, ou au moins exécuter vos valeurs par escapeshellarg.

De même avec l'envoi de requêtes à des bases de données, l'envoi HTML aux navigateurs, et ainsi de suite. Échapper les données juste avant de l'envoyer dans un autre, en utilisant la méthode appropriée pour échapper à la destination.

strip_tags enlève chaque morceau de html. des solutions plus sophistiquées sont basées sur les listes blanches (ce qui permet des balises HTML spécifiques). une bonne bibliothèque est htmlpurifyer http://htmlpurifier.org/

et bien sûr du côté de la base de données des fonctions telles que les choses utiliser mysql_real_escape_string ou pg_escape_string

Eh bien, probablement que je me trompe, mais ... Dans toute la littérature, je l'ai lu, les gens disent qu'il est préférable d'utiliser htmlspellchars.

En outre, plutôt nécessaire de jeter les données d'entrée. (Pour int par exemple, si vous êtes sûr qu'il est l'ID utilisateur).

Eh bien, au préalable, quand vous commencez à utiliser la base de données -. Utiliser mysql_real_escape_string au lieu de mysql_escape_string pour éviter les injections SQL (dans certains livres anciens, il est écrit mysql_escape_string encore)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top