2012-02-17 3 views
2

Кто-то недавно взломал мою PHP CMS и установил SQL-инъекцию. Есть ли способ сделать мой код входа более защищенным и предотвратить хакеров? Спасибо, спасибо.PHP CMS Login Hack

Войти Форма

<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

Что заставляет вас думать, что это был сценарий, который был проблемой? Какую CMS вы используете? –

+2

Читайте о http://www.php.net/real_mysql_escape_string и применяйте его здесь '$ myusername = mysql_real_escape_string ($ _ POST ['myusername']);' и то же самое для следующей строки кода. – Cheery

+0

Я подозреваю, что данный маленький бит кода не защищен от базовых эксплойтов SQL-инъекций, остальная часть вашего кода также небезопасна. Вам, скорее всего, нужно переписать все приложение или просто использовать существующую, проверенную CMS, например, Drupal, и получить выгоду от наполовину достойной предустановленной инфраструктуры. – ceejayoz

ответ

6

Wow. Это является большой нет-нет:

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

Вам необходимо дезинфицировать эти входы по крайней мере mysql_real_escape_string.

Изменить его к этому:

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

htmlentities() и htmlspecialchars() также полезны, но я бы не советовал использовать их на данных, поступающих в базу данных.

+0

Вам все еще нужно дезинфицировать входы в инструкции 'select'? Я лично делаю, и я не сомневаюсь в вашем ответе, я просто подумал, что это имеет значение только в заявлениях «вставить» –

+1

@Paul ** ВАМ АБСОЛЮТНО НУЖНО САНИТАТЬ ** входы в избранных запросах. Позвольте мне познакомить вас с моим другом [Bobby Tables] (http://bobby-tables.com/) ... – rdlowrey

+0

@Paul Да! Любой SQL-запрос нуждается в дезинфекции. Читайте на SQL-инъекциях, и вы поймете. Обычно хакер вставляет комментарий mySQL ('-'), который затем позволяет им делать то, что они хотят. –

1

ДА

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

должны быть защищены

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

пойти проверить эти ссылки:

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

2

Проблема с вашим кодом заключается в том, что вы непосредственно помещаете пользовательский ввод из ящиков входа в SQL-запрос. Это действительно дыра в безопасности и позволяет SQL-инъекцию.

Вы можете использовать функцию mysql_real_escape_string(), чтобы обойти это - просто передайте переменные из формы входа через нее, прежде чем помещать их в запрос SQL.

Однако предпочтительным решением является использование подготовленных инструкций PDO или MySQLi, и я настоятельно рекомендую вам изучить и использовать этот метод.

1

Короткий ответ: да. Ваш код входа в систему открыт для SQL-инъекций. Вам нужно взглянуть на ускорение ввода пользователя. Возьмите несколько часов, чтобы прочитать о SQL-инъекциях, понять концепцию и изучить различные доступные решения. Использование PDO и его подготовленных операторов - это хороший способ справиться с возможностью вывода данных в PHP. This SO question и его верхние ответы - хороший ресурс для начала чтения.

0

Систему входа в систему всегда сложно реализовать, хотя кажется, что это очень просто, просто проверив имя пользователя и пароль для соответствия существующей записи. Существует множество способов его реализации.

  1. Используйте соль и перец, применяемые к паролю, представленному пользователем при регистрации.
  2. Проверьте пароль на совпадение, используя тот же алгоритм хеширования, который вы использовали при регистрации.
  3. Изменение хэш-значения пользователя passowrd при каждом входе в систему.
  4. Если вы используете сеансы и файлы cookie, есть много способов их защитить.
  5. Очень важна очистка всех типов пользовательских входов.
  6. Не храните имена пользователей и пароли в сеансах или куки. (очень плохо)
  7. Используйте captcha для предотвращения любых бот-атак.

Все в одном, вы должны исследовать множество вещей. Если CMS, которую вы используете, не использует такой механизм, переработайте его и затем используйте. Если это невозможно или возможно, используйте самые стабильные CMS, такие как Wordpress, Joomla или мой любимый Drupal!