2012-02-17 3 views
2

Quelqu'un a récemment piraté mon CMS PHP et planté une injection SQL. Existe-t-il un moyen de protéger davantage mon code de connexion et d'empêcher les pirates? Toute aide serait géniale, merci.PHP CMS Login Hack

Login Form

<div id="loginform"> 

    <form method="post" action="check-login.php" name="form1"> 

    <label for="username" /><span style="color:#FFFFFF; font-family:'Trebuchet MS', Arial, Helvetica, sans-serif;">username:</span></label> 

    <input type="text" name="myusername" id="username"/> 

    <label for="password"/><span style="color:#FFFFFF; font-family:'Trebuchet MS', Arial, Helvetica, sans-serif;">password:</span></label> 

    <input type="password" name="mypassword" id="password"/> 

    <label for="submit"></label> 

    <input type="submit" name="sumbit" value="Login"> 

    </form> 

</div> 

PHP

mysql_connect ($host, $username, $password) or die ("can't connect"); 
mysql_select_db ($db_name) or die (mysql_error()); 

$myusername = $_POST['myusername']; 
$mypassword = $_POST['mypassword']; 

$sql = "SELECT * FROM $tbl_name WHERE username='$myusername' and password='$mypassword'"; 
$result = mysql_query($sql); 

$count = mysql_num_rows($result); 
if ($count == 1){ 
session_register("myusername"); 
session_register("mypassword"); 
header("Location:cms/admin.php"); 
}else{ 
echo "Wrong username or password"; 
} 
+2

Qu'est-ce qui vous fait penser que c'était ce script qui était le problème? Quel CMS utilisez-vous? –

+2

Lisez à propos de http://www.php.net/real_mysql_escape_string et appliquez-le ici $ myusername = mysql_real_escape_string ($ _ POST ['myusername']); 'et la même chose pour la ligne suivante du code. – Cheery

+0

Je soupçonne étant donné que ce petit morceau de code n'est pas protégé contre les exploits de base d'injection SQL, le reste de votre code est également non sécurisé. Il est fort probable que vous ayez besoin d'une réécriture complète d'une application, ou simplement d'utiliser un CMS existant et testé, comme Drupal, et de bénéficier d'une infrastructure préconstruite à mi-chemin. – ceejayoz

Répondre

6

Wow. Ceci est un grand no-no:

$myusername = $_POST['myusername']; 
$mypassword = $_POST['mypassword']; 

Vous devez aseptiser ces entrées avec au moins mysql_real_escape_string.

Modifier à ceci:

$myusername = mysql_real_escape_string($_POST['myusername']); 
$mypassword = mysql_real_escape_string($_POST['mypassword']); 

htmlentities() et htmlspecialchars() sont également utiles, mais je déconseille de les utiliser sur des données allant dans une base de données.

+0

Avez-vous encore besoin de désinfecter les entrées dans une instruction 'select'? Je fais personnellement, et je ne doute pas de votre réponse, je pensais juste que cela n'avait d'importance que dans les instructions 'insert' –

+1

@Paul ** VOUS AVEZ ABSOLUMENT BESOIN DE DÉSINFECTER ** les entrées dans certaines requêtes. Permettez-moi de vous présenter à mon ami [Bobby Tables] (http://bobby-tables.com/) ... – rdlowrey

+0

@Paul Oui! Toute requête SQL doit être nettoyée. Lisez sur les injections SQL et vous comprendrez. Habituellement, un hacker insère un commentaire mySQL ('-') qui lui permet alors de faire _whatever ce qu'il veut_. –

1

OUI

$myusername = $_POST['myusername']; 
$mypassword = $_POST['mypassword']; 

doivent être protégés

$myusername = mysql_real_escape_string ($_POST['myusername']); 
$mypassword = mysql_real_escape_string ($_POST['mypassword']); 

aller vérifier ces liens:

http://php.net/manual/fr/function.mysql-real-escape-string.php http://ca.php.net/manual/fr/function.addslashes.php

2

Le problème avec votre code est que vous placez directement l'entrée de l'utilisateur à partir des boîtes de connexion dans la requête SQL. C'est en effet un trou de sécurité et permet l'injection SQL.

Vous pouvez utiliser la fonction mysql_real_escape_string() pour contourner cela - il suffit de passer les variables du formulaire de connexion à travers avant de le mettre dans la requête SQL.

Cependant, ma solution préférée est d'utiliser des instructions préparées par PDO ou MySQLi - et je vous encourage fortement à apprendre et à utiliser cette méthode.

1

Réponse courte: oui. Votre code de connexion est largement ouvert à l'injection SQL. Vous devez regarder dans l'entrée de l'utilisateur d'échappement. Prenez quelques heures pour lire sur l'injection SQL, comprendre le concept et explorer les différentes solutions disponibles. L'utilisation de PDO et de ses instructions préparées est un bon moyen de gérer les fuites d'entrée en PHP. This SO question et ses meilleures réponses est une bonne ressource pour commencer à lire.

0

Les systèmes de connexion sont toujours trop difficiles à implémenter, même si cela semble très facile en vérifiant le nom d'utilisateur et le mot de passe pour une correspondance avec l'enregistrement existant. Il y a beaucoup de façons de l'implémenter.

  1. Utilisez du sel et du poivre sur le mot de passe fourni par l'utilisateur lors de son inscription.
  2. Vérifiez le mot de passe pour la correspondance en utilisant le même algorithme de hachage que vous avez utilisé lors de l'enregistrement.
  3. Modifiez la valeur de hachage de l'utilisateur passowrd chaque fois qu'il se connecte avec succès.
  4. Si vous utilisez des sessions et des cookies, il existe plusieurs façons de les sécuriser.
  5. Le nettoyage de tout type d'entrée utilisateur est très important.
  6. Ne stockez pas les noms d'utilisateur et les mots de passe dans les sessions ou les cookies. (très mauvais)
  7. Utilisez captcha pour empêcher tout type d'attaque de bot.

Tout en un, vous devez rechercher beaucoup de choses. Si le CMS que vous utilisez n'utilise pas ce mécanisme, modifiez-le et utilisez-le. Si ce n'est pas possible ou réalisable, utilisez les CMS les plus stables comme Wordpress, Joomla ou mon Drupal préféré!