Насколько безопасен PHP-вход в Dreamweaver? - PullRequest
1 голос
/ 13 марта 2012

просто ради знаний, я хочу знать, насколько хорошо использовать встроенную в Dreamweaver функцию аутентификации при входе в систему с помощью PHP-входа?

Безопасно ли это?

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

Вот код, который предоставляет Dreamweaver: -


Это моя форма входа


<form action="<?php echo $loginFormAction; ?>" method="POST" target="_self">
    <input name="ecsuser" class="form-login" title="Username" value="" size="30"
    maxlength="2048" />

    <input name="ecspass" type="password" class="form-login" title="Password" 
    value="" size="30" maxlength="2048" />

    <?php if(!empty($ERRORMESSAGE)) echo '<div style="color:#FFF; 
    font-weight:bold;">'.$ERRORMESSAGE.'</div>'; ?>

    <input name="" type="submit" value="" />
</form>

Это мой код обработки ошибок.


<?php
if (isset($_GET['ERRORMESSAGE']))
{
    if($_GET['ERRORMESSAGE'] == 1)
    {
    global $ERRORMESSAGE;
    $ERRORMESSAGE = "Sorry! The username or password is incorrect, 
            Please try again.";
    }
}
?>

Это мой следующий код


// Database Connection Include
<?php require_once('Connections/ecs.php'); ?>
<?php
if (!function_exists("GetSQLValueString")) {
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") 
{
  if (PHP_VERSION < 6) {
    $theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;
  }

  $theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);

  switch ($theType) {
    case "text":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;    
    case "long":
    case "int":
      $theValue = ($theValue != "") ? intval($theValue) : "NULL";
      break;
    case "double":
      $theValue = ($theValue != "") ? doubleval($theValue) : "NULL";
      break;
    case "date":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;
    case "defined":
      $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
      break;
  }
  return $theValue;
}
}
?>
<?php
// *** Validate request to login to this site.
if (!isset($_SESSION)) {
  session_start();
}

$loginFormAction = $_SERVER['PHP_SELF'];
if (isset($_GET['accesscheck'])) {
  $_SESSION['PrevUrl'] = $_GET['accesscheck'];
}

if (isset($_POST['ecsuser'])) {
  $loginUsername=$_POST['ecsuser'];
  $password=md5($_POST['ecspass']);
  $MM_fldUserAuthorization = "";
  $MM_redirectLoginSuccess = "index.php";
  $MM_redirectLoginFailed = "login.php?ERRORMESSAGE=1";
  $MM_redirecttoReferrer = false;
  mysql_select_db($database_ecs, $ecs);

  $LoginRS__query=sprintf("SELECT username, password FROM student WHERE username=%s AND password=%s",
    GetSQLValueString($loginUsername, "text"), GetSQLValueString($password, "text")); 

  $LoginRS = mysql_query($LoginRS__query, $ecs) or die(mysql_error());
  $loginFoundUser = mysql_num_rows($LoginRS);
  if ($loginFoundUser) {
     $loginStrGroup = "";

    if (PHP_VERSION >= 5.1) {session_regenerate_id(true);} else {session_regenerate_id();}
    //declare two session variables and assign them
    $_SESSION['MM_Username'] = $loginUsername;
    $_SESSION['MM_UserGroup'] = $loginStrGroup;       

    if (isset($_SESSION['PrevUrl']) && false) {
      $MM_redirectLoginSuccess = $_SESSION['PrevUrl'];  
    }
    header("Location: " . $MM_redirectLoginSuccess );
  }
  else {
    header("Location: ". $MM_redirectLoginFailed );
  }
}
?>

Кроме того, я хочу знать, что все другие меры безопасности, которые мы должны предпринять для построения эффективной системы входа в систему и выполняет ли приведенный выше код, на 100% без проблем с безопасностью.

Ответы [ 4 ]

9 голосов
/ 13 марта 2012
Is it secure?

Нет. Я вижу несколько проблем:

1) Прежде всего, существует уязвимость XSS. Когда вы повторяете $_SERVER['PHP_SELF'] таким образом, его нужно экранировать с помощью htmlspecialchars(). Если вы этого не сделаете, злоумышленник может создать ссылку, которая при нажатии будет украсть сеансовые куки, которые можно использовать для входа в систему без имени пользователя и пароля. См .: PHP_SELF и XSS

2) GetSQLValueString есть проблемы. Он возвращается к mysql_escape_string(), если mysql_real_escape_string() не существует. Вы никогда не должны отступать к mysql_escape_string(). Если mysql_real_escape_string() недоступен, и вы полагаетесь на него, чтобы избежать SQL-инъекции, ваше приложение должно остановиться. Эта функция также выполняет экранирование данных, прежде чем она узнает, что это за тип данных. Если вы используете intval (), floatval (), doubleval (), вам не нужно сначала выполнять mysql_real_escape_string().

Я предлагаю изменить это, чтобы использовать параметризованные запросы MySQLi или PDO, которые автоматически обработают экранирование для вас.

MySQLi: http://php.net/manual/en/mysqli.prepare.php ЗОП: http://us2.php.net/manual/en/book.pdo.php

3) Кажется, он пытается (и не удается) перенаправить на предыдущую страницу при успешном входе в систему. Вы никогда не должны перенаправлять, если вы не жестко закодировали URL-адрес или не проверили предоставленный пользователем URL-адрес, если вы этого не сделаете, вы можете быть уязвимы для атак с открытым перенаправлением / фишинга. Похоже, что кто-то мог попытаться это исправить, добавив false к if здесь: if (isset($_SESSION['PrevUrl']) && false) {, это утверждение никогда не будет оцениваться в true, и поэтому бессмысленно его хранить.

4). Посмотрите на эту строку:

$LoginRS = mysql_query($LoginRS__query, $ecs) or die(mysql_error());

Если при выполнении этого запроса возникнет какая-либо ошибка MySQL, приложение выведет полную ошибку MySQL, а затем остановится. Это будет чрезвычайно полезно для всех, кто пытается выполнить атаки SQL-инъекций. Даже если вы обеспечили безопасность для SQL-инъекций, это все равно расскажет о мировых частях вашей структуры базы данных. Вам следует использовать trigger_error() или вести собственную регистрацию ошибок, но никогда не показывать ее пользователю в рабочей / live / public системе.

5). Наконец, можно выполнять атаки XSRF в форме входа / выхода. Вы должны использовать токен анти-XSRF при отправке таких действий, как вход / выход из системы. См .: http://en.wikipedia.org/wiki/Cross-site_request_forgery

2 голосов
/ 13 марта 2012

Это уязвимо для CSRF . К сожалению.

Кроме того, в прошлом у меня был клиент с PHP-офисом в Dreamweaver. Он был взломан (все записи базы данных удалены) Google.

По-видимому:

  1. Некоторые страницы, которые не защищены - не проверяли учетные данные

  2. Были ссылки «удалить», которые не вызывали никакого подтверждения и работали в GET (стандартный сбой)

  3. Google красиво просканировал бэк-офис и удалил все (скажем, в логах)

1 голос
/ 22 января 2013

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

XSS на $ _SERVER ['PHP_SELF'] известна, но не настолько вредна, как полагают, и я гарантирую, что многие веб-сайты страдают от нее.

mysql_escape_string () - это плохо, и весь этот фрагмент кода плох, но он не должен падать, если на вашем сервере есть mysql_real_escape_string ().Если на вашем сервере он есть, он не упадет.

У вас есть XSS и есть шанс получить ошибку, если у вас старая версия php, но есть вероятность, что если у вас есть такая старая версия, вы все равно уязвимы.

Если вы основываете свою работу на Dreamweaver, попробуйте добавить валидацию и дезинфекцию для элементов формы, для этого есть некоторые расширения.Позаботьтесь об использовании серверного расширения Dreamweaver для проверки (см. На рынке).

Я предполагаю, что ваш вопрос был связан с Dreamweaver, и вы хотели знать, насколько безопасны приложения, созданные с помощью поведения и команд сервера Dreamweaver.Не так безопасно, не так уязвимо.

Советы, которые вы до сих пор получали от других пользователей, верны, подготовленные высказывания лучше, mysqli должен быть минимальным стандартом.Но если вам нужно выполнить свою работу с Dreamweaver (программирование для поэтов), то я советую проверить некоторые расширения Dreamweaver для проверки элементов формы на стороне сервера, чем вы можете купить более дорогое расширение Dreamweaver, которое может предоставить вам такую ​​же функциональность ита же интеграция с Dreamweaver, я думаю, вы ищете, но имеет лучший код, когда дело доходит до модуля «регистрация».На рынке их несколько.

Web Assist, например, имеет такие вещи.Мне они не нравятся, так как приведенный код не совсем понятен, а страницы довольно раздутые.Кроме того, проблема в обучении. Вы можете изучать PHP, а не учиться нажимать кнопки на этих расширениях.

FelixOne - еще один поставщик таких расширений, более дешевый, а кривая обучения лучше, чем Web Assist.Дайте им попытку.

0 голосов
/ 13 марта 2012

По этой ссылке вы узнаете лучшее решение для сценария входа в систему:
http://tinsology.net/2009/06/creating-a-secure-login-system-the-right-way/

...