насколько безопасен вход в Dreamweaver?

Когда мы используем Dreamweaver для создания автоматически сгенерированного входа в систему и выхода из системы — насколько это безопасно?

при этом Dreamweaver создает 3 папки: -

_mmServerScripts
_notes
Connections

и добавляет это на страницу login.php: -

<?php require_once('../Connections/da.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['username'])) {
  $loginUsername=$_POST['username'];
  $password=$_POST['password'];
  $MM_fldUserAuthorization = "";
  $MM_redirectLoginSuccess = "../index.php";
  $MM_redirectLoginFailed = "index.php";
  $MM_redirecttoReferrer = false;
  mysql_select_db($database_da, $da);

  $LoginRS__query=sprintf("SELECT user_id, user_password FROM users WHERE user_id=%s AND user_password=%s",
    GetSQLValueString($loginUsername, "int"), GetSQLValueString($password, "text")); 

  $LoginRS = mysql_query($LoginRS__query, $da) 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 );
  }
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>

<body>
<form name="login" action="<?php echo $loginFormAction; ?>" method="POST" target="_self">
<input name="username" type="text" />
<input name="password" type="password" />
<input name="login_button" type="submit" />
</form>
</body>
</html>

Также он использует mysql_pconnect для подключения к mysql: -

<?php
# FileName="Connection_php_mysql.htm"
# Type="MYSQL"
# HTTP="true"
$hostname_da = "localhost";
$database_da = "database";
$username_da = "root";
$password_da = "password";
$dacreint = mysql_connect($hostname_da, $username_da, $password_da) or trigger_error(mysql_error(),E_USER_ERROR); 
?>

Это на 100% эффективно и безопасно? А если нет, можем ли мы внести в него некоторые изменения, чтобы сделать его максимально безопасным... Потому что это действительно ускоряет работу.


person Django Anonymous    schedule 22.03.2012    source источник
comment
да, я согласен, но достаточно ли это безопасно?   -  person Django Anonymous    schedule 22.03.2012
comment
возможный дубликат Насколько безопасен выход из системы Dreamweaver PHP?   -  person Pekka    schedule 22.03.2012


Ответы (2)


Изменить: принятый ответ на дублирование этого вопроса (от того же автора? Почему?) указывает на две уязвимости, которые я пропустил: PHP_SELF уязвим для XSS, и откат к mysql_escape_string() не должен быть необходим (хотя это не проблема реального мира в любом случае.) Вместо того, чтобы красть очки у MrCode, я призываю всех проголосовать за это и проголосовать за лучший ответ MrCode :)

Это не очень красивый код, но с точки зрения безопасности и эффективности он выглядит вполне прилично. Он принимает во внимание, что магические кавычки постепенно исчезают в PHP 6, кажется, что он правильно экранирует все входящие данные формы и проверяет наличие переменных перед доступом к ним.

Единственное, что может вызвать проблемы, это лишний разрыв строки:

<?php require_once('../Connections/da.php'); ?>   <---- here
<?php

это будет путаться с перенаправлением заголовка в определенных ситуациях. Я бы избавился от этого и просто сделал

<?php require_once('../Connections/da.php'); 
      if (!function_exists("GetSQLValueString")) { 

также, вместо

  .... or die(mysql_error());

можно было бы использовать

  ....  or trigger_error(mysql_error(), E_USER_ERROR);

чтобы сообщения об ошибках SQL не отображались в рабочих средах.

person Pekka    schedule 22.03.2012
comment
Действительно ли создание двух разных областей кода php имеет какое-то значение ?? Я не могу понять, не могли бы вы объяснить немного больше... - person Django Anonymous; 22.03.2012
comment
@Abhilash, вы не можете вывести какие-либо данные перед отправкой команды header(). Эти две строки отправляют данные (разрыв строки), что может привести к сообщению об ошибке Cannot modify header information - headers already sent by .... - person Pekka; 22.03.2012
comment
простое удаление этого фрагмента кода, т. е. ?> и <?php, может решить проблему? Если это так, спасибо за это, потому что теперь у меня есть что исследовать :) - person Django Anonymous; 22.03.2012
comment
@Abi Аби, да, это решит проблему. - person Pekka; 22.03.2012
comment
@Abilash принятый ответ содержит несколько очень хороших моментов, особенно о PHP_SELF. Но почему вы попросили дубликат в первую очередь? - person Pekka; 22.03.2012
comment
На самом деле в прошлый раз я был почти уверен, что у Dreamweaver есть некоторые большие проблемы, недавно с запуском версии 5.5 и некоторыми обновлениями, которые они имеют в своем блоге, были приняты некоторые изменения и меры предосторожности, чтобы сделать его настолько безопасным, насколько это возможно. Как вы можете видеть, связанный код содержит немного измененный код, чем этот... Теперь мне нужен ваш профессиональный совет, стоит ли мне использовать этот Dreamweaver с объясненными изменениями, или я должен попытаться изучить больше.... в соответствии с вашим советом. .. У вас большой опыт - person Django Anonymous; 22.03.2012
comment
@Abi объедините советы MrCode и мои, и я думаю, у вас будет в значительной степени водонепроницаемое решение. - person Pekka; 22.03.2012
comment
Большое спасибо за вашу помощь и поддержку ... я очень ценю :) Теперь позвольте мне сделать небольшую домашнюю работу по всем вашим учениям ... большое спасибо - person Django Anonymous; 22.03.2012

Возможно, это не такая уж и хорошая идея:

mysql_query($LoginRS__query, $da) or die(mysql_error());

Это показывает клиенту объяснение ошибки mysql, возможно, раскрывая детали схемы БД вашей пользовательской таблицы.

person Tim    schedule 22.03.2012
comment
на самом деле это поддерживается кодом обработки ошибок... он читает файл php с таким кодом define('MYSQL_NOT_EXISTS', create_error("Your PHP server doesn't have the MySQL module loaded or you can't use the mysql_(p)connect functions.")); - person Django Anonymous; 22.03.2012
comment
я удалил постоянное соединение - person Django Anonymous; 22.03.2012
comment
php.net/manual/en/function.mysql-error.php — это функция php, которая возвращает последнюю ошибку mysql. - person Tim; 22.03.2012