Последнее обновление:
November 20, 2017

Есть мысль... Жми, напиши!
Что имеем: Постов : 171 Авторов: 1 Категорий: 38

Проверка авторизации пользователя, через сайт

В общем сначала это был вопрос — что флэшка передает на сервер вместе с запросом.
Покопавшись, выяснил, что она передает cookies

Например, имеем сайт http://pavelk.ru

1. Пользователь на него заходит и в стандартной форме ввода имени/пароля входит на сайт. Приэтом в кукисы занесём SessionId
И имеем флэшку, напирмер для просмотра видео только зарегистрированным на нашем сайте пользователям.

2. Чтобы узнать зареген юзверь или нет, флэшка запрашиват скрипт php, к примеру login.php на нашем хосте.

Приэтом в скрипт флэшка передает кукисы хоста, который она запрашивает.

А мы уже получим из кукисов идентификатор сессии, а из нее имя пользователя и пароль. Если всё ОК, то вернем положительный ответ флэшке.

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

Так же можно запретить загрузку со других хостов, или разрешить только с доверенных.
Флэшка так же передает Referer т.е. откуд она посылает запрос. В php получить его можно так: $_SERVER[‘HTTP_REFERER’] и уже сравнивать с идеалом.

Рабочий пример:

1. для начала идем по этой ссылке, Обидно?
2. поэтому следует залогинится тутЛогин: user Пароль: pass
3. и снова попытайтесь пройти по первой ссылке. Пустили?)
4. можно еще сходить по этой ссылке. Это пример на другом хосте можно нажать кнопку выход по ссылке из второго пункта и снова попробовать открыть флэшки

Меньше слов, ближе к делу:

[cc lang=»actionscript3″]

package {
import flash.text.TextFieldAutoSize;
import flash.text.TextField;
import flash.events.Event;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.display.MovieClip;

/**
* @author Pavelk
*/
public class Main extends MovieClip {
//—CONST—//
private const host:String=’http://pavelk.ru/projects/flashautorization/login.php?islogin’; //—параметр запроса islogin говорит что мы у серверного скрипта спрашиваем залогинен чел или нет
//—VARS—//
private var tf:TextField=new TextField();
//—BTGIN—//

public function Main() {
addChild(tf);
tf.border=true;
tf.autoSize= TextFieldAutoSize.LEFT;
status(‘Ждёмс…’);
//—запрашиваем серверный скрипт—//
var req:URLLoader=new URLLoader();
req.load(new URLRequest(host));
req.addEventListener(Event.COMPLETE, onLoginAnswer);
}

private function status(s:String):void {
tf.text=s;
tf.x=stage.stageWidth/2-tf.textWidth/2;
tf.y=stage.stageHeight/2-tf.textHeight/2;
}

private function onLoginAnswer(e:Event):void {
if (e.target.data==»yes») {
status(‘Я залогинен.Могу почитать анекдот: \r\r’+
‘Она: ответь мне, только честно, да или нет, хорошо? \r’+
‘Он: спрашивай \r’+
‘Она: почему мужчины смеются над блондинками? \r’+
‘Он: да’);
} else {
status(‘Обидно, я не залогинен.’+e.target.data);
}
}

}
}[/cc]

А вот уже серверный:

[cc escaped=»true» lang=»php»]

<?php

$login=»user»;
$password=»pass»;

if (isset($_GET[‘islogin’])) { //—если параметр запроса islogin есть, флэшка спрашивает, проверяем залогинены мы или нет
$sid=$_COOKIE[‘sid’]; //—попытаемся из печенюшек узнать значение sid
if (isset($sid)) { //—если оно действительно есть, то
session_id($sid); //—устанавливаем идентификатор сессии
session_start(); //—стартуем сессию
//—теперь можно и сравнить логин/пароль—//
if (($login==$_SESSION[‘login’])&&($password==$_SESSION[‘password’])) {
echo ‘yes’;
}
}
die(0); //—завершим работу скрипта
}

if (isset($_GET[‘tologin’])) { //—если параметр tologin значит пользователь хочет залогинится на сайте
if (($_GET[‘login’]==$login)&&($_GET[‘password’]==$password)) { //—если пришедший логин и пароль правильны, то
session_start(); //—стартуем сессию
setcookie («sid», session_id());
$_SESSION[‘login’]=$_GET[‘login’];
$_SESSION[‘password’]=$_GET[‘password’];
echo ‘<b>ЗАЛОГИНИЛИСЬ!<b>’;
echo «<meta http-equiv=’refresh’; content=’5; url=http://pavelk.ru/projects/flashautorization/login.php’> «; //—перенаправление
die(0); //—завершим работу скрипта
} else {
echo ‘<b>НЕПРАВИЛЬНОЕ ИМЯ ПОЛЬЗОВАТЕЛЯ ИЛИ ПАРОЛЬ</b>’;
}
}

session_start();

if (isset($_GET[‘exit’])) { //—если пользователь хочет разлогинится
session_unset();
echo «<meta http-equiv=’refresh’; content=’0; url=http://pavelk.ru/projects/flashautorization/login.php’> «; //—перенаправление
}

//—проверим заодно, вдруг пользователь уже залогинен…

if (($_SESSION[‘login’]==$login)&&($_SESSION[‘password’]==$password)) {
echo ‘
<form id=»formlogin» action=»http://pavelk.ru/projects/flashautorization/login.php» method=»GET»>
<input type=»submit» id=»exit» name=»exit» value=»Может разлогинится?» ></input>
</form>
<b>’;
die(0); //—завершим работу скрипта
}

//—выведем форму ввода логина и пароля

?>

<html>
<head>
<title>Флешевая авторизация</title>
<style>
#formlogin {
position: absolute;
width: 150px;
height: 120px;
left:50%;
top:50%;
margin-left: -75px;
magin-top: -60px;
}
</style>
</head>
<body>

<form id=»formlogin» action=»http://pavelk.ru/projects/flashautorization/login.php» method=»GET»>
<center>
<b>Логин:</b><br>
<input type=»text» id=»login» name=»login»></input> <br>
<b>Пароль:</b><br>
<input type=»text» name=»password» id=»password»></input> <br><br>
<input type=»submit» name=»tologin» id=»tologin» value=»Залогинится»></input>
</center>
</form>

</body>
</html>[/cc]

Views :

2822

Проверка авторизации пользователя на сайте из ActionScript

В общем сначала это был вопрос — что флэшка передает на сервер вместе с запросом.
Покопавшись, выяснил, что она передает cookies

Например, имеем сайт http://pavelk.ru

1. Пользователь на него заходит и в стандартной форме ввода имени/пароля входит на сайт. Приэтом в кукисы заносится SessionId — чтобы потом проверить можно было.

И имеем флэшку, напирмер для просмотра видео только зарегистрированным пользователям.

2. Чтобы узнать зареген юзверь или нет, флэшка запрашиват скрипт php, к примеру login.php
Приэтом в скрипт флэшка передает кукисы с хоста, с которого ее просматривает пользователь.
Т.е. если она загружена с http://pavelk.ru то она передаст кукисы установленные им. А в кукисах у нас SessionId и уже login.php проверяем залогинен или нет и возвращает результат.
Если флэшка будет на другом хосте, то SessionId там уже не будет, а подделать его сложновато.

Здесь тока изложил идею. Если кому нужно могу написать готовым кодом. Сейчас времени мало.
Реализация идеи.

Views :

896

Взаимодействие FLASH и PHP

Здесь я постарался затронуть актуальную тему – как обращаться из flash к php и наиболее часто встречающиеся проблемы.
Создаем новый документ, в первом кадре жмем F9, там и будет размещен весь наш ActionScript.

Часть 1 защита, прием, передача данных.
Используем наиболее удобную функцию sendAndLoad(адрес обработчика, параметры, метод передачи GET/POST);
Передавать будем сам php код, скрипт будет обрабатывать и возвращать результат, поэтому нам надо придумать оптимальный вариант проверки, от flash этот код или хакер пытается подсунуть свой.
Задача: защитить передачу данных.
Решение:
Используем необратимое шифрование MD5
[cc lang=»actionscript»] sil=»1r5y8i999oy»; //строка, которую знают только Flash и php [/cc] Зашифровываем ее, зашифровываем код, который передаем, потом зашифровываем все вместе, и получаем ключ. Передаем его вместе с кодом php. Обработчик делает также и сверяет свой ключ с переданным, если совпадают, то ок, выполняем код, нет – хацкер пытается выполнить свой код.
В своих запасах нашел скрипт у которого функции аналогичные как и в php например MD5, не знаю кто автор, но респект ему. Файл со скриптом лежит с исходниками. Подключаем этот файлик : #include «md5.as» Вызываем функцию MD5 так:
[cc lang=»actionscript»] MD5.hex_md5 (“”);[/cc] Вернет шифровку.
[cc lang=»actionscript»] key=MD5.hex_md5(MD5.hex_md5(comand)+MD5.hex_md5(sil)); // Получили ключ.[/cc] Создадим два объекта, которые будут получать и принимать данные.
[cc lang=»actionscript»] var inp:LoadVars = new LoadVars();//этот объект будет получать данные
var out:LoadVars = new LoadVars();//а этот отправлять[/cc] Теперь, напишем функции отправки и приема данных:
[cc lang=»actionscript»] function sendcomand(comand){ //функция отправки серверу данных.
//Comand – php код
out.comand =comand; // равносильно записи http://test.ru/index.php?comand=php код
out.idd=MD5.hex_md5(MD5.hex_md5(comand)+MD5.hex_md5(sil)); // ключ для сравнения
out.sendAndLoad(“http://www.test.ru/index.php”,inp,»POST»);//отправляем серверу данные
//Запрос будет выглядеть так: http://www.test.ru/index.php?comand=команда&idd=шифр метод — POST
} // Благополучно отправили. Но теперь нам надо принять результат.
inp.onData = function(data){//момент получения ответа
trace(data); //водим полученное
}[/cc] Для примера вызовем функцию
[cc lang=»actionscript»] sendcomand(“$res=\”I working!\”; echo$res+123;”);[/cc] Часть 2 обработчик на php
С отправкой и приемом данных разобрались, теперь напишем их обработчик на php. В файле php пишем:
[cc lang=»php»][/cc] cntrl+enter во flash и смотрим в окне вывода что получилось. Можно считать труд оконченным, но возник неприятный сюрприз – невозможность передать/принять русскоязычный текст, вместо него кракозябры . Будем доводить до ума. Собака зарыта в том, что ActionScript пользуется Юникодом. Ну берем лопату, будем раскапывать.

Кодовая страница для кириллицы в Юникоде начинается с числа 848, это код нулевого символа. Русская заглавная буква А имеет в кодировке Windows код 192, поэтому в Юникоде она кодируется числом 1040. За буквой А идут подряд остальные заглавные буквы, затем маленькие от а до я, код буквы я равен 1103. Буквы ё и Ё кодируются отдельно. Их коды 1025 для Ё и 1105 для ё. Пример:
[cc lang=»actionscript»] trace(String.fromCharCode(1040,1041,1071,1072,1073,1103,1025,1105)); //В окне вывода увидим АБЯабяЁё.[/cc] Как будем действовать: обмен должен происходит последовательностями четырех значных числе. А как быть с теми, код которых меньше 1000, да просто дополнять их слева нулями! Т.к. данные пойдут в фульм одним потоком, нам надо определить где кончается код для одного символа, поэтому обязательно 4цифры в числе. А на другой стороне отсекать левые нули и переводить обратно в нормальные символы. Напишем на стороне Flash две функции одна для кодирования (чтоб передавать русский текст), другая для декодирования (принимать русский текст).
Некоторые полезные функции:

Строка.charAt(индекс); — в ActionScript выдает символ по индексу
Строка[Индекс] – в php
String.fromCharCode(индекс); — в ActionScript вернет символ по его 10 значному коду.
Chr(индекс); — в php
String.ord(символ); — в ActionScript выдает 10 код по значению символа
Ord(символ) – в php

Часть 3: Передача русского текста в php и обратно.
Во flash пишем:
[cc lang=»actionscript»] function uni_str(uni) { //декодирование принятого
var
i,res,l=Math.floor(uni.length/4);
//длина строки будет в 4 раза меньше, т.к. на кодировку каждого символа мы отвели 4 цифры
res=»; //результат
for (i=0; iord(‘Ё’)) ad=0; else ad=848; //если нерусский то ничего не прибовляем, если русский прибавляем 848
c=sprintf(String(o+ad)); //доводим до ума
if (c==ord(‘Ё’)+ad) c=1025; //если это ё или Ё пишем коды отдельно
else if(c==ord(‘ё’)+ad) c=1105;
res+=c;
}
return res; // вернули результат
}[/cc] Тееперь тоже самое надо написать на php:
[cc lang=»php»]function chr_uni($s) {
$l=strlen($s);
$res=»;
for ($i=0; $i< $l; $i++) { $o=ord($s[$i]); if ($osendcomand(«$rez=’проверка’; echo (chr_uni($rez));»);
Не забываем экранировать кавычки.
Ух, на этом вродебы все, проблем больше возникнуть не должно, еще одна полезная штука: xml=new XML(data); напишите это в теле функции према данных, и можете парсить что вернул обработчик как нормальный xml.
Писалось под as2, легко можно переделать под as3.
Исходник:flashandphp.zip

[ratings]

Views :

5727