Précédent   Forum des professionnels en informatique > PHP > Langage > Débuter
Débuter Forum d'entraide pour débuter en PHP. Avant de poster -> Cours PHP, FAQ PHP, Outils PHP, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 17/02/2011, 15h50   #1
Invité de passage
 
Homme David Bollinger
Développeur Web
Inscription : février 2011
Messages : 23
Détails du profil
Informations personnelles :
Nom : Homme David Bollinger
Localisation : Canada

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : février 2011
Messages : 23
Points : 3
Points : 3
Par défaut livre d'or à améliorer et à sécuriser

Bonjour à tous,

je travaille actuellement sur la refonte d'un site auquel je voudrais ajouter un livre d'or, étant débutant, j'aimerais avoir votre avis sur le code et notamment d'un point de vue sécurité, ou s'il y a des améliorations que je pourrais apporté.
j'aimerais aussi savoir (mais peut-être ne suis-je pas sur le bon forum), si on peut l'améliorer avec du javascript (ou jquery).
voici mon code :

le premier est config.php, ce sont mes éléments de configuration, que je changerais pour mettre ceux du serveur:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
<?php
 
define('DB_SERVEUR', 'localhost');
 
define('DB_NAME', 'livreor');
 
define ('DB_LOGIN','root');
 
define('DB_PASS', '');
 
define('DB_ENC', 'UTF8');
?>
le deuxième est index.php:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<?php
require "config.php";
 
//connexion base de donnée
mysql_connect(DB_SERVEUR, DB_LOGIN, DB_PASS);
mysql_select_db(DB_NAME);
mysql_query('SET NAMES '.DB_ENC);
 
//on vérifie qu'un message est posté et on l'ajoute dans bd
if(!empty($_POST))
{
	$pseudo = mysql_real_escape_string(htmlspecialchars($_POST['pseudo']));
	$email = mysql_real_escape_string(htmlspecialchras($_POST['email'])); 
    $message = mysql_real_escape_string(htmlspecialchars($_POST['message']));
    $message = nl2br($message);
	extract($_POST);
	$ip= $_SERVER["REMOTE_ADDR"];
	$sql = "INSERT INTO lo_message (pseudo,mail,message,ip) VALUES ('$pseudo','$email','$message','$ip')";
	mysql_query($sql) or die('erreur SQL !<br>'.$sql.'<br>'.mysql_error());
}
 
//Suppression message
if(isset($_GET['suppr']))
{
	$sql = "DELETE FROM lo_message WHERE id={$_GET['suppr']}";
	mysql_query($sql) or die('erreur SQL !<br>'.$sql.'<br>'.mysql_error());
	echo "Message supprimmé";
}
?>
 
<form method="post" action="index.php">
	nom : <input type="text" name="pseudo"/><br/>
	mail : <input type="text" name="email"/><br/>
	message :<br/>
	<textarea name="message"></textarea><br/>
	<input type="submit" value="envoyer"/>
</form>
 
 
<?php>
	//requête et affichage du résultat
$sql="SELECT * FROM lo_message ORDER BY id DESC";
$req = mysql_query($sql) or die('erreur SQL !<br>'.$sql.'<br>'.mysql_error());
while ($data = mysql_fetch_assoc($req))
{
	echo "<strong>".$data['pseudo']."</strong>";
	//effacer message, à paramettrer pour l'admin
	echo '<a href="index.php?suppr=' .$data["id"]. '"> x </a><br/>';
	echo "<p>".$data['message']."</p>";
}
 
print_r($data);
 
mysql_close();
?>
je souhaiterais aussi améliorer par la suite en contrôlant si l'identifiant est dispo en javascript (ou jquery), si l'email rentré est valide et est répertorié dans la base de donnée de la news letter (faut être abonné pour pouvoir laisser un message. là je sèche, tout est aide est la bienvenue.

Merci d'avance pour vos réponse.
ourson78 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/02/2011, 20h39   #2
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Ta requête n'est pas protégée puisque tu as un
qui écrase tes variables après leur traitement.

Il faudrait également vérifier si l'utilisateur a saisi quelque chose.

Il n'y a pas lieu d'utiliser htmlspecialchars pour l'insertion des données (au passage le deuxieme est mal écris).

La requête DELETE n'est pas protégée du tout (et il y a une faute d'orthographe a "supprimé")
Et la page semble etre accessible a tout le monde, c'est à dire que n'importe qui peut supprimer n'importe quoi.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/02/2011, 21h00   #3
Invité de passage
 
Homme David Bollinger
Développeur Web
Inscription : février 2011
Messages : 23
Détails du profil
Informations personnelles :
Nom : Homme David Bollinger
Localisation : Canada

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : février 2011
Messages : 23
Points : 3
Points : 3
Bonjour sabotage, effectivement, il y avait quelques problème de sécurité, voilà un code un peu mieux, par contre je n'ai aucune idée de comment réserver le droit d'effacer aux webmaster.

peux-tu me dire ce que tu pense de ce code là
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
<?php
require "config.php";
 
//connexion base de donn&#65533;e
mysql_connect(DB_SERVEUR, DB_LOGIN, DB_PASS);
mysql_select_db(DB_NAME);
mysql_query('SET NAMES '.DB_ENC);
 
//on v&#65533;rifie qu'un message est post&#65533; et on l'ajoute dans bd
if(isset($_POST['pseudo']) && isset($_POST['email']) && isset($_POST['message']) && $_POST['pseudo']!=NULL && $_POST['email']!=NULL && $_POST['message']!=NULL)//on verrifie qu ils existe et qu ils ne soit pas null
{
	if(!preg_match('#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#is', $email)){//vérification de la validite de l adresse mail
		$erreur++;
	}else{
		$email = mysql_real_escape_string(htmlspecialchars($_POST['email']));
	}
	$pseudo = mysql_real_escape_string(htmlspecialchars($_POST['pseudo']));
	$message = mysql_real_escape_string(htmlspecialchars($_POST['message']));
	$message = nl2br($message);
	$ip= mysql_real_escape_string($_SERVER["REMOTE_ADDR"]);
	if($erreur==0){
		$sql = "INSERT INTO lo_message (pseudo,mail,message,ip) VALUES ('$pseudo','$email','$message','$ip')";
		mysql_query($sql) or die('erreur SQL !<br>'.$sql.'<br>'.mysql_error());
	}
}
 
//Suppression message
if(isset($_GET['suppr']) && $_GET['suppr']!=NULL)
{
	$id= mysql_real_escape_string($_GET['suppr']);
	$sql = "DELETE FROM lo_message WHERE id='".$id."'";
	mysql_query($sql) or die('erreur SQL !<br>'.$sql.'<br>'.mysql_error());
	echo "Message supprimm&#65533;";
}
?>
 
<form method="post" action="index.php">
	nom : <input type="text" name="pseudo"/><br/>
	mail : <input type="text" name="email"/><br/>
	message :<br/>
	<textarea name="message"></textarea><br/>
	<input type="submit" value="envoyer"/>
</form>
 
 
<?php>
	//requ&#65533;te et affichage du r&#65533;sultat
$sql="SELECT * FROM lo_message ORDER BY id DESC";
$req = mysql_query($sql) or die('erreur SQL !<br>'.$sql.'<br>'.mysql_error());
while ($data = mysql_fetch_assoc($req))
{
	echo "<strong>".$data['pseudo']."</strong>";
	//effacer message, &#65533; paramettrer pour l'admin
	echo '<a href="index.php?suppr=' .$data["id"]. '"> x </a><br/>';
	echo "<p>".$data['message']."</p>";
}
 
print_r($data);
 
mysql_close();
?>
ourson78 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/02/2011, 21h17   #4
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
tiens compte des remarques que je t'ai déjà faites.

De plus, quand ton entrée est numérique, utilise intval() au lieu de mysql_real_escape_string().

Tu n'as pas besoin de protéger $_SERVER["REMOTE_ADDR"] puisque c'est une valeur fournie par le serveur.

Pour la restriction à certains utilisateurs, il te faut déjà une gestion des utilisateurs.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/02/2011, 22h50   #5
Débutant
 
Homme Laurent
Webmaster
Inscription : octobre 2006
Messages : 2 873
Détails du profil
Informations personnelles :
Nom : Homme Laurent
Âge : 48
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Webmaster
Secteur : Industrie

Informations forums :
Inscription : octobre 2006
Messages : 2 873
Points : 1 320
Points : 1 320
Citation:
Pour la restriction à certains utilisateurs, il te faut déjà une gestion des utilisateurs.
En effet, il faudrait pouvoir créer un compte (avec mot de passe) et être l'auteur d'un message pour pouvoir le supprimer (en gros ce que j'avais fait sur ce forum en PHP)
laurentSc est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h20.


 
 
 
 
Partenaires

Hébergement Web