Безопасность на этом скрипте - PullRequest
1 голос
/ 18 сентября 2011

В последнее время я создаю сценарий входа в систему, и мне потребуются некоторые предложения по безопасности.Спасибо.

<?php
session_start();

include 'inc/conn.php';
include 'inc/config.php';
include 'inc/session.php'; //Prevent session hijack

if (isset($_SESSION['banned'])) {
    header("Location: banned.php");
    exit;
}

if (isset($_POST['submit'])) {

    if (isset($_SESSION['token']) 
        && $_POST['token'] == $_SESSION['token']) {

        $_POST['username'] = mysql_real_escape_string($_POST['username']);       
        $_POST['password'] = sha1($salt1 . $_POST['password'] . $salt2);

        $user_query = "SELECT id, userlevel FROM users WHERE username = '" . $_POST['username'] . "' AND password = '" . $_POST['password'] . "'";
        $user_result = mysql_query($user_query);

        if (mysql_num_rows($user_result) == 0) {
            $error = 'Fel användarnamn eller lösenord';
        } else {

            $row = mysql_fetch_assoc($user_result);

            $banned_query = "SELECT * FROM bans WHERE user_id = " . $row['id'] . "";
            $banned_result = mysql_query($banned_query);

            session_regenerate_id();

            if (mysql_num_rows($banned_result) == 0) {

                $_SESSION['logged_in'] = TRUE;
                $_SESSION['user_id'] = $row['id'];
                $_SESSION['userlevel'] = $row['userlevel'];

                header("Location: index.php");
                exit;

            } else {

                $ban_row = mysql_fetch_assoc($banned_result);

                $_SESSION['banned'] = TRUE;
                $_SESSION['user_id'] = $ban_row['user_id'];

                header("Location: banned.php");
                exit;

            }
        }
    }

}

$token = md5(uniqid(rand(), true));
$_SESSION['token'] = $token;

?>
<?php
if (!isset($_SESSION['logged_in'])) {
?>
<?php if (isset($error)) echo $error ?>
<form method="post" action="index.php">
<input type="hidden" name="token" value="<?php echo $token; ?>" />
Användarnamn<br />
<input type="text" name="username" value="" /><br />
Lösenord<br />
<input type="password" name="password" value="" /><br />
<input type="submit" name="submit" value="Logga in" />
</form>
<?php } else { echo var_dump($_SESSION); } ?>

config.php и conn - это всего два файла, один с подключением к базе данных, другой с двумя статическими переменными.

session.php

<?php
$string = $_SERVER['HTTP_USER_AGENT'];
$string .= 'SHIFLETT';

$fingerprint = md5($string);

if (isset($_SESSION['HTTP_USER_AGENT']) &&
    $_SESSION['HTTP_USER_AGENT'] != $fingerprint) {
    session_unset();
    session_destroy();
    header("Location: index.php");
    exit;
    exit;
} else {
  $_SESSION['HTTP_USER_AGENT'] = $fingerprint;
}
?>

Есть предложения?

Ответы [ 3 ]

3 голосов
/ 18 сентября 2011

Рассмотрите возможность использования функций mysqli_xxx вместо функций mysql_xxx.

См. Руководство по PHP для обзора расширения mysqli и его отличий от более старого расширения mysql.

Использование функций mysqli позволит вам использовать такие функции, как подготовленные операторы, что значительно упрощает написание безопасного кода.

В качестве базового уровня это довольно тривиальный набор изменений для перехода в библиотеку mysqli. Изменения для начала использования подготовленных утверждений и т. Д. Могут быть немного больше работы, но это того стоит.

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

Надеюсь, это поможет.

3 голосов
/ 18 сентября 2011

Судя по предоставленной вами информации, ваш скрипт, похоже, защищен от SQL-инъекций.И это все.

Ваше «предотвращение перехвата сеанса» - это скорее всего лишь попытка уменьшить вероятность, но не предотвратить ее.Поскольку атаки Session Hijacking чаще всего используют методы для получения идентификатора сеанса жертвы, который также может раскрыть идентификатор агента пользователя жертвы (например, XSS или проверку реферера HTTP).

Если честно, предотвращениеSession Hijacking довольно сложный.Но есть попытки, подобные описанной в SessionSafe: реализация обработки сеансов с иммунитетом XSS .

0 голосов
/ 18 сентября 2011

выглядит хорошо, братан, я бы сделал

if(isset($_POST['submit'])&&$_POST['submit']=='submit')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...