<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Неофициальный форум DLNA Home Media Server &mdash; Авторизация на сайтах]]></title>
	<link rel="self" href="https://hms.lostcut.net/extern.php?action=feed&amp;tid=127&amp;type=atom" />
	<updated>2017-11-06T13:07:47Z</updated>
	<generator>PunBB</generator>
	<id>https://hms.lostcut.net/viewtopic.php?id=127</id>
		<entry>
			<title type="html"><![CDATA[Re: Авторизация на сайтах]]></title>
			<link rel="alternate" href="https://hms.lostcut.net/viewtopic.php?pid=10545#p10545" />
			<content type="html"><![CDATA[<p>WendyH, спасибо за помощь<br />заработало.</p>]]></content>
			<author>
				<name><![CDATA[Oompaloomp]]></name>
				<uri>https://hms.lostcut.net/profile.php?id=118</uri>
			</author>
			<updated>2017-11-06T13:07:47Z</updated>
			<id>https://hms.lostcut.net/viewtopic.php?pid=10545#p10545</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Авторизация на сайтах]]></title>
			<link rel="alternate" href="https://hms.lostcut.net/viewtopic.php?pid=10542#p10542" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Oompaloomp пишет:</cite><blockquote><p>WendyH, доброго времени суток<br />прошу помощи с charles 4.2-win32<br />Не знаете как поправить кракозябры запросах:</p></blockquote></div><p>Это не кракозябры. Это зашифрованный траффик. Протокол http<strong>s</strong>.<br />Расшифровать можно только если настройки сайта на сервере не сильно ревнуют к самопальному сертификату с неподдвержаемым рутовыми центрами сертификации.</p><p>1) Нажимаем &quot;Help&quot; - &quot;Install Charles CA SSL certificate...&quot;<br />2) &quot;Proxy&quot; -&gt; &quot;Proxy settings&quot; -&gt; вкладка &quot;SSL&quot;<br />3) Нажимаем Add и вписываем доменное имя сайта (например, filmix.me) и порт 443, нажимаем ОК.</p><p>После этого можно в браузере переходить на сайт. Браузер может ругнуться, что сертификат не подтверждён, произошла подмена, караул. В этом случае, нажимаем &quot;Подробно&quot; -&gt; &quot;Всё равно перейти&quot; или как-то так.<br />Если всё получилось, то вы стали практически хакером с атакой &quot;человек-по-середине&quot;, вставив свой сертификат для расшифровки в общение между сайтом и браузером. )</p><p>Если пользуетесь хромом, то в некоторых случаях при использовании HSTS на сайтах (типа как здесь на форумах) он может не дать вам перейти на него вообще.<br />Тогда можно попробовать в Firefox при такой ругани добавить сайт в исключения на такие ошибки.</p>]]></content>
			<author>
				<name><![CDATA[WendyH]]></name>
				<uri>https://hms.lostcut.net/profile.php?id=2</uri>
			</author>
			<updated>2017-11-06T09:58:07Z</updated>
			<id>https://hms.lostcut.net/viewtopic.php?pid=10542#p10542</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Авторизация на сайтах]]></title>
			<link rel="alternate" href="https://hms.lostcut.net/viewtopic.php?pid=10537#p10537" />
			<content type="html"><![CDATA[<p>WendyH, доброго времени суток<br />прошу помощи с charles 4.2-win32<br />Не знаете как поправить кракозябры запросах:<br /></p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header" data-lang-open="открыть спойлер" data-lang-close="скрыть спойлер"><strong>+</strong>&nbsp;открыть спойлер</div><div class="fancy_spoiler"><p><span class="postimg"><img src="http://i3.imageban.ru/out/2017/11/05/1cb54f5204e238f23e44b7bc25a054b7.png" alt="http://i3.imageban.ru/out/2017/11/05/1cb54f5204e238f23e44b7bc25a054b7.png" /></span></p></div></div>]]></content>
			<author>
				<name><![CDATA[Oompaloomp]]></name>
				<uri>https://hms.lostcut.net/profile.php?id=118</uri>
			</author>
			<updated>2017-11-05T16:27:42Z</updated>
			<id>https://hms.lostcut.net/viewtopic.php?pid=10537#p10537</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Авторизация на сайтах]]></title>
			<link rel="alternate" href="https://hms.lostcut.net/viewtopic.php?pid=7456#p7456" />
			<content type="html"><![CDATA[<p>Даладна, пора уже наверно отдельный цитатник издавать&nbsp; <img src="https://hms.lostcut.net/extensions/k_smiles/img/ab.gif" alt=":)" /></p>]]></content>
			<author>
				<name><![CDATA[Razval]]></name>
				<uri>https://hms.lostcut.net/profile.php?id=103</uri>
			</author>
			<updated>2017-01-28T00:46:01Z</updated>
			<id>https://hms.lostcut.net/viewtopic.php?pid=7456#p7456</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Авторизация на сайтах]]></title>
			<link rel="alternate" href="https://hms.lostcut.net/viewtopic.php?pid=7455#p7455" />
			<content type="html"><![CDATA[<p>WendyH, доброго времени суток<br />просьба прикрепить эту тему т.к. в ней есть много полезных вещей.</p>]]></content>
			<author>
				<name><![CDATA[Oompaloomp]]></name>
				<uri>https://hms.lostcut.net/profile.php?id=118</uri>
			</author>
			<updated>2017-01-27T18:10:25Z</updated>
			<id>https://hms.lostcut.net/viewtopic.php?pid=7455#p7455</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Авторизация на сайтах]]></title>
			<link rel="alternate" href="https://hms.lostcut.net/viewtopic.php?pid=2587#p2587" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>HERO1CK пишет:</cite><blockquote><p>Спасибо конечно за разъяснения, я честно признаюсь что я в ступоре, я прочитал трижды, и всё равно в непонятках. Можно как то в более доступном пошаговом варианте для чайников...Я говорю как потребитель, а не как &quot; вы - магистр&quot;. Мне кажется что многие пользователи не такие продвинутые, хотя это наши проблемы отчасти.</p></blockquote></div><p>Не, вы, если что, спрашивайте или так и говорите, что не понятно.<br />Вот. Дополнил и оформил первое сообщение более наглядно.</p><p>Но тут, всё таки, небольшие знания как работает HTTP (и что есть такие заголовки) и хоть немного понимать код, всё-таки, нужно. Т.е. совсем в этом не разбирающимся людям можно даже не пытаться. Ну, а если есть желание разобраться, то задавайте вопросы.</p>]]></content>
			<author>
				<name><![CDATA[WendyH]]></name>
				<uri>https://hms.lostcut.net/profile.php?id=2</uri>
			</author>
			<updated>2015-12-14T17:51:05Z</updated>
			<id>https://hms.lostcut.net/viewtopic.php?pid=2587#p2587</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Авторизация на сайтах]]></title>
			<link rel="alternate" href="https://hms.lostcut.net/viewtopic.php?pid=2586#p2586" />
			<content type="html"><![CDATA[<p>Спасибо конечно за разъяснения, я честно признаюсь что я в ступоре, я прочитал трижды, и всё равно в непонятках. Можно как то в более доступном пошаговом варианте для чайников...Я говорю как потребитель, а не как &quot; вы - магистр&quot;. Мне кажется что многие пользователи не такие продвинутые, хотя это наши проблемы отчасти.</p>]]></content>
			<author>
				<name><![CDATA[HERO1CK]]></name>
				<uri>https://hms.lostcut.net/profile.php?id=55</uri>
			</author>
			<updated>2015-12-14T14:27:37Z</updated>
			<id>https://hms.lostcut.net/viewtopic.php?pid=2586#p2586</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Авторизация на сайтах]]></title>
			<link rel="alternate" href="https://hms.lostcut.net/viewtopic.php?pid=2584#p2584" />
			<content type="html"><![CDATA[<p>По просьбе разобраться с авторизацией torrent-tv (который в данный момент недоступен, да ещё и заблокирован на территории России), пояснения как её сделать в коде буду пояснять на примере сайта 1ttv.org</p><p>Чтобы реализовать авторизацию на сайтах в коде скрипта, нужно, для начала, просмотреть как она происходит на сайте в браузере.<br />Для этого можно использовать любой http сниффер, например <a href="https://www.charlesproxy.com/download/">Charles</a>.<br /></p><div class="wh_markdown"><div class="markdown-body"><h2><a href="#Просмотр_авторизации_через_браузер" name="Просмотр_авторизации_через_браузер" class="anchor" target="_blank"><span class="octicon octicon-link"></span></a>Просмотр авторизации через браузер</h2>
<ol>
<li>Запускаем Charles</li>
<li>Открываем браузер, идём на страницу сайта. Если нужно, предварительно нужно выйти (разлогиниться) на нём, чтобы перехватить момент именно успешной авторизации.</li>
<li>Логинимся на сайте. </li>
<li>Идём в сниффер и смотрим, как происходили запросы (Request) и какие сервер отдал после этого ответы (Response).</li>
<li>Находим структуре запросов <code>http://1ttv.org</code> и смотрим, к каким страничкам были запросы.</li>
</ol>
<p>Смотрим как прошёл запрос:<br />
<img src="https://hms.lostcut.net/img/help/sniff/1ttvlogin_request.png" alt="request" /></p>
<p>Видим, что запрос идёт на страничку /auth.php.
Справа открываем вкладку "Request", для удобства внизу нажимаем вкладку "Raw" и смотрим все данные, которые были отосланы на сервер.</p>
<p>Тут видно, что запрос идёт методом POST, сверху видны HTTP заголовки (<code>Accept</code>, <code>Origin</code>, <code>User-Agent</code>...), последней строкой переданы данные через этот метод. В данном примере переданы данные вида: <code>email=&lt;логин&gt;&amp;password=&lt;пароль&gt;&amp;enter=%D0%92%D0%BE%D0%B9%D1%82%D0%B8</code>.</p>
<p>На стороне сервера также могут проверяться заголовки приходящих запросов, чтобы запросы шли только от их сайта или проверенных источников.
Поэтому нам тоже нужно будет в коде скрипта установить несколько заголовков: "Referer: <a href="http://1ttv.org/auth.php" target="_blank">http://1ttv.org/auth.php</a>", "Origin: <a href="http://1ttv.org" target="_blank">http://1ttv.org</a>".
Как устанавливать и передавать HTTP заголовки будет показано в коде ниже.</p>
<p>Иногда также полезно устанавливать User-Agent и другие заголовки. Зависит от конкретного случая.</p>
<p>Переключаемся на вкладку Response, чтобы посмотреть ответ на данный запрос:<br />
<img src="https://hms.lostcut.net/img/help/sniff/1ttvlogin_response.png" alt="request" /></p>
<p><div class="md_spoiler_switcher"><div class="md_spoiler_header"><strong>+</strong>&nbsp;<a href="#Смотрим_ответ_при_удачной_авторизации" name="Смотрим_ответ_при_удачной_авторизации" class="anchor" target="_blank"><span class="octicon octicon-link"></span></a>Смотрим ответ при удачной авторизации</div><div name="Смотрим_ответ_при_удачной_авторизации" class="md_spoiler"></p>
<pre><code>HTTP/1.1 302 Moved Temporarily
Date: Mon, 14 Dec 2015 08:57:16 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
Keep-Alive: timeout=60
Expires: Thu, 01 Jan 1970 00:00:01 GMT
Cache-Control: no-cache
Pragma: no-cache
Set-Cookie: PHPSESSID=92ec42ccac6d6d79c4e9f2323e55adf4; expires=Tue, 15-Dec-2015 08:57:15 GMT
Location: http://1ttv.org/cabinet.php
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block;
Server: ddos-guard.net
</code></pre>
<p></div></div></p>
<p>Тут первой строчкой видно, что в ответ приходит редирект (перенаправление) с кодом 302 Moved Temporarily. У ответов перенаправления с кодами 3xx должен быть установлен  заголовок Location, в данном случае его значение: <code>http://1ttv.org/cabinet.php</code></p>
<p>Тут же идёт установка значения Cookie. <strong>Вот это то значение нам и понадобится</strong>. </p>
<p><em>Надо сразу сказать, что тут простейший пример авторизации. В других случаях, нужно также брать не только cookie (и не обязательно их), но и другие установленные заголовки. Какие именно заголовки и значения проверяются на сервере, сразу сказать невозможно. Поэтому может потребоваться эксперименты с их установкой. В крайнем случае, вообще всё полностью повторять, как это происходит в браузере (устанавливать напрочь все заголовки).</em></p>
<p>Итого, мы посмотрели как происходит успешная авторизация через браузер и получили все данные для этого нужные.</p>
<h3><a href="#Подготовка_хитрого_плана" name="Подготовка_хитрого_плана" class="anchor" target="_blank"><span class="octicon octicon-link"></span></a>Подготовка хитрого плана</h3>
<p>Итак, у нас есть данные, которые нужно отправить в запросе на сервер. Нужно будет установить HTTP заголовки, как минимум:
<code>Referer: http://1ttv.org/auth.php</code>, <code>Origin: http://1ttv.org</code>.
Страница авторизации: <code>/auth.php</code>. Метод запроса должен быть <code>POST</code> и передать данные POST запроса.</p>
<p>Т.е. план такой:  </p>
<ol>
<li>Сделать POST запрос на страничку <a href="http://1ttv.org/auth.php" target="_blank">http://1ttv.org/auth.php</a> с переданными данными email=...&amp;password=...&amp;enter=%D0%92%D0%BE%D0%B9%D1%82%D0%B8</li>
<li>Перехватить ответ перенаправления и получить HTTP заголовки ответа</li>
<li>Взять оттуда значение cookie. Которое потом в следующих запросах в коде скрипта везде подставлять в Headers (в заголовки при запросе страниц сайта).</li>
</ol>
<p>Сделать запрос мы можем функцией</p>
<pre><code>HmsSendRequestEx('1ttv.org', '/auth.php', 'POST', 'application/x-www-form-urlencoded', sHeaders, sPost, 80, iFlags, sAnswHeaders, true);
</code></pre>
<p>Где переменные: <strong>sHeaders</strong> - будет содержать установленные заголовки ("Referer: ...", "Origin: ..."), <strong>sPost</strong> - данные POST запроса ("email=..."), <strong>iFlags</strong> - флаг настроек для избежания автоматического перенаправления (о нём в пояснениях ниже), <strong>sAnswHeaders</strong> - а в эту переменную будут получены заголовки ответа от сервера, где можно выудить интересную информацию - установку Cookies.</p>
<p>Вычленить нужное значение из заголовков ответа sAnswHeaders можно командой</p>
<pre><code>HmsRegExMatch('(PHPSESSID=.*?);', sAnswHeaders, sCookie);
</code></pre>
<p>Которая, в случае успеха, по регулярному выражению найдёт в заголовках ответа sAnswHeaders значение PHPSESSID и занесёт его в переменную sCookie.</p>
<h3><a href="#Написание_кода_авторизации" name="Написание_кода_авторизации" class="anchor" target="_blank"><span class="octicon octicon-link"></span></a>Написание кода авторизации</h3>
<p>Для этого, я бы написал отдельную функцию, которую можно было бы вызывать, например, из главной процедуры.
<div class="md_spoiler_switcher"><div class="md_spoiler_header"><strong>+</strong>&nbsp;<a href="#Код_функции_авторизации_на_1ttvorg" name="Код_функции_авторизации_на_1ttvorg" class="anchor" target="_blank"><span class="octicon octicon-link"></span></a>Код функции авторизации на 1ttv.org</div><div name="Код_функции_авторизации_на_1ttvorg" class="md_spoiler"></p>
<pre><code>Function Login1TTV(): Boolean;
Var
  sName, sUser, sPass, sPost, sHeaders, sAnswHeaders, sCookie: String;
  iFlags: Integer;
Begin 
  sHeaders := 'http://1ttv.org/auth.php'+#10#13+
              'Origin: http://1ttv.org'+#10#13;
  iFlags := $00200000; // INTERNET_FLAG_NO_AUTO_REDIRECT=0x00200000
  sUser  := HmsPercentEncode(HmsUtf8Encode(mpPodcastAuthorizationUserName));
  sPass  := HmsPercentEncode(HmsUtf8Encode(mpPodcastAuthorizationPassword));
  sPost  := 'email='+sUser+'&amp;password='+sPass+'&amp;enter=%D0%92%D0%BE%D0%B9%D1%82%D0%B8';
  HmsSendRequestEx('1ttv.org', '/auth.php', 'POST', 'application/x-www-form-urlencoded', sHeaders, sPost, 80, iFlags, sAnswHeaders, true);
  Result := HmsRegExMatch('(PHPSESSID=.*?);', sAnswHeaders, sCookie);
  If Result Then 
    gsHeaders := gsHeaders+'Cookie: '+sCookie+#10#13
  Else 
    HmsLogMessage(2, "Ошибка авторизации на 1ttv.org");
End;
</code></pre>
<p></div></div></p>
<h5><a href="#А_теперь_пояснения_к_коду" name="А_теперь_пояснения_к_коду" class="anchor" target="_blank"><span class="octicon octicon-link"></span></a>А теперь пояснения к коду</h5>
<p>Сначала объявляются переменные, которые будут использоваться в функции (всё что перечисляется после ключевого слова <strong>Var</strong>).</p>
<pre><code>Var
  sName, sUser, sPass, sPost, sHeaders, sAnswHeaders, sCookie: String;
  iFlags: Integer;
</code></pre>
<p>Потом в переменную <strong>sHeaders</strong> устанавливаем HTTP заголовки, которые мы будем передавать при запросе. Заголовки разделяются знаками перевода строк и каретки - #10#13.</p>
<pre><code>  sHeaders := 'http://1ttv.org/auth.php'+#10#13+
              'Origin: http://1ttv.org'+#10#13;
</code></pre>
<p>В переменную <strong>iFlags</strong> заносим значение флага <a href="https://msdn.microsoft.com/en-us/library/windows/desktop/aa383661(v=vs.85).aspx" target="_blank">INTERNET_FLAG_NO_AUTO_REDIRECT</a>, чтобы ответ пришёл ДО перенаправления.</p>
<p>Указать метод запроса (POST) и получить заголовки ответа можно только функцией HmsSendRequestEx.</p>
<p>И ещё раз. Параметры функции HmsSendRequestEx:  </p>
<ol>
<li><strong>'1ttv.org'</strong> - сервер, куда отправляется запрос. Указывается без протокола (http и проч) и страниц.</li>
<li><strong>'/auth.php'</strong> - страница запроса. Указывается без сервера. Могут быть после знака '?' указывать параметры для GET запроса.</li>
<li><strong>'POST'</strong> - метод запроса. (Могут быть 'GET', 'POST', 'HEAD', 'PUT', 'DELETE')</li>
<li><strong>'application/x-www-form-urlencoded'</strong> - тип запрашиваемого контента. Может принимать значения MIME типа.</li>
<li><strong>sHeaders</strong> - Referer + могут быть указаны дополнительные HTTP заголовки, разделённые знаками #10#13 (0x0A 0x0D или '\r\n')</li>
<li><strong>80</strong> - порт. Обычно для http порт 80, для https - 443</li>
<li><strong>iFlags</strong> - интернет флаги. Список значений можно посмотреть <a href="https://msdn.microsoft.com/en-us/library/windows/desktop/aa383661(v=vs.85).aspx" target="_blank">здесь</a> (если забыли ссылку, гуглить "internet flags")</li>
<li><strong>sAnswHeaders</strong> - переменная, которая будет содержать HTTP заголовки <strong>ответа</strong>. Очень для нас важный параметр.</li>
<li><strong>true</strong> - флаг, указывающий автоматически определять запакованные ответы и распаковывать их (например, если в заголовках было указана поддержка сжатия данных Accept-Encoding: gzip, deflate)</li>
</ol>
<p>Обычно, при запросе страниц их перенаправление происходит автоматически и в ответе мы получаем уже данные <strong>после</strong> перенаправления. Поэтому, чтобы указать, чтобы ответ пришел без автоматического перенаправления, мы используем флаг INTERNET_FLAG_NO_AUTO_REDIRECT и указываем его значение в переменной iFlags.</p>
<p>Функция возвращает загруженные данные (страницы), но в данном случае нам это не нужно и мы тут анализируем только HTTP заголовки ответов, которые появляются в sAnswHeaders после запроса.</p>
<p>Оттуда мы командной </p>
<pre><code>Result := HmsRegExMatch('(PHPSESSID=.*?);', sAnswHeaders, sCookie);
</code></pre>
<p>получаем значение cookie PHPSESSID и запоминаем в переменной sCookie.<br />
Полученное значение sCookie мы добавляем к глобальной переменной gsHeaders, которая будет передаваться всем запросам для загрузки страниц в дальнейшем.</p>
<pre><code> gsHeaders := gsHeaders+'Cookie: '+sCookie+#10#13
</code></pre>
<p>Значит, нам нужно в главной процедуре, установить значение глобальной gsHeaders. Если установлено имя пользователя в подкасте, сделать вызов нашей функции авторизации на сайте Login1TTV(), где, если всё успешно, к gsHeaders будут добавлены нужные заголовки (тут "Cookie: PHPSESSID=...") и в дальнейшем во всех функциях загрузки страниц мы можем указывать gsHeaders.</p>
<p>Для того, чтобы приведённый выше код работал в подкасте для <a href="https://hms.lostcut.net/viewtopic.php?pid=2578#p2578" target="_blank">1ttv</a>, нужно в коде скрипта по Alt+2 в самом вверху после ключевого слова Var объявить также глобальную переменную gsHeaders</p>
<pre><code>var
  gsHeaders: String;
</code></pre>
<p>А в главной процедуре можно сделать примерно так:</p>
<pre><code>  gsHeaders := 'Referer: '+mpFilePath+#10#13+
               'Origin: http://1ttv.org'+#10#13+
               'Accept-Encoding: gzip, deflate'+#10#13+
               'User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36'+#10#13;

  If mpPodcastAuthorizationUserName&lt;&gt;'' Then Login1TTV();
  
  sWebPage := HmsDownloadURL(mpFilePath, gsHeaders, True);
  if (Pos('film_selector.php', sPage)&gt;1) then
    for i := 2 to 20 do  sWebPage := sWebPage+HmsDownloadURL(mpFilePath+'&amp;page='+IntToStr(i), gsHeaders, True);
  sWebPage := HmsUtf8Decode(sWebPage);
  sWebPage := HmsRemoveLineBreaks(sWebPage);
</code></pre>
<p><strong>Заметьте</strong>, в функции HmsDownloadURL вторым параметром мы указываем глобальную переменную <strong>gsHeaders</strong>, которая, кроме установленных заголовков, после нашей функции <code>Login1TTV()</code> будет содержать полученную и добавленную cookie, которая будет говорить сайту, что мы на самом деле авторизованные пользователи.</p>
</div></div><p>Что не понятно и глупые вопросы можно задавать тут.</p>]]></content>
			<author>
				<name><![CDATA[WendyH]]></name>
				<uri>https://hms.lostcut.net/profile.php?id=2</uri>
			</author>
			<updated>2015-12-14T11:03:11Z</updated>
			<id>https://hms.lostcut.net/viewtopic.php?pid=2584#p2584</id>
		</entry>
</feed>
