2009-09-03 8 views
3

J'ai un problème qui est un peu étrange. Ma page contient un lien html qui rafraîchit la page et appelle une variable PHP. Cette variable ajoute une chaîne de date à la chaîne url qui est introduite dans une requête MySQL, qui saisit les enregistrements correspondant à cette date. Je pense que cela provoque une injection car il supprime parfois l'utilisateur de la base de données!Possibilité d'injection à partir d'une chaîne de date Sélectionner une requête

Je sais qu'il peut y avoir des problèmes de sécurité en utilisant le '#' dans le lien hypertexte, mais j'aimerais savoir ce qui se passe. Cela aurait également des effets différents sur les différents navigateurs vu comment il utilise javascript. Les utilisateurs supprimés semble se produire uniquement sur certains ordinateurs des peuples.

Le code PHP calcule un horodatage trois jours à partir de maintenant et met ensuite dans un format SQL:

$ts_threeDays = mktime(1,0,0,date('m'), date('d')+3-date('w'), date('y'));  
$threeDaysAhead = date('y-m-d', $ts_second_day);  

Le script écoute alors pour la variable « jour » dans la chaîne d'URL transmis par le lien hypertexte sur la page:

$date = mysql_real_escape_string($_GET['day']); 

Le JavaScript et lien est:

<a href='#' onClick="document.location.href='planner.php?day=<?php echo $threeDaysAhead; ?>'"> 3 Days Later</a> 

Le MySQ L requête est plus grande, mais la seule entrée qu'elle prend de l'action de l'utilisateur est la chaîne de date ci-dessus. Requête ressemble fondamentalement à ce (utilise une autre instruction select pour accéder aux utilisateurs tableau):

SELECT planner.details FROM planner 
WHERE planner.date = '$date' AND users.`user_id` = '$id' // Logged in Id superglobal 

Si quelqu'un peut me aider et expliquer mon problème, je serai très reconnaissant. Un grand merci

Répondre

2

Comme vous passez par $datemysql_real_escape_string, la suspicion doit tomber sur soit $id, ou quelque chose que nous ne pouvons pas voir.

Une instruction SELECT ne va pas supprimer des éléments de votre base de données. Quoi d'autre avez-vous dans votre fichier PHP qui est responsable de la suppression des utilisateurs, et pourriez-vous avoir une logique if/else cassée qui finit par passer par une fonction pour supprimer les utilisateurs alors qu'ils ne devraient vraiment pas être?

0

Les réponses précédentes expliquent très bien votre problème.

Et vous pouvez valider votre « jour » obtenir var comme la façon suivante:

$day = ''; 
if (preg_match('/^\d{4}-\d{2}-\d{2}$/', $_GET['day']) 
{ 
    $day = $_GET['day']; 
} else { 
    die("bye bye"); 
} 
+0

Vous pouvez même attribuer '$ day' la partie correspondante du regex. De cette façon, si vous avez des déchets contenant une date (comme 2009-09-03); BAISSEZ les élèves; '), vous dépouillez les déchets. –

+0

Vous avez raison. La regex devrait être '^ \ d {4} - \ d {2} - \ d {2} $' ^. Mon erreur – inakiabt

Questions connexes