8795 sujets

Développement web côté serveur, CMS

Bonjour à tous,

Je voulais vous soumettre ma première requête PDO, que j'ai codée avec les quelques infos que j'ai prises sur le web.

Je voulais savoir si ca tenais la route, et quelles améliorations je pourrais apporter, notamment d'un point de vue sécurité...


try
{
	$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
	$DB = new PDO('mysql:host=localhost;dbname=xxx', 'root', '', $pdo_options);
}
catch(Exception $e)
{
	die('Erreur : '.$e->getMessage());
}
						
try
{
	// On récupère les données POST
	$titre = $DB->quote($_POST['titre']); 
	$contenu = $DB->quote($_POST['contenu']);
						
	// Insertion dans la base de donnée							
	$req = $DB->exec("INSERT INTO articles(titre, contenu) VALUES ($titre, $contenu)");
							
	// Redirection vers la page d'accueil
	header("Location: index.php");
						
	// Fermeture du curseur
    	$req->closeCursor();
}
catch(Exception $e)
{
	die('Erreur : '.$e->getMessage());
}


Ou ceci est mieux ?

try
{
	$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
	$DB = new PDO('mysql:host=localhost;dbname=stephanebleus', 'root', '', $pdo_options);
}
catch(Exception $e)
{
	die('Erreur : '.$e->getMessage());
}
						
try
{
	// On récupère les données POST
	$titre = $_POST['titre']; 
	$contenu = $_POST['contenu'];
				
	// Insertion dans la base de donnée	
	$statement = $DB->prepare("INSERT INTO articles (titre, contenu) VALUES (:titre, :contenu)");
	$statement->bindParam('titre', $titre, PDO: [langue]ARAM_STR);
	$statement->bindParam('contenu', $contenu, PDO: [langue]ARAM_STR);

	$statement->execute();
   												
	// Redirection vers la page d'accueil
	header("Location: index.php");
						
	// Fermeture du curseur
	$statement->closeCursor();
}
catch(Exception $e)
{
	die('Erreur : '.$e->getMessage());
}



Merci d'avance
Modifié par 20cents31 (25 Sep 2011 - 15:05)
la seconde est plus sécurisée en effet. Les requêtes préparée empêchent les injections SQL.
Si ton SGBD est MySql, tu peux même simplifier ta requête comme ceci.

try

{

	// Insertion dans la base de donnée	

	$statement = $DB->prepare("INSERT INTO articles (titre, contenu) VALUES (:titre, :contenu)");

	$statement->execute(array("titre" => $_POST['titre'], "contenu" => $_POST['contenu']));

   												

	// Redirection vers la page d'accueil

	header("Location: index.php");

}
catch(Exception $e)

{

	die('Erreur : '.$e->getMessage());

}

Il y avait une faille avec la fonction header() utilisé pour des redirections.

Je ne sais pas si ça a été règlé sous les dernières version de PHP, mais il est conseillé de faire suivre cette fonction de exit;

header("Location: index.php");
exit;
Bonjour,

moi mon soucis vient de :

catch(Exception $e)
{
	die('Erreur : '.$e->getMessage());

}


même en environnement de test, écrire ses erreurs dans un fichier texte, plutôt que de les afficher à l'écran, sera beaucoup plus sécurisé.