8792 sujets

Développement web côté serveur, CMS

Bonjour tout le monde.

Suite à une remarque sur un autre de mes topics je souhaiterais un peu plus d'explication. J'ai supprimé la variable $PHP_SELF et cela n'a pas d'influence apparente au fonctionnement de la page.
Pouvez vous m'en dire plus ? (Je précise que je ne connais presque rien au PHP).

La dite remarque :
FlorentG a écrit :


Hors-sujet, mais afficher PHP_SELF comme ça permet de faire des choses dangereuses. Si je met du code HTML dans l'url, genre :
pouet.php?<script>alert(document.cookies)</script>

Y'a moyen d'être méchant Smiley decu


Le code :

<?php

$email_dest = "user@domaine.com";

if ($_POST['envoi']) {

$message_remerciement = "Votre message à bien été envoyé  [smile]";

// E-mail headers:
$headers ="MIME-Version: 1.0 \n";
$headers .="From: Contact CXP<user@domaine.com>\n";


$headers .="Content-Type: text/html; charset=iso-8859-1 \n";

$subject = "Une personne vous a contacté";

$partie_entete = "<html><head>
<meta http-equiv=Content-Type content=text/html; charset=iso-8859-1>
</head>
<body bgcolor=#FFFFFF>";

for ($a=1; $a<= $_POST['nbre_champs_texte']; $a++) {
$partie_champs_texte .= "<font face='Verdana' size='2' color='#003366'>" . $_POST['titre_champ'.$a] . " = " . $_POST['champ'.$a] . "</font><br>";
}

if ($_POST['nbre_zone_email'] != 0) {
$partie_zone_email = "<font face='Verdana' size='2' color='#003366'>" . $_POST['titre_email'] . " : " . $_POST['zone_email'] . "</font><br><br>";
}

if ($_POST['nbre_zones_texte'] != 0) {
$partie_zone_texte = "<font face='Verdana' size='2' color='#003366'>" . $_POST['titre_zone'] . " :<br>" . $_POST['zone_texte'] . "</font><br>";
$partie_zone_texte = stripslashes($partie_zone_texte);
}

$fin = "</body></html>";

$sortie = $partie_champs_texte . $partie_zone_email . $partie_zone_texte . $fin;

// Send the e-mail
if (@!mail($email_dest,$subject,$sortie,$headers)) {
echo("Envoi du formulaire impossible");
} // Closing if !mail...

} // Closing if edit
?>


<form id="mail_form" method="post" action="[#red]<?=$PHP_SELF?>[/#]" onsubmit="return verifSelection(this)">
<div class="centrer">

<?php
	if ($message_remerciement) {
	echo("<p>");
	echo(stripslashes($message_remerciement));
	echo("</p>");
	echo("<p align=\"left\">");
	echo($sortie);
	echo("</p>");
	}
?>
	<p>Veuillez saisir votre adresse e-mail :</p>
	<input name="zone_email" type="text" />

	<p>Votre message :</p>
	<textarea name="zone_texte" cols="65" rows="10"></textarea>
	<input name="nbre_champs_texte" type="hidden" id="nbre_champs_texte" value="0" />
	<input name="nbre_zones_texte" type="hidden" value="1" />
	<input name="nbre_zone_email" type="hidden" value="1" />
	<input name="titre_email" type="hidden" value="E-mail" />
	<input name="titre_zone" type="hidden" value="Message" />
	<br /><br />
	<input type="reset" name="Reset" value="Effacer" />          
	<input type="submit" name="envoi" value="Envoyer" />
</div>
</form>



Merci d'avance pour vos remarques Smiley smile
Modifié par Spark (23 Sep 2007 - 18:45)
Si jamais tu utilises des sessions sur ton site, une bonne manière d'y mettre la pagaille et d'essayer de récupérer l'identifiant de session.

Alors si tu fais un simple echo de PHP_SELF, suffit de faire un lien comme celui-là :
tonscript.php/"><script>alert(document.cookie)</script>

Là dans ton cas :
form id="mail_form" method="post" action="$PHP_SELF" onsubmit="return verifSelection(this)">


Ca va se transformer en :
form id="mail_form" method="post" action=""><script>alert(document.cookie)</script>onsubmit="return verifSelection(this)">

Le script va être donc exécuté, et les cookies s'afficheront. Et si on arrive à les afficher, on arrive aussi à les récupérer ailleurs Smiley decu

On peut aussi rajouter carrément un formulaire entier, genre "tapez votre login + mot de passe", l'utilisateur croyant que ça fait partie du site normal, mais ne voyant pas que les infos sont envoyées ailleurs...
$_SERVER['PHP_SELF'] contient toujours le nom du script php exécuté, pas l'URL entrée.
Pour avoir l'URL entrée, c'est normalement plutôt $_SERVER['REQUEST-URI'].

Enfin bref, je n'ai pas connu le temps où register global était à on par défaut, et tant mieux.
QuentinC a écrit :
$_SERVER['PHP_SELF'] contient toujours le nom du script php exécuté

Sauf sous Apache où tu peux truander en rajoutant un slash et le javascript après le nom du fichier en règle Smiley smile