Отправляет email-рассылки с помощью сервиса Sendsay

PHP Wars: против целого мира

  Все выпуски  

PHP Wars: против целого мира


Информационный Канал Subscribe.Ru

PHP Wars: против целого мира - выпуск 9

Зачем…

Многие, после прошлого выпуска рассылки прислали мне свои мнения. Было много как позитивных так и негативных отзывов. Основой для негативных отзывов стала мысль о том, что для рассылки обучающей программированию на php не стоит углубляться в сменные темы. Но я у меня другое мнение. Все уже заложено в названии рассылки. Мы не собираемся учить - это вы можете научиться - если есть желание. Мы можем лишь помочь вам - вы можете помочь нам. Все просто! Такие статьи это стимул для новичков - отзывы стимул для нас. Что тут неясного.

Сегодня мы начнем как и говорилось с отзывов на мою статью, вышедшею в прошлой рассылке. Далее вам будет предложена статья "Предохраняйся с помощью сессий часть 2". Продолжение другой нашей статьи, так же вызвавшей не однозначную реакцию у некоторых людей. А вот про UpLoad соредактор NoNseNs написать никак не успел. Т.к. (не будем тыкать пальцем) нам явно намекнули, что мы пытаемся "замять" тему. Ничего мы не пытаемся.

Iprit, глав(в)ред рассылки.

Прокомментирую некоторые яркие мнения относительно прошлой статьи.

Пишет: Сергей
Здравствуйте. … Рассылка мне понравилась. Думаю, исходя из прогнозов рассматриваемых тем, станет еще полезней и интересней. .. Меня (а возможно и многих), например, интересует реализация через интернет оборудования для малого и среднего бизнеса. Не обязательно непосредственная продажа, возможна и посредническая деятельность...
[Iprit >>] Здравствуйте Сергей. Да действительно, через Интернет выгодней продавать (все что угодно), но остается один вопрос. Если вы хотите "минимизировать" налоговое бремя, то стоит продумать вариант заключения электронных документов. Об этом я обязательно напишу в следующее воскресенье.
…А многие крупные/не очень производители, услышав что Интернет очень хорошая вещь - там можно все продать, заказывают себе сайты. Сайты эти не в большей степени получаются информационные, а не продающие...
[Iprit >>] Это получается опять же из-за того, что руководители не проинформированы о возможности заключения электронных сделок, о методах и технологиях защиты подлинности электронных документов. Читайте об этом в следующем выпуске.
…В моем понимании (применительно к вышесказанному): Продающий - сайт на который натыкаются в инете/не инете (случайно/не случайно находят) затем зайдя на него, покупают то, информация о чем находится на оном.
[Iprit >>] Действительно, таких сайтов мало, но людей имеющих электронные деньги мало, а руководителей фирм знающих о преимуществах электронных средств оплаты и того меньше. Хотя если не делать акцент на "налоговой экономии" вся проблема (на мой взгляд это и не проблема вовсе) сводится к грамотной программной реализации и поддержке сайта. Постараюсь осветить и эту проблему в продолжении статьи.
… За 9 лет знакомства с инетом только в последние два убедился что в нем можно и продавать … и нужно:)
[Iprit >>] Выгоды электронной коммерции скоро станут очевидными для очень большого числа людей. Вот к этому моменту и нужно начинать готовится сейчас.
Пишет: SpellBound
…Наклепать тучи он-лайн игр с платными ресурсами - не выход. Продавать надо ИДЕЮ. А вот сгенерировать такую идею - это уже искусство…
[Iprit >>] Действительно, уже сейчас намечается перегрев в некоторых секторах информационного рынка. On-line игры тому пример. Хотя, я думаю, тотального обвала не произойдет из-за стабильного роста аудитории Интернета. Умрут только откровенно клонированные проекты. Как верно замечено залогом любого дела является какая-либо идея - от ее качества в значительной степени зависит успех или поражение.

[Статья]:

Автор: NoNseNs
Email: nonsens@phpwars.net

Предохраняйся с помощью сессий часть 2.

Эта статья выходит как продолжение цикла статей о простой системе защиты от несанкционированного доступа. Если вы не читали предыдущую статью, то прочтите, иначе вам будет трудно понять эту.

Принцип защиты, описанный в предыдущей статье, первоначально был написан без использования баз данных mysql. Первоначально в скрипте использовались файлы для хранения паролей, поэтому переходя на базы данных я упустил возможность mysql injection. Что же, постараюсь в этой статье описать, как защититься от этой самой "инъекции". Кроме того, в статье будет описано, как решить те самые проблемы, что были обозначены в первой части.

[Iprit Edit:] Для тех кто недавно присоединился к нам советую для лучшего понимания материала прочесть:

Итак, обеспечиваем безопасную запись в базу. Самый простой способ - использование функции addslashes() - она отменит значение символов, которые могут вызывать проблемы при сохранении в базе данных. Чтобы вернуть данные в исходный вид нужно воспользоваться функцией stripslashes().

Вот таким образом это можно сделать в нашем случае:

<? Function check()
{
if (empty($pass)||empty($name))
error("Не указан логин или пароль");
//-------------начало нового кода
$name= addslashes($name);
//-------------конец нового кода
$sql="select * from my_site where login='".$name."'";
if ($show=mysql_query($sql))
{
$a=mysql_fetch_array($show);
if ($a['pass']!=$pass)
error("Не верное сочетание логин - пароль");
else
session_register("name","pass");
}
else
error("Ошибка запроса к базе данных");
}
?>

Второй способ - использование регулярных выражений. С помощью регулярных выражений вы уже сами можете решать - какие символы допускать, а какие нет.

Про регулярные выражения написано уже множество материала, поэтому опустим этот вопрос.

Еще один способ - использовать специальные функции, которые мнемонизируют (делают удобоваримой для mysql_query) строку. Это mysql_real_escape_string() и mysql_escape_string(). Только помните, что они не мнемонизирует символы % и _. Пример использования:

$name= mysql_escape_string($name);

Любой из этих способов защитит вас от mysql injection.

Идем дальше.

Для более мощной защиты захешируем наши пароли.

Для этого будем использовать функцию crypt().

"Захешируем" - это значит превратим наш пароль в псевдослучайную строку, причем, такую, что ее нельзя перевести обратно.

"Если нельзя расшифровать пароль, то зачем нужна такая шифровка?", спросите вы. Отвечу. Если скормить нашей функции два одинаковых слова, то на выходе будет два абсолютно одинаковых значения. Теперь понятно как важна эта функция? Мы не можем расшифровать пароль и сравнить его с вводимым, но мы можем зашифровать вводимую строку и сравнить ее с хранящейся в базе.

Т.к. пароль нельзя расшифровать, то даже если злоумышленник каким-то образом просмотрит содержимое нашей таблицы с паролями, то он увидит только захешированные строки из которых вытянуть настоящие пароли будет крайне затруднительно. Алгоритм шифрования зависит от операционной системы.

crypt(string_1, string_2);

Первый аргумент функции - это строка, которую нужно зашифровать. Второй - необязателен, если он не предоставлен, то будет автоматически сгенерирован PHP. Но если вы его не укажите, то на одно и тоже слова функция будет выдавать вам разный результат, поэтому нам все же придется задавать и второй аргумент. Пример использования:

$pass=crypt($pass, "ph");

Таким образом, мы хешируем вводимый пользователем пароль и сверяем полученный результат с табличным значением (а там хранятся захешированные с тем же вторым аргументом пароли), если значения совпадают, значит впускаем пользователя.

Идем еще дальше.

Решим те задачи, что поставили в предыдущей статье, а именно:

  1. Возможность входить на сайт под разными именами.
  2. "Полный выход" т.е. нельзя снова зайти на сайт не авторизировавшись.

В принципе, эти две задачи сводятся к одной. И решение ее очень простое - удаление сессии. Сделаем ссылку "выход", которая будет перебрасывать нас на страницу с формой авторизации (index.php) и удалять нашу сессию.

Вот ссылка: <a href="index.php?exit=1">Выход</a>

А этот код разместим на index.php (в самом верху страницы):

<? session_start();
if (!empty($exit))
session_destroy();
?>

Если определена переменная $exit, то функция session_destroy() уничтожает сессию.

Как я и обещал в прошлой статье, я расскажу, как сделать функцию вывода ошибки, да не простую, а с записью в лог и отправкой отчета об ошибке по почте.

Итак, вот код:

function error($er)
{
Global $name, $pass;
//объявляем глобальные переменные.
$time=date("H:i:s");
//присваиваем переменной $time значение времени.
$ip=$_SERVER['REMOTE_ADDR'];
//в переменную $ip записываем ip пользователя
$logFileName="logfile.log";
//файл, где будут храниться записи об ошибках
$fp=fopen($logFileName,'a');
//открываем файл с атрибутом на запись в конец файла (атрибут "а")
if (empty ($name))
$name="empty";
if (empty ($pass))
$pass="empty";
// если имя и пароль не заданы, то присваиваем переменным значения empty.
$message=$time." Ошибка: ".$er."\t Имя: ".$name." Пароль: ".$pass." ip: ".$ip."\t Где : ".$_SERVER['PHP_SELF']."\n";
//составляем отчет
fputs($fp,$message);
//производим запись в файл
fclose($fp);
//закрываем файл
mail("email@mail.ru", "Error", $message "From: error_center");
//отправляем отчет по мылу
echo '<center><strong>Ошибка:</strong> '.$er;
//выводим сообщение об ошибке пользователю
exit(0);
}

Теперь, когда произойдет ошибка пользователю откроется страница с сообщением "Ошибка: описание_ошибки", а вам на ящик придет подробный отчет об ошибке, этот же отчет запишется в лог файл.

Теперь сделаем блокировку подбора пароля. Для этого изменим немного функцию error():

function error($er)
{
Global $name, $pass, $attempt;
$time=date("H:i:s");
$ip=$_SERVER['REMOTE_ADDR'];
$logFileName="logfile.log";
$fp=fopen($logFileName,'a');
if (empty ($name))
$name="empty";
if (empty ($pass))
$pass="empty";
$message="Ошибка: ".$er."\t Имя: ".$name." Пароль: ".$pass." ip: ".$ip."\t Где : ".$_SERVER['PHP_SELF']."\n";
fputs($fp,$message);
fclose($fp);
mail("email@mail.ru", "Error", $message "From: error_center");
echo '<center><strong>Ошибка:</strong> '.$er;

//начало нового кода
if (empty($attempt))
$attempt=1;
else
$attempt++;
session_register("attempt");
//конец нового кода

exit(0);
}

Немного поясню новый код: переменная $attempt является счетчиком количеств неудачных попыток попасть на сайт. Каждый раз, когда вызывается функция error(), значение переменной увеличивается на 1. Теперь подправим функцию check():

function check($pass, $name)
{
//начало нового кода
Global $attempt;
$attempt= intval($attempt);
if ($attempt==3)
exit();
//конец нового кода

if (empty($pass)||empty($name))
error("Не указан логин или пароль");
$pass=crypt($pass, "ph");
$sql="select * from my_site where login='".$name."'";
if ($show=mysql_query($sql))
{
$a=mysql_fetch_array($show);
if ($a['pass']!=$pass)
error("Не верное сочетание логин - пароль");
else
session_register("name","pass");
}
else
error("Ошибка запроса к базе данных");
}

Поясню новый код: функция intval получает целочисленное значение переменной, далее если количество попыток равно 3, то мы ничего больше не показываем, на какую бы страницу не заходил пользователь. Эта блокировка будет действовать до тех пор, пока не умрет сессия.

Так же можно внести блокировку и на index.php там мы напишем тоже самое:

<?
$attempt= intval($attempt);
if ($attempt==3)
exit();
?>

Вот и все. Теперь врятли кто-нибудь сможет получить доступ к вашему ресурсу без разрешения.

Пока.


Нам очень важно Ваше мнение о нашей рассылке, если у вас есть какие-либо пожелания или предложения, Вы хотите высказать свое мнение по поводу опубликованного материала, то пишите нам.

Новости от Rynet@News

Проверку подлинности сломали в течение 24 часов

Продолжая тему попыток увеличения продаж Microsoft, стоит сообщить и о судьбе программы по автоматической проверке подлинности установленной на ПК пользователя Windows. Если ранее проверка подлинности Windows при скачивании обновлений была добровольной, то в понедельник на прошлой неделе Microsoft сообщила, что эта процедура (в рамках акции Windows Genuine Advantage) становится обязательной. Владельцам пиратских копий отныне доступны лишь самые критические для безопасности обновления.

Буквально на следующий же день в интернете появилась информация о том, как эту проверку можно обойти. Процедура оказалась простой до безобразия - достаточно было поместить небольшую строчку на JavaScript в адресную строку браузера для того, чтобы блокировать автоматическую установку утилиты проверки подлинности GenuineCheck.exe.

Впрочем, счастье вряд ли будет длиться вечно. Почти наверняка Microsoft придумает другой способ проверки подлинности Windows, обойти который будет значительно сложнее.

Internet Explorer 7.0 официально стал доступен

Как известно, вместе с первой бета-версией Windows Vista вышел и встроенный в нее предварительный IE 7.0. Отдельная же версия этого web-браузера с самого начала отсутствовала. Теперь же, два дня спустя после выхода Vista Beta 1, стала доступна для скачивания и самостоятельная версия IE 7.0 Beta 1. Среди наиболее заметных нововведений - переход на многостраничный режим работы в едином окне браузера (как в Opera, Maxthon и др.). При этом не меньший интерес представляют и новые технологии, которые будут поддерживаться этим web-браузером. Среди таковых называются PNG (Portable Network Graphics) и IDN (Internationalized Domain Names). Также был усовершенствован пользовательский интерфейс Secure Sockets Layer (SSL).

Новинка, правда, поддерживает работу только с Windows XP. Причем необходимо, чтобы ОС успешно прошла проверку на подлинность, иначе установить Internet Explorer 7.0 Beta 1 не удастся. Но все же сам факт показателен и хорошо иллюстрирует обостряющуюся конкуренцию на рынке браузеров.

Microsoft уточнила время выхода Windows Vista

Компания Microsoft немного уточнила сроки выхода новой операционной системы Windows Vista, ранее известной как Longhorn. До последнего времени в качестве срока окончательного релиза указывалась вторая половина 2006 года. Однако на ежегодной встрече руководства Microsoft с финансовыми аналитиками вице-президент Microsoft по клиентским версиям Windows Уилл Пул сказал, что Windows Vista будет выпущена к "праздничному сезону 2006 года".

При этом Пул не уточнил, имеет ли он в виду День благодарения, который празднуется в США в конце ноября, или же Рождество. Впрочем, в любом случае слова Пула означают, что раньше четвертого квартала 2006 года Windows Vista на прилавках американских магазинов не появится. Замечу, что еще неизвестно, будет ли новая версия ОС называться именно Vista. Оказывается, брэнд Vista уже давно принадлежит другой компании из Редмонда (!), так что придется либо его поменять, либо заплатить отступные, либо несколько лет судиться.


Новости ПО от Ymt.pp.ru

GridinSoft Notepad 3.0.1.0

Текстовый и HEX редактор с подсветкой синтаксиса для более 45 форматов (HTML, ASP, PHP, Perl, Pascal, C++, и др.), возможностью предварительного просмотра перед печатью, закладками, шаблонами, статистикой набранного текста, проверкой синтаксиса (англ. язык), возможностью использования скриптов и удобным интерфейсом на нескольких языках.

Для пользователей стран бывшего СССР регистрация бесплатная.
Win9*/ME/NT/2K/XP, Free, RU
Скачать (1.71 Mb)

TranslateIt! 1.3 beta1

Описание разработчика:
"TranslateIt! - это уникальный и по-настоящему контекстный англо-русский переводчик. Принцип работы программы основан на уникальной технологии "One touch capture", смысл которой заключается в переводе слова простым наведением на него курсора мыши. Теперь встретив в английском тексте незнакомое слово, Вам не нужно отвлекаться от чтения и искать перевод в словаре, не надо копировать слово в буфер обмена и вставлять в другое окно. Просто подведите указатель мыши к незнакомому слову, и Вы тут же получите перевод."
Windows 98/ME/2000/XP, Free, RU
Скачать[2.69 Mb]


На сегодня это все. Очередной выпуск нашей рассылки ждите как обычно в следующее воскресенье. Продолжение неизбежно…
PHP Wars 2005, Все права на материалы принадлежат их авторам. Перепечатка или любое другое использование материалов рассылки разрешается только с письменного разрешения.

Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.phpwars
Отписаться
Вспомнить пароль

В избранное