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>
Искупление
Как и в остальных примерах, мы применяем оба лекарства: проверяем входные данные, а затем 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/&/&/g;
$in =~ s/</</g;
$in =~ s/>/>/g;
$in =~ s/\»/"/g;
$in =~ s/#/#/g;
$in =~ s/\(/(/g;
$in =~ s/\)/)/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,
@"<(/?)(i|b|p|em|h\d{1})>",
"<$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 не нужно, так как его функциональность уже встроена в сам сервер. Подробнее см. раздел «Другие ресурсы».
Другие ресурсы
□ «Writing Secure Code, Second Edition» by Michael Howard and David C. LeBlanc (Microsoft Press, 2002), Chapter 13 «Web–specific Input Issues»
□ Mitigating Cross–site Scripting With HTTP–only Cookies:microsoft.com/library/default.asp?url=/workshop/author/dhtml/httponly_ cookies.asp
□ Request Validation – Preventing Script Attacks: www.asp.net/faq/ requestvalidation.aspx
□ mod_perl Apache::TaintRequest: www.modperlcookbook.org/code.html
□ «UrlScan Security Tool»: www.microsoft.com/technet/security/tools/ urlscan.mspx
□ «Divide and Conquer – HTTP Response Splitting, Web Cache Poisoning Attacks, and Related Topics»: www.securityfocus.com/archive/1/356293
□ «Prevent a cross–site scripting attack» ny Anand K. Sharma: www–106. ibm.com/developerworks/library/wa–secxss/?ca=dgr–lnxw93PreventXSS
□ «Prevent Cross–site Scripting Attacks» by Paul binder: www.perl.eom/pub/a/ 2002/02/20/css.html