Добавляем...


Серверные вычисления


Сценарии межузлового обмена

Нужно быть чрезвычайно осторожным, чтобы не допустить возникновения угрозы защите в сценариях межузлового обмена при загрузке динамически изменяемого со-держимого. В главе 22 содержится больше информации на эту тему, но основная идея заключается в том, что, если сценарий сервера получает параметры запроса, а затем возвращает их в ответе без применения кодирования, нарушитель может передать по соответствующему адресу URL программный код JavaScript, который будет выполнен браузером в контексте вашего узла. Например, нарушитель может сконструировать URL, включающий программный код JavaScript для кражи файлов cookie пользователей с целью последующей рассылки спама.

Серверные вычисления

Подход с использованием динамически изменяемого содержимого не ограничива-ется возможностью извлечения содержимого: этот подход можно использовать и для выполнения серверных вычислений, которые невозможно (или очень сложно) реали-зовать в рамках обычного программного кода JavaScript. В качестве примера пред-положим, что требуется обеспечить проверку правописания и исправления ошибок для элемента <textarea> страницы. Добавление в сценарий словаря и программного кода проверки правописания сделает сценарий громоздким, так что указанную возможность лучше реализовать посредством RPC-запроса к серверу.

Следующий пример иллюстрирует базовый подход. Чтобы упростить представ-ление, этот сценарий проверяет только одно слово, введенное в <input>, но сценарий можно расширить, чтобы проверялось содержимое всего <textarea>. Обратите внимание на то, как здесь используется переменная, сигнализирующая о завершении обработки RPC-вызова.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>RPC для проверки правописания</title>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" />
<script type="text/javascript">
<!--
var commandURL = "http://demos.javascriptref.com/checkspelling.php?";
var rpcComplete = false;
var rpcResult = null;
var timer = null;
// Отправка RPC с данным url. Сервер возвратит программный код
// JavaScript, который установит для rpcComplete значение true,
// а для rpcResult - либо true (если слово записано правильно),
// либо строку (содержащую исправленное слово).

function sendRPC(url)
{
// Если RPC задерживается, ждать завершения обработки запроса
if (timer)
{
setTimeout("sendRPC('" + url + "')", 71); // повтор через 71мсек
return;
}
rpcComplete = false;
var newScript = document.createElement('script');
newScript.src = url;
newScript.type = "text/javascript";
document.body.appendChild(newScript);
readResponse();
}
function checkSpelling(word)
{
var params = "word=" + word;
sendRPC(commandURL + params);
}
function readResponse()
{
if (!rpcComplete)
{
timer = setTimeout(readResponse, 50);
return;
}
// Обработка RPC завершена, проверяем результат
if (rpcResult === true)
alert("Слово записано правильно.");
else
alert("Слово записано с ошибками. Возможный правильный вариант " +
rpcResult);
timer = rpcResult = null;
}
//-->
</script>
</head>
<body>
<h2>Серверная проверка правописания</h2>
<form name="spellform" id="spellform" action="#" method="get">
Проверка правописания слова
<input type="text" name="word" id="word" value="npoвepить" />
<input type="button" value="check" onclick="checkSpelling(document.spellform.word.value);" />
</form>
</body>
</html>

Если вы введете "the" в поле ввода этого примера, CGI-сценарий сервера может возвратить

rpcComplete = true;
rpcResult = true;

Если вы введете слово с орфографическими ошибками, например "absquatalate", сервер должен возвратить исправленное слово:

rpcComplete = true;
rpcResult = "absquatulate";

Следует подчеркнуть одну особенность этого сценария: нельзя посылать новый RPC-запрос в то время, когда обрабатывается предыдущий, - следует подождать завершения обработки первого запроса. Если браузер уже начал загрузку элемента <script> первого RPC, мы не сможем ее остановить, так что, если в это время запустить другой RPC-запрос, возникнет риск конфликта возвращаемых значений. Но эта проблема разрешима. Например, можно использовать массивы таймеров и возвращаемых значений, с помощью которых управлять множеством конкурирующих запросов. Другим, более элегантным подходом является использование функций обратного вызова.
назад:
далее:


добавить комментарий
(без перезагрузки и регистрации)


10 случайных разделов

Что ищем на сайте ?


Примеры кода на сайте







@ 2008-2011 Amber
При использовании материалов ссылка на сайт обязательна
Яндекс.Метрика