Создайте в папке seophp/include файл с именем sanitize.inc.php и введите
в него следующий код:
<?php
// зачистка HTML-кода в $inputHTML
function sanitizeHTML(
$inputHTML,
$allowed_tags = array(,1 , '', "', '',
'
', '
'', ''))
{
$_allowed_tags = implode('', $allowed_tags);
$inputHTML = strip_tags($inputHTML, $_allowed_tags);
return preg_replace ('#<(.*?) >#ise',
"'<' . removeBadAttributes('\\1') • '>'" , $inputHTML);
)
// удаление неразрешенных атрибутов из $inputHTML
function removeBadAttributes ($inputHTML)
{
// определение списка неразрешенных атрибутов
$bad_attributes = 'onerror|onmousemove Ionmouseout|onmouseoverI1 .
'onkeypress|onkeydown|onkeyup|javascript:';
// удаление запрещенных атрибутов и возврат результата
return stripslashes(preg_replace("#($bad_attributes)(\s*)(?==)#is" ,
'SANITIZED1, $inputHTML));
}
?>
2. Добавьте в файл comments.php третий комментарий, который содержит неразрешенный атрибут onerror. Кроме того, нужно добавить ссылку на библиотеку
sanitize.inc.php:
<?php
// загрузка библиотеки nofollow
require_once 'include/nofollow.inc.php';
// загрузка библиотеки зачистки
require_once 'include/sanitize.inc.php';
?>
Пpoфeccиoнaльнaя поисковая оптимизация на PHP: комментарии
Старые комментарии:
<?php
// вывод первого комментария
echo noFollowLinks('<р>Привет! Получите все на сайте
<а href="http://too.much.зрат">крутая ссылка!');
// вывод второго комментария
echo noFollowLinks('<р>Мы только что выпустили новый продукт:
<а href="http://seophp.example.com/Products/SEO-Toolbox-C6/Link-Juice-P31.html">
Сок из ссылок.');
// вывод третьего комментария
$inHTML= '<р>3ачистка !';
echo $inHTML;
?>
3. Но зачистка входной строки $inHTML еще не выполнена. Посмотрите, что произойдет без применения функции зачистки. Загруженная страница http : / /
seophp. example. com/comments.php должна автоматически выполнить перена
правление на http://too.much.spam/, как показано на рис. 8.7. Конечно, та
кого адреса нет в природе, но упражнение наглядно демонстрирует, как легко
можно реализовать такие перенаправления при отсутствии зачистки данных.
4. Теперь добавьте в сценарий comments .php функцию зачистки. Для этого найдите
строку echo $inHTML; и замените ее следующей:
echo sanitizeHTML($inHTML);
ВОЗМОЖНЫЕ ПРИЧИНЫ:
• НЕТ ПОДКЛЮЧЕНИЯ к ИНТЕРНЕТУ,
» НА ВЕБ-УЗЛЕ ВОЗНИКЛИ НЕПОЛАДКИ.
* ВОЗМОЖНО, сделана ОПЕЧАТКА S АДРЕСЕ.
5.
Снова загрузите в браузер страницу http: //seophp. example. com/comments.
php. Теперь вы уже не будете перенаправлены на спамерский сайт, как это было
APNM
раньше. Выходные данные должны выглядеть так, как показано на рис. 8.8.
Старые комментарии:
Привет! Получите все не сайге крутая ссылка!
Мы только что выпустили новый гфодухт: Сок из ссыпок.
6.
Стоит также посмотреть на исходный код страницы. На рис. 8.9 видно, что ваш
сценарий заменил атрибут onerror на SANITIZED. (Здесь также,выполнено ручное
форматирование HTML-кода, чтобы его было удобнее читать.)
Для зачистки данных, введенных пользователем, эти данные просто передаются
функции sanitizeHTML (). Она удаляет все дескрипторы, которые не указаны в переменной $allowed_tags, а также атрибуты, которые позволяют выполнить JavaScript-код.
Если не пропустить входной текст через sanitizeHTML (), то специально подобранный HTML-код может совершить перенаправление на сайт http://too.much.spam/.
Событие onerror возникает при обнаружении ошибки. Поскольку изображение
INVALID-IMAGE не существует, генерируется ошибка и выполняется код события, т.е.
перенаправление location.href ='http: //too.much, spam/ '.
После выполнения функции sanitizeHTML () событие onerror заменяется на
SANITIZED, и никакие перенаправления не выполняются.
Обычно функция sani tizeHTML () не возвращает правильный НТМЬкод. Но на практике это не так уж и важно, т.к. она предназначена для предотвращения рассылки спама. А измененный HTML-код вряд ли приведет к проблемам в браузерах или поисковых механизмах. В любом случае однажды такой контент будет удален или изменен владельцем сайта.
Наличие на Web-сайте подобного "нечестного" контента может нанести ущерб репутации с точки зрения как людей, так и поискового механизма. Поисковые алгоритмы могут среагировать на внедренные JavaScript-перенаправления и наложить штраф на Web-сайт. Поэтому крайне важно заняться этими вопросами и устранить их.
Обратите внимание, что в последнем примере не была задействована библиотека
nof ollow, но ее можно применить в сочетании с зачисткой и получить еще более чистые данные, например:
// вывод третьего комментария
$inHTML = '<р>3ачистка !';
$sanitized = noFollowLinks (sanitizeHTML ($inHTML)) ;
echo $sanitized;
Напоследок скажем, что приведенные реализации — и noFollowLinks (), и
sanitizeHTML () — не могут блокировать все атаки и не обеспечивают гибкость, необходимую некоторым программистам. Но они серьезно осложняют жизнь спамеров, и те скорее переключатся на более легкую добычу. Более надежным решением является проект под названием safeHTML, разработанный компанией Pixel-Apes. Это проект с открытым исходным кодом, написанный на РНР и доступный по адресу http://pixel-apes.com/safehtml/.