2009-09-11 4 views
4

On m'a dit dans un previous question que ma requête est sujette aux injections SQL.Injections SQL de base?

get_stats = mysql_query("SELECT * 
           FROM visitors 
           WHERE site='$_GET[site]' 
           AND date BETWEEN '$start_date' AND '$end_date' "); 

Quelle serait la manière la plus simple d'aborder ce problème? Et avez-vous d'autres lectures sur le sujet des injections? (quelque chose que je pourrais manquer sur Google). Merci!

+9

Tant que personne ne navigue jamais sur "page.php? Site = google.com"; drop database-- ", vous allez bien;) – Juliet

+4

J'essaie toujours' '; wreak havoc; --', mais je n'ai pas encore trouvé de DB qui implémente l'instruction 'wreak'. Un de ces jours ... – Eric

+1

mysql_query() ne supporte pas les multi-instructions, donc '; drop base de données - les attaques de type' ne fonctionneront pas dans ce cas ;-) – VolkerK

Répondre

16

Utilisez Prepared Statements.

Dans la plupart des cas, les instructions préparées permettent de combiner votre requête avec vos paramètres de manière sûre.

2

mysql_real_escape_string est la forme de sécurité la plus simple et la plus simple ici.

+1

cela ne vous sauvera pas dans tous les cas ... supposons que la colonne comparée soit un nombre, auquel cas la variable n'est pas citée. Cette fonction d'échappement ne fera rien pour empêcher "5 ou 1 = 1" (par exemple) d'être mis là-dedans, AFAIK. – rmeador

8

$ _GET ['site'] est une valeur qui vient directement de l'URL dans le navigateur, ce qui signifie qu'un utilisateur pourrait facilement changer cette valeur pour tout ce qu'ils veulent, vous devriez vérifier/assainir cette valeur, toutes les valeurs avant d'envoyer à une base de données.

Quelque chose comme ça serait un début, pourrait encore utiliser plus de travail et il y a plusieurs façons de le faire, je voudrais créer une fonction personnalisée/classe pour passer facilement toutes les variables par sitewide qui peut des choses simplement répétitif comme celui-ci

$site = mysql_real_escape_string($_GET['site']); 
$start_date = mysql_real_escape_string($start_date); 
$end_date = mysql_real_escape_string($end_date); 

get_stats = mysql_query("SELECT * FROM visitors WHERE site='$site' AND date >= '$start_date' AND date <= '$end_date' "); 
+0

N'oubliez pas d'échapper 'start_date' et' end_date', aussi bien. –

+0

vous ne voulez pas juste désinfecter avant d'envoyer à la base de données ... désinfecter avant de faire RIEN avec! L'injection SQL est juste un problème (commun) que vous rencontrez avec ce genre de chose, mais vous pouvez également en obtenir une foule d'autres, comme l'injection HTML et JS ... – rmeador

+0

de bons points, j'ai mis à jour – JasonDavis

Questions connexes