2011-08-24 4 views
0

Possible en double:
Best way to stop SQL Injection in PHPComment rendre mon registre PHP/mySQL plus sécurisé?

ma question est de savoir comment puis-je faire inscrire plus sûr? Sur register.html l'utilisateur ajoute des données et si dans register.php le nom d'utilisateur existe dans la base de données, il lui dit d'utiliser un autre nom d'utilisateur.

Est-ce mauvais contre SQL Injection? D'un autre côté, comment puis-je m'assurer que les utilisateurs n'utiliseront que des caractères alphanumériques?

register.php

$sql ="SELECT * FROM $table_name WHERE username= '$_POST[username]'"; 
$result = @mysql_query($sql,$connection) or die(mysql_error()); 

//get the number of rows in the result set 
$num = mysql_num_rows($result); 

//checks it see if that username already exists 
if ($num != 0){ 

echo "<P>Sorry, that username already exists.</P>"; 
echo "<P><a href=\"#\" onClick=\"history.go(-1)\">Try Another Username.</a></p>"; 
exit; 

}else{ 
$sql = "INSERT INTO $table_name VALUES 
('$_POST[firstname]', '$_POST[lastname]', '$_POST[username]', password('$_POST[password]'), 'Users', '', '', '$pchange', 
'$_POST[email]', '$default_url', '$verify', '')"; 
+1

Voir http://stackoverflow.com/questions/60174/best-way-to-stop-sql-injection-in- php – JJJ

+4

Appartient à [codereview] (http://codereview.stackexchange.com/) (mais non, il est terriblement vulnérable à l'injection et je parierais qu'il est vulnérable à XSS aussi). – Quentin

Répondre

0

Vous devez utiliser mysql_real_escape_string() pour désinfecter toutes les valeurs POST et par conséquent d'éviter les attaques par injection SQL.

Essayez d'utiliser cette fonction:

<?php 
    //This stops SQL Injection in POST vars 
    foreach ($_POST as $key => $value) { 
    $_POST[$key] = mysql_real_escape_string($value); 
    } 

    //This stops SQL Injection in GET vars 
    foreach ($_GET as $key => $value) { 
    $_GET[$key] = mysql_real_escape_string($value); 
    } 
?> 

volé: http://www.php.net/manual/en/function.mysql-real-escape-string.php#92649

0

Utilisation prepared statements au lieu des paramètres d'inclusion en requête sql

$pdo = new PDO(*pdo parameters here*); 
    $sql = "SELECT * FROM $table_name WHERE username= ?"; 
    $stmt = $pdo->prepare($sql); 
    $rslt = $stmt->execute(array($_POST[username])); 
    if (!$rslt){ 
     var_dump($stmt->errorInfo()); 
    } 

    $num = $stmt->rowCount(); 

    // ................// 
    else{ 
     $sql = "INSERT INTO $table_name VALUES (?,?,?,?,?,?,?,?,?,?,?,?)"; 
     $stmt_ins = $pdo->prepare($sql); 
     $stmt_ins->execute(array(
      $_POST[firstname], 
      $_POST[lastname], 
      $_POST[username], 
      password($_POST[password]), 
      'Users', '', '', $pchange, 
      $_POST[email], $default_url, $verify, '' 
     )); 
    } 
+0

J'ai lu qu'en utilisant des instructions préparées, vous sécurisez votre application contre SQL Injection et XSS. Est-ce exact? – EnexoOnoma

+0

Contre l'injection SQL - oui. Contre XSS - partiellement. – J0HN

Questions connexes