PHP логин - основы безопасности - PullRequest
3 голосов
/ 23 сентября 2011

опять простой, но не очень очевидный вопрос от меня.На этот раз вход в PHP и сеанс.

Насколько я понимаю, с точки зрения безопасности:

  • проверка всех переменных перед отправкой в ​​MySQL

  • с использованием $ _POST для сокрытия информации

  • и регистрации сеансов

Ну, у меня есть некоторый код, который выучил/ made ', но если бы вы могли найти вещи, которые мне не хватает, с небольшим объяснением, я был бы очень признателен, а также может быть полезным для многих начинающих, как я.(Я читал очень много вопросов по этому поводу, но большую часть времени ответ начинался - Несмотря на то, что код является катастрофическим во многих отношениях, конкретный ответ на ...)

Итак, вот:

index.php

<html>
<head>
<title>Website</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
<ul><li><a href="index.php">HOME</a></li><li><a href="menu1.php">menu1</a></li><li><a href="logout.php">logout</a></li></ul>
</body>
</html>

session.php:

<?php 
session_start(); 
if (!isset($_SESSION["txtUserId"])) { 
require "login.php"; 
exit; 
}

login.php

require_once('db_connect.php');

$errorMessage = '';
if (isset($_POST['txtUserId']) && isset($_POST['txtPassword'])) {
 // check if the user id and password combination is correct
 $random = '$%hgy5djk3tgbG^bhk';;
 $logname=htmlspecialchars($_POST['txtUserId']);
 $pass=sha1(($_POST['txtPassword']).$random)

 $sql = "SELECT user, pass FROM users WHERE username= :login";
 $stmt = $db->prepare($sql);

  $stmt->bindvalue( ':login', $logname);
  $stmt->execute();
 if $stmt['pass']==$pass {

   // set the session
   $_SESSION['basic_is_logged_in'] = true;
   header('Location: main.php');
  exit;
 }
else {
 $errorMessage = 'Sorry, wrong user id / password';
 require "login.php"; 
 } 
}
?>
 <html>
 <head>
 <title>Login ...</title>
 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 </head>

 <body>
 <?php
 if ($errorMessage != '') {
  ?>
<p align="center"><strong><font color="#990000"><?php echo $errorMessage; ?></font></strong></p>
<?php
}
?>
<form method="post" name="frmLogin" id="frmLogin">
<table width="400" border="1" align="center" cellpadding="2" cellspacing="2">
<tr>
<td width="150">User Id</td>
<td><input name="txtUserId" type="text" id="txtUserId"></td>
</tr>
<tr>
<td width="150">Password</td>
<td><input name="txtPassword" type="password" id="txtPassword"></td>
</tr>
<tr>
<td width="150">&nbsp;</td>
<td><input type="submit" name="btnLogin" value="Login"></td>
</tr>  
</table>
</form>
</body>
</html>

db_connect.php:

<?php
$hostname = "localhost";
$username = "name";
$password = "pass";
 try {
    $pdo = new PDO("mysql:host=$hostname; dbname=dbnamehere", $username, $password);
//echo "Connected to database"; // check for connection
    }
catch(PDOException $e)
    {
    echo $e->getMessage();
    }
?>

Ответы [ 2 ]

2 голосов
/ 23 сентября 2011

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

edit

Я предполагаю, что ваш логинстраница действительно существует на index.php.В отличие от «повторяющихся» операторов из вашего сценария login.php, я бы разрешил обрабатывать весь сценарий, фиксируя любые ошибки в известной переменной $ _SESSION, например:

$ _ SESSION ['login_valid_error'] = "некоторый текст".

В конце скрипта,

if(isset($_SESSION['login_valid_error']) && !empty($_SESSION['login_valid_error'])) {
    header(...) //take the person to logged in page
} else {
   header('Location: index.php');
}

, затем обратно на index.php, чуть выше вашей формы создайте раздел уведомления об ошибке (снекоторый css), который, если страница загружена и переменная существует, выведите его:

<?php
if(isset($_SESSION['login_valid_error'])) { 
  echo '<div class="error">'. $_SESSION['login_valid_error'] .'</div>'; 
  unset($_SESSION['login_valid_error']);
}
?>

, убедившись, что сбросил переменную после загрузки страницы (любые новые попытки на странице будут собирать новые ошибки.

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

1 голос
/ 23 сентября 2011

Переменная $ _POST скрывает только данные от пользователя, но не добавляет никакой защиты, кроме незаметности.

Соображения безопасности должны включать (как минимум) уникальный токен в вашей форме (все формы!) Для предотвращения межсайтового скриптинга, проверки токена, шифрования запроса в форме входа (как минимум), шифрования и посола (уникальный, unstored salt) ваши пароли пользователей, а также проверка и дезинфекция всех введенных пользователем данных.

Я рекомендую использовать хорошо поддерживаемую инфраструктуру MVC, которая обеспечит большую часть безопасности для вас.

Вот несколько видео о том, что именно вы пытаетесь сделать, используя платформу CodeIgniter MVC:

И примеры Hello World и блога:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...