2009-02-13 5 views
8

Quelles sont les meilleures façons de se protéger de l'injection MySQL? Quelles sont les faiblesses que je devrais surveiller?Protection contre l'injection MySQL et signes de vulnérabilité utilisant PHP

Je sais ce que c'est, mais je n'ai vraiment aucune idée de la vulnérabilité que je pourrais avoir. Bien que j'ai pris (ce que je pense être) des étapes vers la protection de moi-même et de ma base de données.

Y a-t-il un moyen sûr d'arrêter quelqu'un?

BTW ... J'écrire en PHP :)

Répondre

1

Tu dois désinfectez toutes les entrées. La façon dont vous pouvez faire cela dépend de la langue de programmation et/ou du framework avec lequel vous travaillez.

modifier:

Si vous utilisez la fonction php que vous recherchez est mysql_real_escape_string ($ string). Vous devriez l'utiliser sur tout ce que vous recevez du client qui devrait aller dans la base de données.

+0

désolé pour ne pas être clair ... j'utilise PHP – johnnietheblack

+2

N'utilisez jamais échapper sauf si vous ne pouvez absolument pas l'éviter. Les fonctions d'échappement peuvent être, et ont été, boguées, permettant aux injections de glisser à travers. Il est pratiquement impossible pour les implémenteurs DB de faire une telle erreur avec les instructions paramétrées, par conséquent, ils sont plus fiables. –

+1

Cela étant dit, si vous DEVEZ utiliser escape (ce qui signifie que mysqli_ * est hors de question pour une raison quelconque), mysql_real_escape_string est en effet le chemin à parcourir. –

1

Si vous n'êtes pas à l'aide d'un cadre qui vous fournit des outils PHP désinfectante a une chaîne intégrée, vous devriez commencer là. Vous pouvez trouver la documentation sur ce within the PHP docs for mysql real escape string. Si vous regardez l'exemple trois, vous aurez une bonne idée des bases que vous pouvez suivre.

Une autre méthode que je suis consiste à s'assurer que je jette des variables le cas échéant. Par exemple, si je entrée attends d'un utilisateur à être un entier, je ferai ce qui suit:

$age = (int)$age; 

Aussi, si une colonne est censée être limitée à une ou deux valeurs (par exemple une colonne de genre) assurez-vous de l'appliquer dans votre PHP avant de le mettre dans la base de données.

0

Un signe indiquant que vous pourriez avoir un problème consisterait à saisir directement l'entrée utilisateur et à la placer dans votre commande SQL.

Par exemple, vous demandez leur nom d'utilisateur. Si vous le prenez, puis dites simplement

"Sélectionnez * De Users où Username = '$ USERNAME';"

L'utilisateur peut alors ajouter "JOE ', Drop Table ..." et ainsi de suite.

En Perl, vous pouvez dire quelque chose comme

my $sth2 = $dbh->prepare("Insert Into HostList (HostName,PollTime,Status) values (?,?,?);"); 
$sth2->execute($Hostname,$myDate,$Status); 

La méthode d'exécution alors chercher des exploits comme celui ci-dessus et échapper correctement.

0

J'utilise cette fonction PHP sur toutes les entrées avant d'essayer de l'utiliser dans n'importe quel code (requête MySQL, affichage de données, etc.). Il n'est probablement pas complet, mais il devrait arrêter toutes les tentatives de base de piratage du système:

//$linkID is the link ID of the connection to the MySQL database 
function clean_input($input) 
{ 
    GLOBAL $linkID; 
    if(get_magic_quotes_gpc()) 
    { 
     //Remove slashes that were used to escape characters in post. 
     $input = stripslashes($input); 
    } 
    //Remove ALL HTML tags to prevent XSS and abuse of the system. 
    $input = strip_tags($input); 
    //Escape the string for insertion into a MySQL query, and return it. 
    return mysql_real_escape_string($input,$linkID); 
} 
8

Faites confiance à personne!

Désinfectez toutes les entrées - filter_var() ou les expressions régulières ou in_array() de valeurs valides ou d'une stratégie mixte en fonction du type de données. "Entrée" signifie toute source d'entrée que vous ne contrôlez pas directement - pas seulement les formulaires!

Désinfectez tout ce que vous revenez de $_GET, $_POST, $_SESSION, $_COOKIE - tout ce qui pourrait avoir toute possibilité d'être contaminé.

ET

Utilisation préparé des déclarations

+0

$ _SESSION? Ces données ne sont-elles pas stockées, écrites et lues sur le serveur? –

+2

Yup. Et beaucoup de sites sont hébergés sur des serveurs partagés ... ne faites confiance à personne. – PartialOrder

1

Cela peut sembler de bon sens, mais je trébuché sur le sujet pendant un certain temps.

Il y a une différence entre le codage htmlentities() et échappermysql_real_escape_string(). Je pensais à eux comme assez interchangeables. Cependant il n'y a pas ... comme le bon sens vous le dira. :) Habituellement, il est préférable de les appliquer tous les deux, comme d'abord encoder, puis échapper.

Ensuite, lorsque vous extrayez les données, inversez le processus, décochez la case (si nécessaire) puis désactivez le codage. Remarque étant spécifique dans la façon dont les étapes sont effectuées (et inversée) permettra d'économiser beaucoup de maux de tête et des malheurs à double échappement.