Вход/Регистрация
19 смертных грехов, угрожающих безопасности программ
вернуться

Виега Джон

Шрифт:

Ну и наконец пример JSP)страницы, из которой вызывается определенный выше тег:

...

<%@ taglib uri="/tags/htmlencoder" prefix="htmlencoder" %>

<head>

<title>Покайся, грешник...</title>

</head>

<html>

<body bgcolor="white">

<htmlencoder:htmlencode><script

type="javascript">BadStuff</script></htmlencoder:htmlencode>

<htmlencoder:htmlencode>testing</htmlencoder:htmlencode>

<script type="badStuffNotWrapped"></script>

</body>

</html>

Искупление греха в PHP

Как и в остальных примерах, мы применяем оба лекарства: проверяем входные данные, а затем HTML)кодируем выводимую информацию с помощью функции htmlentities:

...

<?php

$name = $_GET[\'name\'];

if (isset($name)) {

if (preg_match(\'\^w{5,25}$/\',$name)) {

echo "Hello, " . htmlentities($name);

} else {

echo "Вон отсюда!";

}

}

?>

Искупление греха в Perl/CGI

Идея та же, что в предыдущих примерах: проверить входные данные, сопоставив их с регулярным выражением, а затем HTML–кодировать выводимую информацию.

...

#!/usr/bin/perl

use CGI;

use HTML::Entities;

use strict;

my $cgi = new CGI;

print CGI::header;

my $name = $cgi->param(\'name\');

if ($name =~ /^\w{5,25}$/) {

print "Hello, " . HTML::Entities::encode($name);

} else {

print "Вон отсюда!";

}

Если вы не хотите или не можете загрузить модуль HTML::Entities, то вот эк)

вивалентный код для решения той же задачи:

sub html_encode

{

my $in = shift;

$in =~ s/&/&amp;/g;

$in =~ s/</&lt;/g;

$in =~ s/>/&gt;/g;

$in =~ s/\»/&quot;/g;

$in =~ s/#/&#35;/g;

$in =~ s/\(/&#40;/g;

$in =~ s/\)/&#41;/g;

return $in;

}

Искупление греха в mod–perl

Как и выше, мы проверяем корректность входных данных и HTML–кодируем выходные.

...

#!/usr/bin/perl

use Apache::Util;

use Apache::Request;

use strict;

my $apr = Apache::Request->new(Apache->request);

my $name = $apr->param(\'name\');

$apr->content_type(\'text/html\');

$apr->send_http_header;

if ($name =~/^\w{5,25}$/) {

$apr->print("Hello, " . Apache::Util::html_encode($name);

} else {

$apr->print "Вон отсюда!";

}

Замечание по поводу HTML–кодирования

Прямолинейное HTML–кодирование всей выводимой информации для некоторых Web–сайтов представляется драконовской мерой, поскольку такие теги, как <1> или <В> безвредны. Чтобы несколько ослабить путы, подумайте, не стоит ли «декодировать» заведомо безопасные конструкции. Следующий фрагмент кода на С# иллюстрирует, что автор называет «HTML–декодированием» тегов, описывающих курсив, полужирный шрифт, начало абзаца, выделение и заголовки:

...

Regex.Replace(s,

@"&lt;(/?)(i|b|p|em|h\d{1})&gt;",

"<$1$2>",

RegexOptions.IgnoreCase);

Дополнительные защитные меры

В Web–приложение можно включить много дополнительных механизмов защиты на случай, если вы пропустили XSS–ошибку, а именно:

□ добавить в кук атрибут httponly. Это спасет пользователей Internet Explorer версии (6.0) (и последующих), поскольку помеченный таким образом кук невозможно прочитать с помощью свойства document.cookie. Подробнее см. ссылки в разделе «Другие ресурсы». В ASP.NET 2.0 добавлено свойство HttpCookie.HttpOnly, упрощающее решение этой задачи;

□ заключать в двойные кавычки значения атрибутов тега, порождаемые из входных данных. Пишите не <img src=someinput>, a <img src=«someinput»>. Это сводит на нет атаки, которые могли бы обойти HTML–кодирование. Подробно этот прием объясняется в книге Майкла Ховарда и Дэвида Леб–ланка «Защищенный код», 2–ое издание (Русская редакция, 2004);

□ если вы пользуетесь ASP.NET, проверьте, задан ли конфигурационный параметр ValidateRequest. По умолчанию он задан, но лишний раз проверить не мешает. В этом случае запросы и ответы, содержащие недопустимые символы, будут отвергаться. Стопроцентной гарантии этот метод не дает, но все же является неплохой защитой. Подробнее см. раздел «Другие ресурсы»;

□ для Apache mod_perl есть модуль Apache::TaintRequest, помогающий обнаружить входные данные, которые копируются в выходные без проверки. Подробнее см. раздел «Другие ресурсы»;

□ предлагаемая Microsoft программа UrlScan для Internet Information Server 5.0 обнаруживает и обезвреживает многие варианты XSS–уязвимостей в коде вашего приложения.

Примечание. Для Internet Information Server 6.0 (IIS6) расширение UrlScan не нужно, так как его функциональность уже встроена в сам сервер. Подробнее см. раздел «Другие ресурсы».

  • Читать дальше
  • 1
  • ...
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: