2010-01-26 10 views

Répondre

-1

Pourquoi voulez-vous utiliser une instruction préparée?

Si l'injection SQL est votre préoccupation, vous pouvez toujours rouler votre propre:

$fname = "Robert'); DROP TABLE students;--"; 
$lname = "Smith"; 

$pureSql = "SELECT FROM `users` WHERE `fname` = '$fname' AND `lname` = '$lname'"; 
$prepSql = "SELECT FROM `users` WHERE `fname` = :userfname AND `lname` = :userlname"; 

echo $pureSql, "\n"; 
echo prepare($prepSql, array('userfname' => $fname, 'userlname' => $lname)), "\n"; 

function prepare($sql, $params=array()){ 

    if(strlen($sql) < 2 || count($params) < 1){ 
     return $sql; 
    } 

    preg_match_all('/\:[a-zA-Z0-9]+/', $sql, $matches); 

    $safeSql = $sql; 
    foreach($matches[0] as $arg){ 
     if(array_key_exists(ltrim($arg, ':'), $params)){ 
      $safeSql = str_replace($arg, "'" . mysql_real_escape_string($params[ltrim($arg, ':')]) . "'", $safeSql); 
     } 
    } 

    return $safeSql; 

} //prepare() 

sortie est:

SELECT DE users OU fname = 'Robert'); DROP TABLE étudiants; - 'AND lname =' Smith ' SELECT FROM users O WH fname =' Robert \ '); DROP TABLE étudiants; - » ET lname = 'Smith'

EDIT: Vous avez oublié le lien xkcd http://xkcd.com/327/

+0

idée agréable. cependant, ceci a) ne nous permet toujours pas d'accéder aux instructions préparées côté serveur, et b) a des bogues (par exemple, les paramètres int ('1') get quoted (' '1''), ce qui pourrait causer des problèmes avec sql strict). Je suppose que ce n'est pas si trivial d'écrire un bug gratuit 'prepare()'. –

+1

Le simple remplacement de guillemets n'empêche pas l'exploitation. S'il vous plaît ne pas essayer ceci, sauf si vous savez vraiment ce que vous faites (par exemple, vous êtes Monty). – user999717

+1

On dirait un bon conseil mais j'ai besoin d'une preuve pour être sûr. Montrez-nous un exploit qui expose la vulnérabilité dans ce code. – jckdnk111

Questions connexes