PHP CMS Логин Hack - PullRequest
       9

PHP CMS Логин Hack

2 голосов
/ 17 февраля 2012

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

Форма входа

<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";
}

Ответы [ 5 ]

6 голосов
/ 17 февраля 2012

Ничего себе. Это большой нет-нет:

$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() также полезны, но я бы не советовал использовать их для данных, поступающих в базу данных.

2 голосов
/ 17 февраля 2012

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

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

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

1 голос
/ 17 февраля 2012

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

1 голос
/ 17 февраля 2012

ДА

$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

0 голосов
/ 17 февраля 2012

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

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

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

...