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

<channel>
	<title>Insight IT &#187; защита интернет-ресурсов</title>
	<atom:link href="http://www.insight-it.ru/tag/zashhita-internet-resursov/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.insight-it.ru</link>
	<description>Информационные технологии</description>
	<lastBuildDate>Tue, 31 Jan 2012 09:34:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Обратного пути нет</title>
		<link>http://www.insight-it.ru/programmirovanie/kriptografiya/obratnogo-puti-net/</link>
		<comments>http://www.insight-it.ru/programmirovanie/kriptografiya/obratnogo-puti-net/#comments</comments>
		<pubDate>Fri, 01 Feb 2008 12:43:17 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Криптография]]></category>
		<category><![CDATA[encrypt]]></category>
		<category><![CDATA[hash]]></category>
		<category><![CDATA[защита интернет-ресурсов]]></category>
		<category><![CDATA[информационные технологии]]></category>
		<category><![CDATA[коллизия]]></category>
		<category><![CDATA[хэш]]></category>
		<category><![CDATA[хэширование]]></category>
		<category><![CDATA[шифрование]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/science/kriptografiya/obratnogo-puti-net/</guid>
		<description><![CDATA[&#8230;или введение в хэширование Под таким неоднозначным заголовком я решил разместить всеголишь повествование о такой неотъемлимой части криптографии как hash-функции и алгоритмы. Не думаю, что многим из читателей будет интересен этот вопрос с математической точки зрения, а также сомневаюсь что смогу достаточно качественно осветить его в этой перспективе, так что позволю сделать более &#34;приземленный&#34; обзор [...]]]></description>
			<content:encoded><![CDATA[<h3 style="text-align: right;">&hellip;или введение в хэширование</h3>
<p>Под таким неоднозначным заголовком я решил разместить всеголишь повествование о такой неотъемлимой части криптографии как hash-функции и алгоритмы.</p>
<p>Не думаю, что многим из читателей будет интересен этот вопрос с математической точки зрения, а также сомневаюсь что смогу достаточно качественно осветить его в этой перспективе, так что позволю сделать более &quot;приземленный&quot; обзор возможных технологии хэширования.</p>
<p><span id="more-34"></span></p>
<h3>Введение</h3>
<p>Под словом <em>хэширование</em> обычно понимают процесс преобразования данных произвольной длины в двоичную строку фиксированной длины. Происходит он с помощью  хэш-функций, которые, в свою очередь, реализуют соответствующие им алгоритмы. Таких алгоритмов и, соответственно, функций существует достаточно много, каждый из них обладает своими свойствами, преимуществами и недостатками.</p>
<p>Общим фактом для всех хэш-функций является отсутствие <em>обратной</em> функции, то есть функции, однозначно преобразующей полученное значение (которое как раз принято называть словом <em>хэш</em> или <em>hash</em>) обратно в исходное. Факт этот достаточно очевиден &#8212; если бы любой объем информации можно было бы преобразовать в достаточно небольшого фиксированного размера, не зависящего от исходного объема данных, двоичную строку и при этом иметь возможность восстановить по ней исходную информацию, то это, как минимум, стало бы революцией в сфере хранения и архивирования данных.</p>
<h3>Свойства</h3>
<p>Далеко не все хэш-функции применимы в криптографии, именно из-за того, что, как Вы возможно уже знаете из <a href="/science/kriptografiya/bezopasnoe-obshhenie">предыдущей записи о криптографии</a>, основной целью криптографии изначально являлось сокрытие информации, а для ее обеспечения необходимо обладание алгоритмом хэширования рядом свойств, обеспечивающих защиту от потенциальных атак, то есть попыток раскрыть с тои или иной степенью точности исходные данные по имеющемуся хэшу.</p>
<h4>Устойчивость к коллизиям</h4>
<dl>
<dt><strong>Коллизия</strong></dt>
<dd>&ndash; пара различных прообразов, для которых значение хэша совпадает.</dd>
</dl>
<p>Устойчивость к возникновению коллизий заключается в том, что <strong>никто</strong> не может найти такую пару исходных строк, которая имела бы один и тот же хэш.</p>
<p>Если  взглянуть на это свойство с точки зрения обычного образованного человека, то нетрудно заметить, что возможных вариантов исходных данных практически бесконечное количество, а возможных хэшей &#8212; лишь 2 в степени фиксированной длины хэша. Из чего было бы логичным сделать вывод о том, что такие пары существуют. Но, как ни странно для всех криптографических алгоритмов, такие пары все еще кем-либо не найдены.</p>
<p>Единственный возможный способ найти такие пары &#8212; вычислить с помощью компьютера, сложно дать какое-либо четкое доказательство почему <em>человек</em> не в состоянии самостоятельно обнаружить коллизию, но тем не менее это так. Если не верите на слово &#8212; можете попробовать заняться этим сами в отношении хотябы самых простых и распространенных алгоритмов, например <strong>md5</strong>.</p>
<p>Обнаружение коллизий с помощью специализированных программ в большинстве случаев не является сложной задачей и ограниченно лишь вычислительной мощностью используемых компьютеров или кластеров. Так как рост производительность современных вычислительных систем растет семимильными шагами, требования к устойчивости хэширующим алгоритмам растут ничуть не меньшими темпами.</p>
<p>В научной литературе принята своеобразная классификация алгоритмов хэширования по устойчивости к обнаружению коллизий типов:</p>
<dl>
<dt><em>Первый тип</em></dt>
<dd>заключается в том, что при фиксированном первой двоичной строке &#8212; невозможно подобрать к ней вторую с таким же хэшем.</dd>
<dt><em>Второй тип</em></dt>
<dd>отличается от первого тем, что обнаружение коллизии невозможно и для произвольной пары сообщений.</dd>
</dl>
<h4>Однонаправленность</h4>
<p>Это свойство заключается в отсутствии возможности <em>эффективно</em> вычислить прообраз по хэшу и прямо вытекает из предыдущего свойства, для подтверждения этого факта существует вполне конкретное математическое доказательство, но приводить его здесь я, с Вашего позволения, не буду. Одного факта устойчивости к коллизиям недостаточно для утверждения, что алгоритм обладает свойством однонаправленности, но, как известно, большинство криптографических алгоритмов хэширования им обладают. Упомянутое выше доказательство базируется как раз на попытке воспроизведения действий потенциального злоумышленника, пытающегося опровергнуть однонаправленность алгоритма с помощью нахождения &quot;обратного пути&quot; от хэша к прообразу, и доказательства обреченности его попыток на провал.</p>
<h4>Кардинальное изменение хэша при незначительном изменении оригинала</h4>
<p>Еще одно не совсем очевидное свойств, связанное с предыдущими. Если бы хэши от отличающихся на допустим один бит прообразов практически полностью совпадали, то этот факт сильно упрощал бы вычисление возможных коллизий и, как следствие (или причина?), нарушало бы устойчивость к ним.</p>
<h3>Применение</h3>
<p>На практике криптографические хэширующие функции имеет несколько вариантов применения, вот основные из них:</p>
<ul>
<li><strong>Хранение аутентификационных данных пользователей сайтов или программных продуктов.</strong> В случае чисто теоретически возможной ошибки программистов или каких-либо других людей или просто имея доступ к базе данных на том или ином основании, потенциальный злоумышленник может получить доступ к закрытым компонентам того или иного проекта, в том числе и к базе данных пользователей. Если такого рода данные хранились бы в открытом виде, он получил бы полный доступ ко всем учетным записям пользователей. Для избежания возможности возникновения подобной ситуации принято хранить не сами логин и пароль пользователей, а их хэши. В этом случае для аутентификации введенные пользователем данные пропускаются через тот же алгоритм хэширования и полученный хэш сравнивается с хранящимся в БД.</li>
<li><strong>Проверка целостности копии данных.</strong> Чаще всего этот способ проверки соответствия копии оригиналу используется в отсутствии доступа к оригиналу. В качестве примера можно привести передачу больших объемов информации через ненадежное пространство (чаще всего Интернет), многие файловые серверы хранят рядом с большими файлами вычисленные от них хэши с использованием популярных алгоритмов, посетитель, скачав файл, может убедиться в его соответствии оригиналу, просто вычислив такой же хэш от копии и сравнив с доступным хэшем от оригинала. Но такой же принцип может использоваться и при доступном оригинале, например, многие программы для прожига образов на компакт-диски используют схожий принцип для проверки соответствия полученного диска образу.</li>
</ul>
<p>Если же слегка отвлечься от криптографии, то можно найти еще достаточно большое количество вариантов применения хэш-функций, таких как хэш-таблицы, генерация псевдо-случайных чисел, поиск текста и многие другие.</p>
<h4>Заключение</h4>
<p>Надеюсь сегодня мне успешно удалось осветить еще один компонент науки под названием криптография, в обозримом будущем я планирую написать несколько записей на эту же тему, но более практического характера, не пропустить момент их публикации вам поможет <a target="_blank" href="/feed">подписка на RSS-ленту моего блога</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/programmirovanie/kriptografiya/obratnogo-puti-net/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Защита интернет-ресурсов в картинках</title>
		<link>http://www.insight-it.ru/programmirovanie/php/zashhita-internet-resursov-v-kartinkax/</link>
		<comments>http://www.insight-it.ru/programmirovanie/php/zashhita-internet-resursov-v-kartinkax/#comments</comments>
		<pubDate>Sun, 13 Jan 2008 19:30:00 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[captcha]]></category>
		<category><![CDATA[OCR]]></category>
		<category><![CDATA[online]]></category>
		<category><![CDATA[защита интернет-ресурсов]]></category>
		<category><![CDATA[интернет]]></category>
		<category><![CDATA[класс]]></category>
		<category><![CDATA[код]]></category>
		<category><![CDATA[кодинг]]></category>
		<category><![CDATA[ООП]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/programming/php/zashhita-internet-resursov-v-kartinkax/</guid>
		<description><![CDATA[Этой статьей мне хотелось бы открыть мою первую серию статей &#34;Джентельменский набор PHP программиста&#34;. Как и во всей остальной серии здесь пойдет речь о программировании на PHP для интернет-проектов, но в каждой статье я буду выбирать один узкий аспект и на протяжении всей статьи буду стараться показать возможные варианты его реализации и применения. Сегодня таким [...]]]></description>
			<content:encoded><![CDATA[<p>Этой статьей мне хотелось бы открыть мою первую <a href="/dzhentelmenskij-nabor-php-programmista/" target="_blank">серию статей &quot;Джентельменский набор PHP программиста&quot;</a>. Как и во всей остальной серии здесь пойдет речь о программировании на PHP для интернет-проектов, но в каждой статье я буду выбирать один узкий аспект и на протяжении всей статьи буду стараться показать возможные варианты его реализации и применения.</p>
<p>Сегодня таким аспектом станет защита интернет-ресурса от возможного возникновения нежелательного контента со стороны пользователей с помощью технологии captcha (точнее о &quot;графическом&quot; варианте ее реализации), о которой уже <a href="/net/otkuda-voznikaet-spam-i-kak-s-nim-borotsya/" target="_blank">неоднократно шла речь</a>.</p>
<p><span id="more-23"></span></p>
<p>Начать имеет смысл с небольшого напоминания о принципе работы этой технологии: перед потенциальным посетителем ставится некое препятствие, которое ему необходимо преодолеть для  продолжения работы с интернет-ресурсом. Существует множество <a target="_blank" href="/net/7-sposobov-zashhitit-svoj-internet-resurs-ot-nezhelatelnoj-informacii/">вариантов такого рода препятствий</a>. Как уже упоминалось, сегодня мы будем реализовывать только один наиболее распространенный тип &#8212; &quot;графический&quot;. В простейшем случае он представляет собой просьбу переписать с изображения некий набор символов. В процессе генерирования изображения, символы сильно искажаются с целью предотвращения возможности их распознавания любой программой с помощью технологии OCR.</p>
<h3>Подготовка</h3>
<p>Прежде чем начать писать код стоит более детально осознать какая же цель перед нами стоит: нам необходимо написать скрипт, генерирующий искаженное изображение некоторого набора символов и незаметно для пользователя передающее этот набор какому-либо другому скрипту, который нас пока мало интересует, но ясно лишь, что собственно проверкой будет заниматься именно он на основе данных полученных от пользователя и нашего скрипта. Способов исказить текст существует огромное количество, в ходе написания статьи постараюсь упомянуть несколько самых эффективных и широкоиспользуемых из них.</p>
<p>В первую очередь стоит подготовить некий каркас кода, который мы будем впоследствии заполнять. Он будет состоять из двух частей:</p>
<ol>
<li>Описание класса, генерирующего изображение</li>
<li>Файл, который будет вызываться browser&#8217;ом. В нем будет подключено описание нашего класса, выбор настроек данного конкретного изображения и выполнено создание объекта класса, в соответствии с выбранными настройками.</li>
</ol>
<p>Для начала давайте определимся со списком параметров, которые будет иметь наш класс. Во-первых, нужно решить какой текст будет генерироваться, самый простой и распространенный вариант &#8212; просто четыре цифры, я в примере на нем и остановлюсь, а реально же можно использовать абсолютно любые приходящие в голову варианты. Во-вторых, размеры изображения и текста &#8212; их лучше подобрать фиксированными так, чтобы было максимально читабельно, при минимальных размерах изображения, но при желании можно сделать и возможность изменения их извне. Последним в списке параметров будет цвет фона и текста &#8212; их как раз лучше задавать вне класса, так как основным действием, необходимым при переносе этого скрипта с одного сайт на другой &#8212; подбор используемых цветов таким образом, чтобы изображение смотрелось не очень ужасно при текущем варианте дизайна, изменения в других параметрах требуются на порядок реже.</p>
<p>Итак, создание объекта будем производить максимально простым способом, параметрами укажем белый и черный цвета.</p>
<pre lang="php">
<?php
require_once('captcha.class.php');	// указываем правильный путь к описанию класса
new Captcha(array(255,255,255),array(0,0,0));
?>
</pre>
<p style="font-size: 75%;">(для удобного чтения таких вставок исходного кода достаточно нажать на нее один раз левой кнопкой мыши и использовать стрелки &larr; и &rarr; на клавиатуре)</p>
<p>Заготовка для самого класса будет выглядеть примерно следующим образом (предположим, что он хранится в файле <u>captcha.class.php</u>):</p>
<pre lang="PHP">
<?php
class Captcha
{
   private $string;	// генерируемый текст
   private $bgcol;	// основной цвет фона
   private $fgcol;	// основной цвет текста
   private $height;	// высота изображения
   private $width;	// ширина изображения
   function __construct($bgcol,$fgcol)  // конструктор, вызывается при создании экземпляра класса
   {

   }
}
?>
</pre>
<h3>Задаем параметры</h3>
<p>Первым делом при создании объекта необходимо задать остальные параметры, размеры изображения можно указать прямо в конструкторе, а для генерации текста лучше написать отдельную функцию:</p>
<pre lang="PHP">
<?php
class Captcha
{
   private $string;	// генерируемый текст
   private $bgcol;	// основной цвет фона
   private $fgcol;	// основной цвет текста
   private $height;	// высота изображения
   private $width;	// ширина изображения
   function __construct($bgcol,$fgcol)  // конструктор, вызывается при создании экземпляра класса
   {
	$this->width=250;
	$this->height=80;
	$this->fgcol=$fgcol;
	$this->bgcol=$bgcol;
	$this->generateSymbols();
   }
   private function generateSymbols()   // генерация четырех цифр
   {
      $this->string=$this->leadingZero(rand()%10000,4);
   }
   private function leadingZero($num,$length) // дополнения числа num лидирующими нулями
   {						// до длины length
	$str=strrev($num);
	for($i=strlen($str);$i<$length;++$i)$str.="0";
	return strrev($str);
   }
}
?>
</pre>
<p>Этих данных нам должно хватить для написания функции, генерирующей изображение.</p>
<h3>Генерируем изображение</h3>
<p>Если забыть, что текст необходимо искажать, то функция, генерирующая изображение выглядела бы просто как:</p>
<pre lang="PHP">
private function generateImage()  // генерация изображения
{
   $im=@imagecreatetruecolor($this->width,$this->height);
   $bcol=imagecolorallocate($im,$this->bgcol[0],$this->bgcol[1],$this->bgcol[2]);
   $fcol=imagecolorallocate($im,$this->fgcol[0],$this->fgcol[1],$this->fgcol[2]);
   imagefill($im,0,0,$bcol);
   imagettftext($im,40,10,20,25,$fcol,"./font/font_name.ttf",$this->string));
   header('Content-Type: image/png');
   imagepng($im);
   imagedestroy($im);
}
</pre>
<p><span style="background-color: Yellow;">В данном методе используются функции модуля PHP под названием GD, основывающегося на одноименной библиотеке, убедитесь, что на Вашем хостинге этот модуль установлен.</span></p>
<p>Реально же ей пользоваться не стоит &#8212; такое изображение с легкостью поддается OCR. Полученный текст необходимо тем или иным образом исказить. Для вывода изображения используется формат PNG, но никто не мешает воспользоваться JPEG или GIF, для этого достаточно заменить везде png на название соответствующего формата.</p>
<h3>Искажаем текст</h3>
<p>Вот списочек тех, способов искажения текста, которыми я буду пользоваться в примере, пользоваться всеми сразу естественно никто не заставляет, да и включив воображение можно придумать много модификаций приведенных мной способов или абсолютно других:</p>
<ul>
<li><i>использование нестандартных шрифтов</i> &#8212; функция imagettftext позволяет использовать произвольный шрифт в формате Truetype, чем и необходимо воспользоваться. В Сети можно найти огромное количество бесплатных шрифтов в этом формате. По возможности стоит выбирать шрифты, максимально не похожие на любой стандартный, но при этом легко читающиеся.</li>
<li><i>использование нескольких шрифтов</i> &#8212; сделав подборку подходящих шрифтов, можно не останавливаться на каком-то одном, а сделать выбор текущего шрифта случайным из списка.</li>
<li><i>случайный выбор цветов</i> &#8212; усложняет работу OCR и в большинстве случаев не сильно мешает восприятию человеком.</li>
<li><i>случайное расположение символов</i> &#8212; еще один способ усложнить работу программам, пытающимся прочитать текст.</li>
<li><i>неравномерный фон</i> &#8212; изобразив на фоне какой-либо абстрактный набор любых фигур, можно заставить программу-посетителя подумать что какая-то часть из них является символом. Например, пересечение двух прямых линий часто распознается как буква T или L. Неплохим вариантом является написание на фоне других символов другим цветом, сильно отличающимся от основного и близким к цвету фона.</li>
</ul>
<p>Для начала этого вполне хватит, перейдем к реализации, в комментариях постараюсь указывать все особенности:</p>
<pre lang="PHP">
private function generateImage() // генерация изображения
{
   $im=@imagecreatetruecolor($this->width,$this->height);  // создаем пустое изображение
   $mcol=imagecolorallocate($im,$this->fgcol[0]+rand()%100+80,$this->fgcol[1]+rand()%30+150,$this->fgcol[2]-rand()%55); // выбираем случайным образом
   $kcol=imagecolorallocate($im,$this->fgcol[0]+rand()%100+80,$this->fgcol[1]+rand()%30+150,$this->fgcol[2]-rand()%20); // несколько цветов
   $lcol=imagecolorallocate($im,$this->bgcol[0]-rand()%20,$this->bgcol[1]-rand()%20,$this->bgcol[2]-rand()%20);
   $bcol=imagecolorallocate($im,$this->bgcol[0],$this->bgcol[1],$this->bgcol[2]);
   $fcol=imagecolorallocate($im,$this->fgcol[0],$this->fgcol[1],$this->fgcol[2]);
   imagefill($im,0,0,$bcol);  // заполняем изображение фоном
   $array=array(6,7,6,6,20,20,25,26,31,32,37,39,41); // список названий подходящих шрифтов
   $n=$array[rand()%count($array)];  // наугад выбираем из них один
   $m=rand()%50+1;
   $k=rand()%50+1;
   for($i=0;$i<$m;++$i)
   imageline($im,0,rand()%$this->height,$this->width,rand()%$this->height,$lcol); // создаем на фоне несколько линий
   for($i=0;$i<$k;++$i)
   imageline($im,rand()%$this->width,0,rand()%$this->width,$this->height,$lcol); // и еще несколько
   /*
   Генерируем текст: две строки на фон, а также интересующие нас символы по одному.
   */
   imagettftext($im,rand()%20+40,rand()%100-50,rand()%$this->height*0.8,rand()%50+25,$kcol,"./font/".$k.".ttf",$this->randomString(rand()%15));
   imagettftext($im,rand()%40+35,rand()%70-35,rand()%$this->height*0.8,rand()%25+25,$mcol,"./font/".$m.".ttf",$this->randomString(5+rand()%4));
   for($i=0;$i<strlen($this->string);++$i)
   imagettftext($im,rand()%10+33,rand()%70-35,15+$i*$this->width/5*1.1+rand()%5,rand()%7+$this->height*0.73,$fcol,"./font/".$n.".ttf",$this->string[$i]);
   for($i=0;$i<$m/10;++$i)
   imageline($im,0,rand()%$this->height,$this->width,rand()%$this->height,$mcol); // еще линии
   for($i=0;$i<$k/4;++$i)
   imageline($im,rand()%$this->width,0,rand()%$this->width,$this->height,$mcol);  // и еще немного
   for($i=0;$i<$k/6;++$i)
   imageline($im,rand()%$this->width,0,rand()%$this->width,$this->height,$fcol);  // и еще чуть-чуть
   header('Content-Type: image/png');
   imagepng($im);
   imagedestroy($im);
}
private function randomString($length)  // генерируем случайный набор символов заданной длины
{
  $list="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVXYZ!@#$%^&#038;**()-=_+.,<>/\|;:";
  for($i=0,$str="";$i<$length;++$i)$str.=substr($list,mt_rand(0,strlen($list)-1),1);
  return $str;
}
</pre>
<p>Стоит заметить, что конкретные цифры необходимо подбирать индивидуально, в примере они указаны абсолютно произвольно. Использование конкретно этих же цифр приведет к далеко не самым лучшим результатам.</p>
<h3>Сборка</h3>
<p>Не стоит забывать, что помимо генерации самого изображения, необходимо передать написанный текст другому скрипту, который будет сверять данные. Удобнее всего это делать через глобальный массив <span style="color: rgb(0, 0, 255);">$_SESSION</span>.</p>
<p>Собрав все написанное выше, и учтя передачу текста, можно получить следующий класс:</p>
<pre lang="PHP">
class Captcha
{
   private $string;	// генерируемый текст
   private $bgcol;	// основной цвет фона
   private $fgcol;	// основной цвет текста
   private $height;	// высота изображения
   private $width;	// ширина изображения
   function __construct($bgcol,$fgcol)  // конструктор, вызывается при создании экземпляра класса
   {
      $this->width=250;
      $this->height=80;
      $this->fgcol=$fgcol;
      $this->bgcol=$bgcol;
      $this->generateSymbols();
      $this->generateImage();
   }
   private function generateImage() // генерация изображения
   {
      $im=@imagecreatetruecolor($this->width,$this->height);  // создаем пустое изображение
      $mcol=imagecolorallocate($im,$this->fgcol[0]+rand()%100+80,$this->fgcol[1]+rand()%30+150,$this->fgcol[2]-rand()%55); // выбираем случайным образом
      $kcol=imagecolorallocate($im,$this->fgcol[0]+rand()%100+80,$this->fgcol[1]+rand()%30+150,$this->fgcol[2]-rand()%20); // несколько цветов
      $lcol=imagecolorallocate($im,$this->bgcol[0]-rand()%20,$this->bgcol[1]-rand()%20,$this->bgcol[2]-rand()%20);
      $bcol=imagecolorallocate($im,$this->bgcol[0],$this->bgcol[1],$this->bgcol[2]);
      $fcol=imagecolorallocate($im,$this->fgcol[0],$this->fgcol[1],$this->fgcol[2]);
      imagefill($im,0,0,$bcol);  // заполняем изображение фоном
      $array=array(6,7,6,6,20,20,25,26,31,32,37,39,41); // список названий подходящих шрифтов
      $n=$array[rand()%count($array)];  // наугад выбираем из них один
      $m=rand()%50+1;
      $k=rand()%50+1;
      for($i=0;$i<$m;++$i)
      imageline($im,0,rand()%$this->height,$this->width,rand()%$this->height,$lcol); // создаем на фоне несколько линий
      for($i=0;$i<$k;++$i)
      imageline($im,rand()%$this->width,0,rand()%$this->width,$this->height,$lcol); // и еще несколько
      /*
      Генерируем текст: две строки на фон, а также интересующие нас символы по одному.
      */
      imagettftext($im,rand()%20+40,rand()%100-50,rand()%$this->height*0.8,rand()%50+25,$kcol,"./font/".$k.".ttf",$this->randomString(rand()%15));
      imagettftext($im,rand()%40+35,rand()%70-35,rand()%$this->height*0.8,rand()%25+25,$mcol,"./font/".$m.".ttf",$this->randomString(5+rand()%4));
      for($i=0;$i<strlen($this->string);++$i)
      imagettftext($im,rand()%10+33,rand()%70-35,15+$i*$this->width/5*1.1+rand()%5,rand()%7+$this->height*0.73,$fcol,"./font/".$n.".ttf",$this->string[$i]);
      for($i=0;$i<$m/10;++$i)
      imageline($im,0,rand()%$this->height,$this->width,rand()%$this->height,$mcol); // еще линии
      for($i=0;$i<$k/4;++$i)
      imageline($im,rand()%$this->width,0,rand()%$this->width,$this->height,$mcol);  // и еще немного
      for($i=0;$i<$k/6;++$i)
      imageline($im,rand()%$this->width,0,rand()%$this->width,$this->height,$fcol);  // и еще чуть-чуть
      header('Content-Type: image/png');
      imagepng($im);
      imagedestroy($im);
   }
   private function generateSymbols()   // генерация четырех цифр
   {
      $this->string=$this->leadingZero(rand()%10000,4);
   }
   private function leadingZero($num,$length) // дополнения числа num лидирующими нулями
   {						// до длины length
      $str=strrev($num);
      for($i=strlen($str);$i<$length;++$i)$str.="0";
      return strrev($str);
   }
   private function randomString($length)  // генерируем случайный набор символов заданной длины
   {
      $list="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVXYZ!@#$%^&#038;**()-=_+.,<>/\|;:";
      for($i=0,$str="";$i<$length;++$i)$str.=substr($list,mt_rand(0,strlen($list)-1),1);
      return $str;
   }
}
</pre>
<p>Слегка доработав его и приведя в более подходящий вид, можно добиться генерации изображений, выглядящих например вот так:</p>
<p> <img style="margin: 6px; float: left;" title="Пример получающегося изображения" alt="CAPTCHA Sample" src="/wp-content/uploads/captcha-sample.png" />
<p>Специально не выкладываю уже доведенный до ума класс, чтобы у читателей не возникало желания просто взять и воспользоваться им, это приведет лишь к очередной серии captcha-клонов.</p>
<p>Для Вашего удобства предлагаю скачать используемые в примере <a href="/wp-content/uploads/source/captcha.class.phps">код класса</a> и <a href="/wp-content/uploads/source/captcha.phps">код вызываемого browser'ом файла</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/programmirovanie/php/zashhita-internet-resursov-v-kartinkax/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>7 способов защитить свой интернет-ресурс от нежелательной информации</title>
		<link>http://www.insight-it.ru/set/7-sposobov-zashhitit-svoj-internet-resurs-ot-nezhelatelnoj-informacii/</link>
		<comments>http://www.insight-it.ru/set/7-sposobov-zashhitit-svoj-internet-resurs-ot-nezhelatelnoj-informacii/#comments</comments>
		<pubDate>Thu, 03 Jan 2008 17:41:44 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Сеть]]></category>
		<category><![CDATA[captcha]]></category>
		<category><![CDATA[common sense]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[OCR]]></category>
		<category><![CDATA[online]]></category>
		<category><![CDATA[защита интернет-ресурсов]]></category>
		<category><![CDATA[изображение]]></category>
		<category><![CDATA[классификация]]></category>
		<category><![CDATA[проверка]]></category>
		<category><![CDATA[реализация]]></category>
		<category><![CDATA[технология]]></category>
		<category><![CDATA[форма]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/net/7-sposobov-zashhitit-svoj-internet-resurs-ot-nezhelatelnoj-informacii/</guid>
		<description><![CDATA[В одном из предыдущих постов я поднял тему о технологии под названием captcha, которая является одним из самых распространенных и эффективных способов борьбы с автоматическим заполнением интернет-ресурсов нежелательным контентом. В этом же посте хотелось бы развить начатый разговор повествованием о различных способах воплощения этой технологии в жизнь. 1. Классический вариант &#8212; графическая реализация Самым популярным [...]]]></description>
			<content:encoded><![CDATA[<p>В одном из предыдущих постов я поднял <a target="_blank" href="/net/otkuda-voznikaet-spam-i-kak-s-nim-borotsya/">тему о технологии под названием captcha</a>, которая является одним из самых распространенных и эффективных способов борьбы с автоматическим заполнением интернет-ресурсов нежелательным контентом. В этом же посте хотелось бы развить начатый разговор повествованием о различных способах воплощения этой технологии в жизнь.</p>
<p><span id="more-4"></span></p>
<h3>1. Классический вариант &#8212; графическая реализация</h3>
<p>Самым популярным вариантом реализации является &quot;графическая&quot; captcha (позволю себе &quot;обращаться&quot; к этому слову в женском роде, просто из-за того, что по-моему оно так лучше звучит, не смотря на то, что по логике все же стоило использовать &quot;он&quot;, так как при дословном переводе получилось бы слово <span style="text-decoration: underline;">тест</span> с кучкой прилагательных и определений). Она представляет собой изображение, содержащее чаще всего какой-либо сильно искаженный текст или набор цифр, и перед посетителем ставится задача воспроизведения в текстовом поле, находящемся неподалеку, того что он/она видит на изображении. Большинству людей не составит труда прочесть и набрать на клавиатуре даже искаженный до неузнаваемости текст, а вот для программы данная задача является как минимум нетривиальной.</p>
<p>Существует некоторое количество алгоритмов (называются <a href="/tag/ocr" target="_blank">OCR</a>, <span style="font-weight: bold;">O</span>ptical <span style="font-weight: bold;">C</span>haracter <span style="font-weight: bold;">R</span>ecognition), позволяющих программе пытаться понять что же за текст расположен на изображении. Эти алгоритмы разрабатывались для вполне мирных целей &#8212; для оцифровки книг и любых других напечатанных на бумаге документов. Но все же эти алгоритмы предназначены для распознавания аккуратно написанного текста черным шрифтом на белом фоне и являются плохо приспособленными для распознавания <a href="/tag/captcha" target="_blank">captch&#8217;и</a>. Но все же существует довольно большое количество модификаций этих алгоритмов, приспособленных для чтения даже искаженного текста.</p>
<p>Казалось бы это существование таких алгоритмов делает бессмысленным использованием такого рода &quot;защиты&quot;, но на практике это далеко не так: большинство из них пригодны только для распознавания только узкого набора реализаций графических <a href="/tag/captcha" target="_blank">captch</a>, особенно это актуально для популярных готовых решений реализации этого типа защиты находящимся в свободном доступе в сети Интернет, а также сервисов, предоставляющих услуги по генерации такого рода изображений. Что делает довольно актуальным написание собственной реализации графической <a href="/tag/captcha" target="_blank">captch&#8217;и</a> для появления уверенности в отсутствии готовой модификации <a href="/tag/ocr" target="_blank">OCR</a> алгоритма, для преодоления используемой преграды. Об этом и пойдет речь в <a href="/programming/php/zashhita-internet-resursov-v-kartinkax/">записи про собственноручную реализацию технологии CAPTCHA.</a></p>
<p>Но запись еще далека от завершения, ведь описанная выше графическая реализация, не является единственной. Во-первых, стоило упомянуть пару несколько реже используемые модификации визуальных тестов:</p>
<h3>2. Сommon sense</h3>
<p>Эта категория модификаций основывается на вопросах построенных на так называемом <em>common sense</em>, то есть на каких-то общеизвестных вещах, очевидных для любого человека, но не поддающимся четкому осознаванию программой с помощью какого-либо алгоритма.  К сожалению, этот факт вместе с тем порождает и основной недостаток этой категории проверок- такой тест невозможно автоматически сгенерировать, что делает реализацию существенно более трудоемкой и  неэффективной, что собственно и обуславливает редкость их применения на практике.</p>
<h3>3. Математический тест</h3>
<p>Помимо просто перенабирания некоторого набора цифр с изображения, авторы captch&#8217;и могут попросить своего посетителя выполнить какую-либо несложную операцию (например: <span style="font-style: italic;">2 x 2 = ??? </span>).  Но такого рода тесты также далеки от идеала, так как в подавляющем большинстве алгоритм их решения прост для безобразия &#8212; вполне достаточно бывает базового <a href="/tag/ocr" target="_blank">OCR</a> и реализации калькулятора внутри <a href="/tag/crawler" target="_blank">crawler</a>&#8216;a, чтобы он смог преодолеть такого рода барьер.</p>
<h3>4. Выбор изображения</h3>
<p>Хочется также упомянуть один из достаточно оригинальных вариантов реализации, являющийся по сути вариацией на тему common sense captch&#8217;и, который меня как минимум удивил, когда я его впервые увидел на сайте одного из мобильных операторов рядом с формой для <span style="font-weight: bold;">online</span> отправки SMS. Суть его заключалось в том, что предлагался набор небольших фотографий, из которых предлагалось выбрать 2-4 изображения обладающих каким-либо свойством, например являющимися живыми объектами. Помимо позитивненького оформления и симпатичных фотографий, чисто технически такой подход является достаточно эффективным и легко реализуемым, единственное предъявляемое к такой реализации требование &#8212; достаточно обширная база данных изображений.</p>
<h3>5. Выход за рамки стандартов</h3>
<p>Большинство вещей, предназначенных для массового использования, принято делать по принципу &quot;чем проще тем лучше&quot;. Обусловлено это тем, что количество пользователей обратно пропорционально уровню требований, к ним предъявляемых. Формы на интернет-страницах, как ни странно, исключением из этого принципа не являются, что является причиной их построения с использованием только базовых языков разметки &#8212; <a href="/tag/html" target="_blank">HTML</a>, <a href="/tag/xhtml" target="_blank">XHTML</a> или в крайнем случае <a href="/tag/xml" target="_blank">XML</a>. Именно такую форму и ожидает увидеть spider, попадая на страницу. Но если поступиться этим принципом &#8212; легко поставить программу в тупиковое положение, задействовав какую-либо непривычную для нее технологию. В качестве примера в голову приходит Flash-ролик вместо изображения в <em>графическом</em> варианте реализации.</p>
<p>Этот способ является очень эффективным, но обладает существенными недостатками, такими как, например, необходимость использования современных браузеров с определенными plug-in&#8217;ами.</p>
<h3>6. Скрытие разметки</h3>
<p>В качестве продолжения предыдущей мысли:  <em><a href="/tag/javascript" target="_blank">JavaScript</a></em> предоставляет далеко не один способ скрыть внутри себя код разметки, что позволяет сделать вид, что формы <em>как бы</em> не существует (в основном базирующиеся на обратимом шифровании), заставляя программу подумать &quot;да тут и заполнять-то нечего&quot; и пройти мимо на какой-нибудь другой сайт. Все бы хорошо, только посетители сайта с отключенным <em><a href="/tag/javascript" target="_blank">JavaScript</a></em>&#8216;ом формы тоже не увидят&#8230;</p>
<h3>7. Звуковое воплощение</h3>
<p>Как не трудно было заметить, что все варианты, которые я упомянул до этого момента, так или иначе базировались на визуальном восприятии информации. И вполне обосновано &#8212; для большинства людей зрение играет роль основного чувства, но существуют и интернет-ресурсы, для которых важен абсолютно каждый посетитель, в том числе и люди с ограниченными способности, для которых стандартные проверки являются непреодолимыми. Для такой категории людей были сделаны альтернативные варианты, основывающиеся на таком чувстве, как слух. Суть же от этого изменилась: посетителя просят набрать с клавиатуры нечто услышанное при воспроизведении аудио-записи, либо ответить на какой-либо вопрос, основывающийся на уже упомянутом принципе <em>common sense</em> и заданный тоже с помощью в аудио-файле.</p>
<p>Вместо заключения хотелось бы предложить Вам <a target="_blank" href="/feed">подписаться на RSS этого блога</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/set/7-sposobov-zashhitit-svoj-internet-resurs-ot-nezhelatelnoj-informacii/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Откуда возникает спам и как с ним бороться</title>
		<link>http://www.insight-it.ru/set/otkuda-voznikaet-spam-i-kak-s-nim-borotsya/</link>
		<comments>http://www.insight-it.ru/set/otkuda-voznikaet-spam-i-kak-s-nim-borotsya/#comments</comments>
		<pubDate>Thu, 03 Jan 2008 17:25:32 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Сеть]]></category>
		<category><![CDATA[captcha]]></category>
		<category><![CDATA[crawler]]></category>
		<category><![CDATA[online]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[spider]]></category>
		<category><![CDATA[защита интернет-ресурсов]]></category>
		<category><![CDATA[интернет]]></category>
		<category><![CDATA[проверка]]></category>
		<category><![CDATA[спам]]></category>
		<category><![CDATA[электронная почта]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/?p=3</guid>
		<description><![CDATA[На сегодняшний день далеко не каждый пользователь Сети является человеком, возможно это покажется странным для не интересующегося ИТ читателя, но существует множество программ, способных передвигаться по сайтам, следуя по гипер-ссылкам, как внутри одного сайта, так и переходя с одного сайта на другой (в целом такой тип программ называется spider или crawler). Такие программы могут иметь [...]]]></description>
			<content:encoded><![CDATA[<p>На сегодняшний день далеко не каждый  пользователь <a href="/net" target="_blank">Сети</a> является человеком, возможно это покажется странным для не интересующегося ИТ читателя, но существует множество программ, способных передвигаться по сайтам, следуя по гипер-ссылкам, как внутри одного сайта, так и переходя с одного сайта на другой (в целом такой тип программ называется <a href="/tag/spider" target="_blank">spider</a> или <a href="/tag/crawler" target="_blank">crawler</a>). Такие программы могут иметь совершенно разное предназначение, самый распространенный пример: поисковые системы используют <a href="/tag/crawler" target="_blank">crawler</a>&#8216;ов для пополнения своих индексов, но, к сожалению, далеко не все программы этого класса написаны для благих целей.</p>
<p><span id="more-3"></span></p>
<h3>Good vs Evil</h3>
<p>Большая часть &quot;хороших&quot; <a href="/tag/spider" target="_blank">spider</a>&#8216;ов используется лишь для сбора информации о сайте и следуют пожеланиям владельцев сайтов, оставленных ими в специальном файле под названием robots.txt, либо внутри <a href="/tag/html" target="_blank">HTML</a>-разметки с помощью специально предназначенных для этого тэгов (этот механизм выходит за рамки данного повествования, так что позволю себе его пропустить, оставив как тему для отдельного разговора).</p>
<p>Но даже сбор информации во время автоматизированного путешествия программы по сайтам можно использовать в корыстных целях &#8212; на многих сайтах люди размещают свою контактную информацию для тех или иных целей, и некоторые сайты эту информацию &quot;публикуют&quot;. <a href="/tag/spider" target="_blank">Spider</a>, настроенный на сбор контактной информации (в основном адресов электронной почты и номеров ICQ и прочих служб обмена сообщениями) может в очень сжатые сроки насобирать длинный список адресов, пригодный, например, для рассылки нежелательной рекламы, в простонародье называемой <em><a href="/tag/spam" target="_blank">спам</a></em>. Избежать попадания своей контактной информации в такие списки относительно просто &#8212; достаточно лишь следить за тем, чтобы она либо не публиковалась, либо была защищена любым из простейших способов защиты от такого рода программ, начиная от банального требования регистрации для просмотра контактных данных пользователей, заканчивая выводом адресов через изображения или  шифрование посредством <em>JavaScript</em>.</p>
<p>Среди прочих функций, которые может выполнять такого рода программа, одной из наиболее часто используемых является возможность заполнения такой неотъемлемой составляющей практически любого сайта, как <em>формы</em>. Имея возможность заполнения существенно б<em>о</em>льшего количества форм в единицу времени, чем человек, такие программы служат основным источником <em><a href="/tag/spam" target="_blank">спама</a></em> в гостевых книгах, форумах и блогах. Еще одним из возможных применений автоматического заполнения форм является регистрация на множестве интернет-ресурсов с целью получения какой-либо выгоды, например регистрация сайтов в каталогах. Помимо этого <a href="/tag/crawler" target="_blank">crawler</a> перемещается по сайту с относительно высокой скоростью, что резко увеличивает нагрузку на <a href="/tag/server" target="_blank">сервер</a>, особенно при недостаточно оптимизированном движке сайта и/или недостатке ресурсов сервера, выделяемых на выполнение скриптов сайта.</p>
<h3>Защита форм от автоматического заполнения</h3>
<p>Наверняка многие из вас раньше слышали термин <a href="/tag/captcha" target="_blank">CAPTCHA</a>, но боялись спросить: что же он значит? Как не трудно догадаться этот термин является аббревиатурой <img src='http://www.insight-it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Расшифровывается она как &quot;<strong>C</strong>ompletely <strong>A</strong>utomated <strong>P</strong>ublic <strong>T</strong>uring test to tell <strong>C</strong>omputers and <strong>H</strong>umans <strong>A</strong>part&quot;. Для меня до сих пор остается загадкой по какому принципу выбирались слова для составления этой аббревиатуры, наверное тупо случайным образом <img src='http://www.insight-it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Смысл этой фразы в переводе на русский можно передать как &quot;полностью автоматический способ отличить человека от компьютера&quot;. Конечно же имеется ввиду не внешние различия, а особенности их поведения на просторах сети Интернет. В роли &quot;компьютера&quot; в данном случае как раз выступают программы, о которых шла речь в самом начале.  Эта технология позволяет владельцам сайтов, желающих исключить (по крайней мере чисто теоретически, на практике же &#8212; минимизировать) посещение своего ресурса &quot;плохими&quot; &quot;компьютерами&quot;, крайне затруднить их использование.</p>
<p>В основе этой технологии лежит тот факт, что у программ в большинстве случаев отсутствует даже какое-либо подобие образного мышления &#8212; они следуют заранее четко определенному алгоритму. Существует множесво вариантов реализации защиты сайта с использованием этого недостатка компьютерных программ, но все они представляют некоторую проверку, предлагаемую пользователю и стремящуюся к удовлетворению следующего ряда требований:</p>
<ul>
<li>Современные компьютеры не должны иметь возможности точно ее пройти.</li>
<li>Она должна быть &quot;по зубам&quot; большинству людей.</li>
<li>Не должна полагаться на тот факт, что потенциальный &quot;злоумышленник&quot; просто не знаком с принципом работы данной проверки.</li>
</ul>
<p>Более подробно о возможностях этой <a href="/tag/tekhnologiya" target="_blank">технологии</a> можно узнать, прочитав <a href="/net/7-sposobov-zashhitit-svoj-internet-resurs-ot-nezhelatelnoj-informacii/">запись о нескольких вариантах ее реализации</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/set/otkuda-voznikaet-spam-i-kak-s-nim-borotsya/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

