2013-05-29 3 views
1

Недавно я создал сценарий входа в PHP с именем пользователя и паролем для тестирования сессий и без MySQL.Можете ли вы безопасно хранить пароли в PHP?

Я хранятся пароли в массиве, как этот

$filepassword[1] = "123"; // User Bob 
$filepassword[2] = "321"; // User Tim 

имена пользователей сохраняются так же, как в массиве, как так

$fileuser[1] = "Bob"; // Password 123 
$fileuser[2] = "Tim"; // Password 321 

я использую Post, чтобы получить inputtedd пароль, а затем поместите его в цикл for и если пароль равен одному в массиве, он разбивается и возвращает 1, а затем проверяет, соответствуют ли номера для имени пользователя и проверяет его на соответствие.

Но, должен ли Istore пароли или даже хэш из них в php-файле?

+2

Вы никогда не должны хранить пароли напрямую, только хранить свой хэш! – Madsen

+0

Пароли предназначены для хэширования и хранения в базе данных, а не в массивах. –

+2

На самом деле не имеет значения, где вы их храните, что важно, как * how *. См. Http://stackoverflow.com/questions/4795385/how-do-you-use-bcrypt-for-hashing-passwords-in-php – Jon

ответ

10

Зачем использовать php-файл для хранения имен пользователей и паролей? В настоящее время довольно просто (и просто) использовать базу данных для поиска имени пользователя и пароля.

Это, как говорится, вы не хотите сохранить пароль в виде простого текста в базе данных.

PHP 5.5 имеет выход whole new set of password functions, так как вы используете библиотеку, которая позволяет осуществлять прямую совместимость этих функций? Password_compat.

Дело в том, что вы включаете файл, используете его функции, а затем, когда выйдет 5.5, вы просто удалите include и все функции будут работать, потому что они являются частью ядра.

Это очень проста в использовании:

  • Хэш пароля с помощью password_hash()
  • Сохраните имя пользователя и хэш в базе данных
  • При входе в систему используйте password_verify() для проверки пароля выслана в $ _POST против хэша в базе данных.

Вот и все! Простая, надежная, передовая совместимость. Очень рекомендуется для хранения файлов с плоскими файлами.


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

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

Вы можете даже serialize() свой массив и записать его в файл, затем unserialize() он на обратном пути. Но я бы порекомендовал взять тайм-аут, чтобы изучить основы MySQL, вы заберете его в кратчайшие сроки.

+0

Так что мне нужно будет хранить пароль в базе данных MySQL, чтобы он был безопасен для людей. Могут ли функции также останавливать инъекции SQL, которые я слышу все время, или это то, о чем мне не придется беспокоиться о новых функциях? –

+1

Отличные вопросы !! Вы храните ** хэш из пароля ** в базе данных, а не сам пароль, чтобы быть в безопасности. Рад, что вы действительно хотите сделать это ** прямо **. Вы используете PDO (или MySQLi, возможно, проще сначала) и [подготовленные заявления] (http://en.wikipedia.org/wiki/Prepared_statement), чтобы предотвратить это. Опять же, есть простые учебные пособия по всей сети, и если вы пойдете в них с намерением изучить его, вы отлично справитесь. Если вы выберете PDO, ** [здесь хороший учебник] (http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers) **. – Jimbo

+0

Для вашего пароля вам не нужен mysql (или любая другая база данных) для вашего пароля. Правильная хеширование пароля - важная часть здесь, а не там, где она хранится. Вы можете хранить хэши в файле 'passwords.txt' на вашем сервере (с надлежащими разрешениями на файлы, а не с доступом к сети), и они будут такими же безопасными, как и в базе данных. –

2

Ну да и нет.

PHP - это серверный язык, поэтому через клиента никто не может видеть пароль.

BUT 1: если хакер получит доступ к серверу, ваш пароль не будет сохранен и скомпрометирован. 2: ошибка сделана, и php-файлы не видны как php, а текст, поэтому сервер выводит PHP как текст, снова скомпрометирован

Итак, в этом смысле настоятельно рекомендуется использовать их как можно безопаснее.

Тогда возникает вопрос сохранения его в php-файле. У этого есть некоторые проблемы. 1: нелегко использовать, с базой данных вы можете делать приятные поиски и т. Д. 2: вы загружаете огромный массив в php только за 1 значение. Отходы памяти

+0

До тех пор, пока я Хешу Пароль Это может быть безопасно от удаленных атак. Только нужно беспокоиться о людях на FTP или на моем ПК? (Я проверяю это на локальном веб-узле) –

+0

Ну да, пока вы их используете, это безопасно (мы хороший метод hasing, я использую bcrypt). – MKroeders

+0

Я только начинаю с таких вещей, поэтому я попробую все эти методы. –

-5

Я думаю, что наиболее безопасным вариантом является использование функции md5(). $ fileuser [1] = md5 ($ fileuser [1]); etc ...

Конвертировать все в md5, а затем вы можете сравнить преобразованные строки друг с другом для равенства или неравенства.

Надеюсь, что я помог.

+2

Как можно утверждать, что md5() безопасен ... Кажется, что вам нужно немного догнать w.r.t. безопасность и хеширование – Madsen

+5

№ ** НЕ используйте ** MD5. Он широко открыт для нападений грубой силы. Сделайте простой google для «почему md5 небезопасно» или небезопасно, или что-то в этом роде. Я не могу вспомнить цифры, но мощный графический процессор может взломать любой MD5'd хэш за считанные минуты. – Jimbo

+0

Я согласен с @Jimbo, [здесь] (http://www.wired.co.uk/news/archive/2013-05/28/password-cracking) - хорошая статья с номерами, которые я только что прочитал сегодня – juanreyesv

0

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

passwords.php

<?php 

return array(
    'Bob' => '$2y$10$lwnevwevweuvuev...', // hash of Bob's password 
    ... 
); 

login.php

<?php 

// include https://github.com/ircmaxell/password_compat functions 
require_once 'lib/password.php'; 

$passwords = require 'passwords.php'; 

if (isset($_POST['username'], $_POST['password'])) { 
    if (!isset($passwords[$_POST['username']])) { 
     die('Invalid username'); 
    } 
    if (!password_verify($_POST['password'], $passwords[$_POST['username']])) { 
     die('Invalid password'); 
    } 
    echo 'Hi there!'; 
} 

Пока вы будете хранить пароли правильно хэшируются помощью надежного алгоритма, сохраняя их в файле вряд ли более небезопасно, чем использование базы данных. С оговоркой, что вы должны быть очень осторожны, чтобы никогда не обнаруживать содержимое этого файла PHP; неправильно установленный var_debug($passwords) или неправильно сконфигурированный веб-сервер может сделать общедоступными хэши паролей. В этом случае они все еще хешированы, но лучше держать их в секрете. Используйте проверенную и удобную для пользователей библиотеку для хэширования, например https://github.com/ircmaxell/password_compat.

+0

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

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