Иногда требуется зщищать данные, передаваемые через XMLHttpRequest, чтобы они были доступными только для авторизированных клиентов. Можно это реализовать передачей логина и пароля в параметрах скрипта. Но это не очень хорошо, так, как, например, XMLHttpRequest может попытаться загрузить с сервера данные из статического файла, например, изображение или видео. Можно, конечно эти данные отдавать через скрипт, но в таком случае прийдется самостоятельно реализовывать такие фишкики, как поддержка докачек и много прочего.
Есть более постое решение. Многие веб-разработчики знают о такой штуке, как Basic HTTP Authentication.
В чем же ее преимущества и как нам ими воспользоваться? Во-первых, этот механизм стандартизирован и давно уже отлажен, поддерживается и серверами, и броузерами. Во-вторых, этот тип аутентификации может быть применен как для доступа к статическим файлам и папкам, так и к скриптам. В-третьих, этот тип аутентификации можно реализовывать в php-скриптах, благодаря чему можно хранить учетные записи в БД. В-четвертых, и самое главное, сам XMLHttpRequest поддерживает этот метод аутентификации.
Итак, начнем.
И начнем мы с сервера.
Сразу скажу: PHP должен быть модклем Apache, иначе этот метод работать не будет - cgi-версия PHP просто не предоставляет таких возможностей.
Будем делать скрипт, который выдает время на сервере (очень ценную информацию

) пользователям, которые есть в БД. Здесь будут олько кусочки из готового работающего скрипта. Работать в таком виде это не будет, но идею, думаю, поможет понять.
Итак, первым делом нам надо заставить пользователя авторизироваться. Для этого мы сообщаем броузеру, что без логина и пароля сюда войти нельзя.
if (!isset($_SERVER['PHP_AUTH_USER']))
{
header(’HTTP/1.0 401 Unauthorized’);
header(’WWW-Authenticate: Basic realm=”Some Secret Area (51)”‘);
echo (’This is protected area.You have to be authorized.’);
exit();
}
Если скрипту не передали логин, то надо сказать броузеру, чтобы он их передал. Делается это передачей специального заголовка.
Далее проверяем правильный ли нам логин передали. В ниже следующем примере мы проверяем наличие записи для переданного логина в БД. Ну, и если нет такой записи, то, конечно же, не пускаем.
$user_object = new user(&$db);
$user = $user_object->getByEmail($_SERVER['PHP_AUTH_USER']);
if (!isset($user) && !isset($user['id']))
{
header(”HTTP/1.1 401 Unauthorized”);
echo “No such user”;
exit();
}
Дальше проверяем пароль. Поскольку сам алгоритм Basic HTTP Authentication не предполагает никакого шифрования, а передают пароли в base64, мы себя немножко убезопасим, организовав доступ по временым ключам, состоящих из самого пароля и времени.
if (sha1($user['password'] . round((time() + 50) / 100)) != $_SERVER['PHP_AUTH_PW'])
{
header(”HTTP/1.1 401 Unauthorized”);
echo “Authorization failed. Play more.”;
exit();
}
Ну, и если пройдены все эти проверки, то уже можно выдавать данные.
Теперь переходим к клиентской части - XMLHttpReques.
Здесь все совсем, как обычно, за исключением одной мелочи. Наверное, многие, кто интересовался, обратили внимание на то, что метод open объекта XMLHttpRequest принимает аж пять параметров.
void open( AUTF8String method , AUTF8String url , boolean async , AString user , AString password )
Последние три необязательные. Давайте рассмотрим их все.
- method: метод запроса. Например, ‘GET’ или ‘POST’
- url: адрес, куда посылается запрос
- async: указывает должен ли запрос быть асинхронным
- user: логин для аутентификации на сервере
- password: пароль для аутентификации на червере
Вот как-раз два последних параметра нас и интересуют.
Делаем асинхронный запрос мтодом GET по адресу в переменной URL. И передаем логин и наш хитрый пароль.
this.request.open('GET', URL, true, login, sha1(password + Marh.round((Date.getTime + 50) /100)));
А в остальном, все так же, как и обычно.
Вот и все. Достаточно небольшие изменения в скриптах могут помочь спрятать информацию от глаз тех, кому ее видеть не обязательно.
0 Response to “XMLHttpRequest, PHP и ограничение доступа к данным”