2016-02-04 2 views
-4

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

includes.php

<?php 

mysql_connect("mysql.example.com", $dbconn, "MySecurePassword"); 
mysql_select_db($dbconn); 

?> 

login.php

// $org is the Organisation Code, will be set when user clicks Login 

$dbconn = $org; 
include "includes.php"; 

// Omitted the $userid & $pw variables, assume there is no error, and that MySQL Injection is prevented already 

    $query = "SELECT * FROM `Login` WHERE `userid`=TRIM('$userid') AND `password`=TRIM('$pw')"; 

    $result = mysql_query($query); 

    if(mysql_num_rows($result)>0){ 

     session_start(); 
     $_SESSION['logged_in'] = $username; 
     header("Location: loggedinpage.php"); 

    } 

loggedinpage.php

<?php 

session_start(); 

// As there is no fixed database, I've omitted the DB Connection 

define('DS', TRUE); // used to protect includes 
define('USERNAME', $_SESSION['logged_in']); 
define('SELF', $_SERVER['PHP_SELF']); 

// Checks if user is logged in 
if (!USERNAME) { 
    header("Location: login.php"); 
} 

?> 

Мера безопасности Взятые

  • Пароли хэшируются с использованием SHA-512 и не сохраняются в открытом тексте.

  • MySQL инъекции предотвращается с помощью mysql_real_escape_string()

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

Заранее благодарен!

  • Обновленный вопрос, чтобы отразить обновления в комментариях
+2

Это почти как это делается. Вместо «SELECT *» вы можете использовать 'SELECT 1'. Тогда вы не получаете информацию о базе данных, так как вы ее не используете. Также прекратите использование функций 'mysql_', вместо этого перейдите к' mysqli_'. И не забывайте избегать ввода всех пользователей. – Phiter

+2

Одним из основных способов было бы перейти на использование параметризованных запросов. –

+0

Является ли способ обнаружения безопасности пользователя? Благодаря! – Panda

ответ

2

Предполагая, что ваш запрос работает по назначению и только возвращает строку, когда матч точно правильно (например, не странно нечеткого соответствия через СОРТ- правил, но чистый bin сравнение), аутентификация часть в значительной степени прекрасный.

(Вы были предупреждены о большом количестве инъекций SQL, вы сами по себе.)

Ваша безопасность затем сводится к следующему:

$_SESSION['logged_in'] = $username; 

и последующее:

define('USERNAME', $_SESSION['logged_in']); 

if (!USERNAME) { 
    header("Location: login.php"); 
} 

И я полагаю, ваш вопрос об этой части.
Тогда ответ: сеансовая часть в порядке, блокировка - нет.

Вот как используются сеансы, да, и они по умолчанию безопасны; пользователь не сможет каким-либо образом установить значение $_SESSION['logged_in'], значение может быть установлено только вашим сервером, и, по-видимому, вы делаете это только при успешной аутентификации. Прочитайте около сеанс захвата, это единственная реальная уязвимость ко всей схеме.

Реальная проблема:

if (!USERNAME) { 
    header("Location: login.php"); 
} 

Установка заголовка не прекращает текущую страницу. Если вы выведете конфиденциальную информацию после этой строки, то отправит клиенту! После установки заголовка необходимо явно указать exit.

Сказав все это, мы не можем сказать вам, является ли ваша система «безопасной», потому что может быть любое число facepalm бэкдонов, которые вы создали, которых мы не видим. В общем, я бы начал со следующим:

  • остановка с использованием mysql, используйте PDO или mysqli
  • связывания ваши параметры, не mysql_real_escape_string них; там есть подводные камни безопасности
  • использовать password_hash пароль хэширования, а не SHA; особенно если вы делаете только один проход SHA
+0

Спасибо! Это то, что я искал. – Panda

1

Becareful SQL Injection:

При вводе в поле пароля:

''='' 

правило установлен пароль будет верным, потому что Пароль = TRIM ('' = '') - true. Вы должны контролировать строку установлен пароль:

  • Минимальная длина
  • Нет белого пространства (благодаря функции подрезки)

И вы не должны хранить пароль, как это, вы должны сделать хэш пароля в

+0

Спасибо! Я уже предотвратил инъекцию MySQL. – Panda

Смежные вопросы