Безопасность при написании PHP веб-сервиса? - PullRequest
0 голосов
/ 03 июня 2010

Я пишу веб-сервис на PHP впервые и столкнулся с некоторыми проблемами безопасности.

1) Я планирую хешировать пароли с помощью md5 (), прежде чем записывать их в базу данных (или для аутентификации пользователя), но я понимаю, что для этого мне нужно будет передать пароль в виде открытого текста на сервер и хэш это там.
Из-за этого я подумал о том, чтобы md5 () использовал его на стороне клиента javascript, а затем перефразировал его на сервере, но затем, если javascript отключен, тогда пользователь не сможет войти, верно?

2) Я слышал, что все, что когда действие доступно только для чтения, вы должны использовать GET, но если оно изменяет базу данных, вы должны использовать POST. Разве публикация не так прозрачна, как GET, только не в адресной строке?

Ответы [ 2 ]

5 голосов
/ 03 июня 2010

Обычно не рекомендуется реализовывать свой собственный слой хеширования. Я уверен, что с md5 все будет в порядке, если вы просто создаете очень маленький сайт для учебных целей, но если вы храните важную информацию для более крупного сайта, вам следует использовать библиотеку, например PHPass :

Спасибо Jacco за этот фрагмент кода PHPass:

require('PasswordHash.php');

$pwdHasher = new PasswordHash(8, FALSE);

// $hash is what you would store in your database
$hash = $pwdHasher->HashPassword( $password );

// $hash would be the $hashed stored in your database for this user
$checked = $pwdHasher->CheckPassword($password, $hash);
if ($checked) {
    echo 'password correct';
} else {
    echo 'wrong credentials';
}

Если вы настаиваете на том, чтобы сделать это самостоятельно, вы должны посолить пароли. Смотри http://phpsec.org/articles/2005/password-hashing.html.

define('SALT_LENGTH', 9);

function generateHash($plainText, $salt = null)
{
    if ($salt === null)
    {
        $salt = substr(md5(uniqid(rand(), true)), 0, SALT_LENGTH);
    }
    else
    {
        $salt = substr($salt, 0, SALT_LENGTH);
    }

    return $salt . sha1($salt . $plainText);
}

Причиной различия между GET и POST является то, как браузеры интерпретируют запросы. Как упоминалось выше, веб-сканеры не будут выполнять запросы POST. Но представьте, что вы зашли на страницу вашего сайта http://example.com/deleteuser.php?userid=25, чтобы удалить неприятного спамера. Затем вы закрываете свой браузер. В следующий раз, когда вы вернетесь, Firefox снова откроет эту страницу и, к сожалению, вы удалили только что зарегистрированного пользователя!

Еще одной причиной GET против POST является частичное предотвращение подделок межсайтовых запросов . Если у вас была страница, на которой пользователь вышел из системы по запросу GET, кто-то мог бы вставить тег изображения в комментарий или сообщение на форуме, например <img src="http://example.com/logout.php" />, и браузер был бы вынужден выполнить операцию выхода из системы. Таким образом, любой пользователь, просмотревший эту страницу, выйдет из системы, даже если он будет администратором.

Редактировать: В качестве отступления, вы, вероятно, должны использовать sha-256 или bcrypt вместо md5, который был взломан (? ).

1 голос
/ 03 июня 2010

1) Я планирую хешировать пароли с помощью md5 (), прежде чем записать их в базу данных (или аутентифицировать пользователя), но я понимаю, что для этого мне нужно будет передать пароль в виде открытого текста на сервер и хэш это там.

Из-за этого я подумал о том, чтобы md5 () использовал его на стороне клиента javascript, а затем перефразировал его на сервере, но затем, если javascript отключен, тогда пользователь не сможет войти, верно?

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

2) Я слышал, что все, что когда действие доступно только для чтения, вы должны использовать GET, но если оно изменяет базу данных, вы должны использовать POST. Разве публикация не так прозрачна, как GET, только не в адресной строке?

Сканеры (включая индексаторы поисковых систем) не будут выполнять запросы POST. Браузеры обычно предупреждают пользователей о повторной отправке данных POST.

Использование POST и GET для правильных вещей не является вопросом безопасности.

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