Система входа Php, как ее обезопасить - PullRequest
3 голосов
/ 01 августа 2011

PHP новичок здесь.Ниже приведен код, который я использую для создания системы входа в систему для входа в mypage.php

. Она прекрасно работает, но довольно наивна, любой может ввести mypage.php в URL и избежать страницы входа.Как я могу сделать его более безопасным?

Большое спасибо!

    if(isset($_POST['submit'])) {
        $user = $_REQUEST['user'];  
        $pass = $_REQUEST['pass'];
        $sql = "SELECT * FROM login WHERE user='".$user."'";
        $res = $this->new_db->select($sql); 
        $row = $this->new_db->get_row($res);
        if (isset($row)) {  //user exists?
            if($row["pass"] == $pass){
$_SESSION['userId'] = $row['user'];// TRYING WITH SESSIONS
                header("Location: mypage.php");
            } else {
                echo "wrong pass";
            } 
        } else {
            echo "user does not exist";    
        }
    }

Тогда в mypage.php

if(isset($_SESSION['userId'])) {

//contents

} else {
echo "there's an error";

}

Это печатает "есть ошибка", почему ??Большое спасибо

Ответы [ 6 ]

5 голосов
/ 01 августа 2011

Три вещи:

  1. Не храните пароли в виде простого текста. Учитывая этот код, я могу только предположить, что это то, что вы делаете. Вы должны хранить хэши паролей, хэши паролей, которые вводит пользователь, и сравнивать их.
  2. У вас есть уязвимость внедрения SQL. Каждый раз, когда вы получаете входные данные от пользователя, который предназначен для запроса к базе данных, по крайней мере вы должны заключить его в mysql_real_escape_string().
  3. На странице входа в систему (на любой странице входа в систему) вы хотите отслеживать, вошел ли пользователь в систему. Один из простых способов сделать это - задать для формы входа значение $_SESSION. с указанием текущего статуса пользователя. Затем на любой странице, требующей входа пользователя, проверьте это значение. Если он существует, они уже вошли в систему. Если нет, то нет. Это просто, но достаточно хорошо, чтобы начать работу с тем, что вам нужно.
2 голосов
/ 01 августа 2011

Вам нужно будет что-то поместить в mypage.php, чтобы проверить, вошел ли пользователь в систему. Я делал это в прошлом с модулем Zend Auth из Zend Framework. Самое интересное в этом то, что его можно использовать отдельно (вам не нужно создавать целый сайт Zend Framework для использования модуля Auth). Я использовал Zend Auth Page , чтобы понять, как его использовать.

Затем, когда я настроил сеанс аутентификации с использованием Zend Session, я просто проверил на любой другой странице, чтобы убедиться, что пользователь "вошел в систему" с чем-то вроде этого:

private function _loggedIn()
{
    $loggedIn = false;
    $Namespace = new Zend_Session_Namespace('Zend_Auth');
    foreach ($Namespace as $index => $value) {
        $loggedIn = ($value->user_id);
    }
    return $loggedIn;
}
2 голосов
/ 01 августа 2011

Проверьте мой ответ здесь, который я опубликовал раньше, в котором объясняется, как вам следует работать с системами входа в систему.

Обширный редактор HTML с открытым исходным кодом

2 голосов
/ 01 августа 2011

да, в вашем коде может быть sql-инъекция для предотвращения вы можете использовать mysql_real_escape_string function

0 голосов
/ 01 августа 2011

Прежде всего, вы должны защитить свой запрос MySQL от внедрения SQL. Это может быть достигнуто путем добавления mysql_real_escape_string следующим образом:

$user = mysql_real_escape_string($_REQUEST['user']);  

Затем, если вы не хотите, чтобы пользователи могли посещать mypage.php без входа в систему, вы должны установить некоторые cookie-файлы в сценарии входа в систему, если вход выполнен успешно, а затем, на mypage.php, проверить, что cookie, чтобы увидеть, соответствует ли он в вашей базе данных. Примерно так:

login.php:

if($row["pass"] == $pass){
   setcookie("userid",$user);
   setcookie("passhash",sha1($pass));
...

mypage.php

$res = mysql_query("select * from login where user='".mysql_real_escape_string($_COOKIE['userid'])."' limit 1");
$row = mysql_fetch_assoc($res);

if($_COOKIE['passhash'] == sha1($row['pass']))
{
    die("logged in OK");
}
else
{
    die("please log in");
}
0 голосов
/ 01 августа 2011
if (isset($_POST['submit'])) {
  $user = $_REQUEST['user'];  
  $pass = $_REQUEST['pass'];

  $sql = "SELECT user FROM login WHERE user='".mysql_real_escape_string($user)."' AND pass=SHA1('".mysql_real_escape_string($pass)."')";
  $res = $this->new_db->select($sql);
  $row = $this->new_db->get_row($res);  

  if ($row['user'] != "") {  //user exists?
    header("Location: mypage.php");
  }else{
    echo "username and password combination is wrong";
  }
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...