| NordWest |
Отправлено: 22 января 2012 — 00:08 • Тема: Как работать с сессиями в PHP? • Форум: Записная книжка PHP |
Ответов: 0 Просмотров: 2559
 |
Все, что мы записываем в переменную $s (массив), будет доступно для чтения при следующем заходе посетителя на сервер. Про сессии, на самом деле, можно сказать очень много, чтобы описать возможности и особенноти.. Но если вы поюзаете пример и попробуете использовать в своих задачах, сами поймете.
code:<?php
unset($s);// думаю, это писать не надо, но это явно не повредит
session_start();// это равносильно HEADERS() и SETCOOKIES(), до вызова функции
// ничего на экран не выводить
session_register('s');// объявляем, что $s является частью сессии
if (isset($c) && $c=='clear')
{ unset($s);// обнуления идентификации посетителя.
header('Location: sess.html');
echo 'clear…';
exit;
}
echo '<a href="sess.html">обновить страницу</a>';
echo '<a href="sess.html?c=clear">обнулить идентификацию</a>';
if (!isset($s['count']))
{ // Посетитель пришел впервые. Объявляем переменную, которая
// должны быть всегда. Это счетчик загрузок страницы.
$s['count']=1;
}
else
{ $s['count']++;
}
echo 'Вы загружили эту страницу раз: '.$s[count];
// обработка формы, заполняемой посетителем
// если введено имя, заносим в сессию
if (strlen($name)>1) { $s['name']=$name; }
if (!isset($s['name']))
{ // если имя еще не введено, выводим форму для ввода
echo 'Вы новый пользователь. Пожалуйста, введите ваше имя: ';
echo '<form action="sess.html"><input type="text" name="name" />';
echo '<input type="submit">';
echo '</form>';
}
else
{ // иначе пишем имя из сесси
echo 'Вы зарегистрированы под именем: '.$s[name];
}
?> |
| NordWest |
Отправлено: 21 января 2012 — 19:00 • Тема: Проверка checkbox на форме • Форум: Записная книжка PHP |
Ответов: 0 Просмотров: 3386
 |
Хотелось бы отметить, что многие изначально совершают ошибки и пишут не правильно html checkbox. То есть начитавшись в Интернет информации 10 летней давности пишут всякую охинею. Согласно одного из последних строгих DOCTYPE, который пытается нас сопроводить в эпоху HTML5 checkbox правильно пишется следующим образом:
code:<input type="checkbox" name="checkme" checked="checked" />
Обратите внимание, id в input объекте нет! Согласно последним стандартам к таким html объектам нужно обращаться через свойство name. Также обратите внимания, что нет и value, при type="checkbox" это значение не прописывается. Оно по умолчанию =0. То есть нет смысла его указывать, если не требуется выставить, что либо принудительно.
 Речь идет о стандарте: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">, в других стандартах DOCTYPE данный объект может писаться по другому. Смотрите внимательно спецификацию.
Можно сделать так. Перед тегом <input type="checkbox"> поместить тег <input type="hidden"> с тем же самым значением параметра «name»:
code:<form …>
…
<input type="hidden" name="checkme" value="0">
<input type="checkbox" name="checkme" value="1">
…
</form>
Теперь если checkbox установлен, в переменной $checkme передастся «1», в противном случае «0». Однако, если у вас будет 10 checkbox`ов, то будете уже не приятно удивлены, как быстро начнет увеличиваться ваш html код, а некоторые браузеры покрутят пальцем возле вашего виска.
Правильно делать так...
Для начала, нужно форму сделать согласно стандартам консорциума W3C
Код html:
code:<form action="page.php" method="post">
<input type="checkbox" name="checkme" checked="checked" /> <- правильно пишем input согласно стандартам
</form>
Код PHP:
code:function checkbox_verify($_name)
{
$result=0;// обязательно прописываем, чтобы функция всегда возвращала результат
// проверяем, а есть ли вообще такой checkbox на html форме, а то часто промахиваются
if (isset($_REQUEST[$_name]))
{ if ($_REQUEST[$_name]=='on') { $result=1; } else { $result=0; }
}
return $result;
}
В итоге, вызов получается очень простым:
code:echo checkbox_verify('checkme'); |
| NordWest |
Отправлено: 21 января 2012 — 18:53 • Тема: Вставки в код PHP Javascript • Форум: Записная книжка PHP |
Ответов: 3 Просмотров: 6523
 |
Вставка в *.php файл ява скрипта для отображения php переменной:
code:?><script type="text/javascript"> var desc='<?php echo $Itemid;?>'; alert(desc); </script> <?php
Для файлов *.tpl конструкция выглядит чуть по другому:
code:<script type="text/javascript"> var desc='{$Itemid}'; alert(desc); </script> |
| NordWest |
Отправлено: 19 января 2012 — 00:41 • Тема: История изменений... • Форум: Limbo CMS |
Ответов: 40 Просмотров: 28461
 |
mambo.php
было...
code:function mosLoadModules( $position='left', $horiz=false)
{
global $conn,$Itemid,$access_sql;
$horiz=false;
$query = "SELECT id,title,message,module,ordering,position,showtitle,showon,params"
."\nFROM #__modules"
."\nWHERE published=1 AND position='$position' $access_sql"
."\nORDER BY ordering ASC";
$rs=$conn->Execute($query);
if($rs && $rs->RecordCount()>0 && $rsa = $rs->GetArray() )
{
if ($horiz)
{echo '<table cellpadding="0" cellspacing="0" border="1" width="100%"><tr>';}
foreach($rsa as $module)
{
if ($horiz)
{echo "<td valign=\"top\">";}
if($module['showon']=='' || ($Itemid<>'' && strstr($module['showon'],'_'.$Itemid.'_')) || strstr($module['showon'],'_0_'))
{
$params=parseparams(dbdecode($module['params']));
html_module2( $module, $params, $Itemid );
}
if ($horiz)
{echo "</td>";}
}
if ($horiz)
{echo "\n</tr>\n</table>";}
}
}
стало...
code:function mosLoadModules( $position='left')
{
global $conn,$Itemid,$access_sql;
$query = "SELECT id,title,message,module,ordering,position,showtitle,showon,params"
."\nFROM #__modules"
."\nWHERE published=1 AND position='$position' $access_sql"
."\nORDER BY ordering ASC";
$rs=$conn->Execute($query);
if($rs && $rs->RecordCount()>0 && $rsa = $rs->GetArray() )
{
foreach($rsa as $module)
{
if($module['showon']=='' || ($Itemid<>'' && strstr($module['showon'],'_'.$Itemid.'_')) || strstr($module['showon'],'_0_'))
{
$params=parseparams(dbdecode($module['params']));
html_module2( $module, $params, $Itemid );
}
}
}
}
Убрал куски кода связанные с переменной $horiz т.к. она всегда false и условия никогда не выполнятся. |
| NordWest |
Отправлено: 18 января 2012 — 23:56 • Тема: Этапы разработки CMS Limbo • Форум: Limbo CMS |
Ответов: 115 Просмотров: 41348
 |
Блин, до чего же тяжело мне дается дизайн. Найти ошибку в коде мне значительно проще чем поправить дизайн. С дизайном значительно хуже прокатывает метод копирования кусков кода, особенно когда дизайн в принципе не нравиться и хочется замутить свой.
Видимо нужно сесть за теорию. |
| NordWest |
Отправлено: 18 января 2012 — 00:39 • Тема: Методы защиты веб-формы без капчи • Форум: Limbo CMS |
Ответов: 7 Просмотров: 3389
 |
Минимальное время заполнения формы
Суть метода заключается в том, что сервер замечает время создания формы. Если пользователь заполнил форму меньше чем за определённое время, то он считается ботом. Время можно варьировать в зависимости от сложности формы.
Верно также, что если форма не была заполнена слишком долго, то что-то не так.
Скрытое поле
Этот метод может показаться странным, но он, похоже, работает. К форме добавляется скрытое поле (скрытое в смысле display:none). Если поле заполнено, то пользователь считается ботом.
Удивительно, но многие простенькие боты заполняют все неизвестные поля.
Обфускация или шифрование HTML
Исходный код страницы является, по сути, вызовом javascript функции вроде document.write( decode( encodedHTML ) ), где encodedHTML — это как-то зашифрованный HTML.
Методы шифрования могут варьироваться от простого эскейпирования значений буковок (буква превращается '%код' ) до некоторых алгоритмов шифрования (например, простенький XOR).
В интернете есть много готовых решений, например, вот тут.
Блокирование определённых user-agent
Некоторые боты используют весьма специфические заголовки user-agent. Можно блокировать запросы не содержащие user-agent вообще или содержащие заведомо плохой заголовок.
В интернете есть списки таких заголовков. Вот, например, от некого Нила Гантона.
«Ловушка» для ботов
Суть этого метода заключается в создании специального раздела сайта вроде "/bot/guestbook". Ссылка на этот раздел не видна для пользователя, однако если бот зайдёт в этот раздел и сделает там хоть что-нибудь, то его IP тут же блокируется.
Раздел должен содержать лакомые для бота слова вроде «email», «submit», «add comment» и тому подобные. Файл «robots.txt» предупреждает хороших ботов.
Хеширование формы (BarsMonster )
При сабмите формы на сервер вычисляется хеш полей формы и добавляется в одно из специальных скрытых полей. Сервер проверяет значение хеша.
Использование прозрачных кнопок (BarsMonster )
У формы есть несколько кнопок типа <input type="image". Лишь на одной из картинок написан текст, остальные — прозрачные. Для сабмита пользователь должен нажать на картинку с текстом.
Динамическое создание формы (maxshopen )
Сама форма полностью создаётся javascript-методом динамчески. Таким образом, форму может увидить лишь пользователь, у которого отработал соответствующий скрипт.
Использование сторонних сервисов (le0pard )
Можно туннелировать трафик через специальный сервис, предназначенный для анализа контента на спам. Примером такого сервиса может быть Akismet
Гибридный подход
По умолчанию форма защищена каким-либо javascript-методом (динамическое создание формы или шифрование данных) или методом из приведённых выше. Если форма была засабмичена некорректно, то возвращается ошибка и просьба заполнить не очень простую капчу.
«Горшочек с медом».
Смысл метода Honeypot прост, как и его реализация. Помимо настоящих полей ввода, делаются скрытые поля. Пользователь их не видит, следовательно, не может их заполнить. Если поле заполнено, комментарий не нужно добавлять. Почему пользователь не заполняет поле понятно, а почему спам-бот заполняет? В ловушке должна быть приманка. В качестве приманки выступает значение атрибута name.
code:<input type="input" name="email" value="" />
<input type="input" name="blablabla" value="" />
Бот, очевидно, умеет находить нужные поля и правильно их заполнять. Бот находит поле email, считает, что дело в шляпе, вбивает в него адрес (кстати, валидный). Заполняет тело комментария, отправляет форму. Обрабатывающий скрипт берет данные из поля blablabla. Это настоящие данные с которыми нужно работать. Скрипт также проверяет, есть ли что-то в поле email. Если есть, комментарий просто не будет добавлен в базу.
Несколько штрихов. Я не знаю, как работают боты. Но думаю, они не дураки. Если поле помечено, как hidden, бот может решить, что ловушка и искать другое поле. Поэтому я скрыл поле с помощью CSS, при этом не присваивал отдельный класс, а использовал селектор [name="email"]. Даже такого простого приема хватило, чтобы за сутки не было ни одного спам-комментария. |
| NordWest |
Отправлено: 17 января 2012 — 18:06 • Тема: Структура базы данных • Форум: Limbo CMS |
Ответов: 7 Просмотров: 3149
 |
Взаимосвязь параметров базы:
1. Таблица категорий
code:categories/section (int) -> sections/id
categories/section ("com_menu") -> menu/menutype (categories/title)
2. Таблица меню
code:menu/link_type ("component")/componentid (int) -> components/id
menu/link_type ("сс")/componentid (int) -> categories/id
3. Таблица контента
code:content/catid (int) -> categories/id
content_frontpage/id (int) -> content/id
content_rating/id (int) -> content/id |
|