0 votes

Aide sur une requête MySQL

On m'a posé une question mais je ne peux même pas commencer à y répondre. Quelqu'un pourrait-il me donner une idée de par où commencer pour y répondre ?

Je ne cherche pas à obtenir la réponse, mais simplement à apprendre comment y répondre.

voilà :

En supposant que "regsister_globals" et "magic_quotes_gpc" sont activés, qu'est-ce qui ne va pas dans ce bout de code ? Documentez les failles possibles, puis corrigez-les pour produire une version sécurisée (il y a 4 erreurs).

$p = $_GET["p"];
if ($sp == "index.php") {

     if ($_get["id"] == 345)
          $filter - addslashes($_get["id"]);

     $sql = "SELECT * FROM users WHERE id = {$filter}";
     $row - mydql_fetch_assoc(mysql_query($sql));

     echo <<< HTML
     <html>
           ...... user details .....
     </html>
HTML. 
} else 
      include ($p);

1voto

Jacco Points 12528

Une recherche sur Google pour "SQL-injection" et "Input validation" devrait vous permettre de commencer.

Compte tenu de l'environnement,

"Assumant " registraire_globaux " et " cotes_magiques_gpc " sont activés"

Je pense que ce cas est destiné à vous apprendre le risque de ces deux paramètres.

Le code extrait comporte en fait 4 erreurs liées à "Ne faites jamais confiance à TOUTE information provenant de l'extérieur de votre script". en combinaison avec les directives php mentionnées ci-dessus.

(Il y a beaucoup plus d'erreurs que les 4 seules erreurs ; il y a un couple de " - " qui devrait être " = "et une minuscule " _get " qui devrait être en majuscules, etc. mais je suppose que ce ne sont que des fautes de frappe).

1voto

Greg Points 132247

Cela devrait vous permettre de commencer :

Trou 1 : register_globals devrait être désactivé - c'est un désastre pour la sécurité.

$p = $_GET["p"];
// Where does $sp come from?
if ($sp == "index.php") {

     // What the hell? So much wrong with these two lines
     // 1. if id == 345 you don't need to addslashes
     // 2. "-" should be "="
     // 3. addslashes should be mysql_real_escape_string
     // 4. the if() should be removed so it runs every time
     if ($_get["id"] == 345)
          $filter - addslashes($_get["id"]);

     // SQL injection
     $sql = "SELECT * FROM users WHERE id = {$filter}";
     // Again with the "-" instead of "="
     // Typo in the function name
     // No error checking
     $row - mydql_fetch_assoc(mysql_query($sql));

     // No escaping of database input - vulnerable to XSS attacks
     echo <<< HTML
     <html>
           ...... user details .....
     </html>
HTML. // Should be ; not .
} else 
{
      // I can include /etc/passwd by manipulating the URL
      include ($p);
}

0voto

middus Points 7613

Le code est vulnérable aux injections SQL car les données de l'utilisateur ne sont pas échappées. Utilisez mysql_real_escape_stringing

0voto

Kennethvr Points 1226

Mydql_fetch_assoc devrait être mysql_fetch_assoc

0voto

Rowan Points 2239

Essayez ça :

<?php
$p = $_GET["p"];
if ($p == "index.php" && $_get["id"] == 345) {

 $filter = mysql_real_escape_string($_get["id"]);

 $sql = "SELECT * FROM users WHERE id = {$filter}";
 $row = mysql_fetch_assoc(mysql_query($sql));

?>
<html>
 ...... user details .....
</html>
<?php
}
else if (strpos($p, '../')===false && file_exists($p)) {
 include $p;
}

?>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X