Санитарная обработка пользовательского ввода как части URL - PullRequest
0 голосов
/ 14 сентября 2011

Я получаю строку из внешнего клиентского скрипта, который позже должен быть присоединен как часть URL. Теперь я задаюсь вопросом, каков наилучший способ санитизировать такие данные?

Строка, которую я получу, будет иметь такую ​​структуру:
dynamicVal#staticVal:dynamicVal

Это значение будет добавлено к URL:
http://the-page.com/dynamicVal#staticVal:dynamicVal

URL-адрес затем используется следующим образом:

$link = htmlspecialchars("http://external-page.com/dynamicVal#staticVal:dynamicVal", ENT_QUOTES);
$var = "<a href=\"javascript: window.open('$link')\">'Open URL'</a>";

Проблема в том, что htmlspecialchars не поможет предотвратить выполнение случайного кода JavaScript, например добавив это предупреждение к значению:

dynamicVal#staticVal:dynamicVal'+alert(\"breakout\")+'

Использование rawurlencode также не поможет, поскольку это не значение параметра, а реальная часть URL.
Итак, каков наилучший способ очистки переданной строки при конкатенации к URL-адресу?

Заранее спасибо.

Edit: Использование rawurlencode только на динамических частях на самом деле также не решило проблему, JavaScript все еще выполнялся.
Тестовый фрагмент:

$splitVal = "#staticVal:";
$tmpArr = explode($splitVal, "dynamicVal#staticVal:dynamicVal'+alert(\"breakout\")+'");
$link = htmlspecialchars(sprintf("http://external-page.com/"."%s$splitVal%s", rawurlencode($tmpArr[0]), rawurlencode($tmpArr[1])), ENT_QUOTES);
echo "<a href=\"javascript: window.open('$link')\">'Open URL'</a>";

Edit2: Использование json_encode при передаче строки в качестве аргумента JavaScript также не помогло. Адаптированный тестовый фрагмент:

$splitVal = "#staticVal:";
$tmpArr = explode($splitVal, "dynamicVal#staticVal:dynamicVal\"+alert('breakout')+\"");
$link = htmlspecialchars(sprintf("http://external-page.com/"."%s$splitVal%s", rawurlencode($tmpArr[0]), rawurlencode($tmpArr[1])), ENT_QUOTES);
echo  "<a href=\"javascript: window.open(".htmlspecialchars(json_encode($link), ENT_QUOTES).")\">'Open URL'</a>";

Адаптация сделана:
Поменял кавычки в яблочном JS.
Перемещено htmlspecialchars вокруг json_encode, потому что возвращается строка в двойных кавычках, что в противном случае нарушит HTML

Ответы [ 2 ]

3 голосов
/ 14 сентября 2011

Вы должны использовать urlencode() для этого.Не на всю строку, а только на динамические части.

$link = sprintf('http://external-page.com/%s#staticVal:%s', urlencode('dynamicVal'), urlencode('dynamicVal'));
$var  = "<a href=\"javascript: window.open('$link')\">'Open URL'</a>";

РЕДАКТИРОВАТЬ :

ОК.Я не осознавал, что вы вставляете код в вызов функции JavaScript.Вам нужно убедиться, что интерпретатор JavaScript обрабатывает вашу ссылку как строковый аргумент для window.open():

$link = sprintf('http://external-page.com/%s#staticVal:%s', urlencode('dynamicVal'), urlencode('dynamicVal'));
$var  = "<a href=\"javascript: window.open(".json_encode($link).")\">'Open URL'</a>";
0 голосов
/ 15 сентября 2011

Для полноты я смог решить эту проблему, просто поместив addslashes в динамическую часть перед использованием rawurlencode.
Оба вызова функций необходимы, чтобы предотвратить их появление. Использование addslashes предотвращает использование обычных кавычек (', "), а rawurlencode предотвращает нанесение уже закодированных кавычек (%29, %22).

Итак, окончательное решение выглядит так:

$splitVal = "#staticVal:";
$tmpArr = explode($splitVal, "dynamicVal#staticVal:dynamicVal'+alert(\"breakout\")+'");
$link = htmlspecialchars(sprintf("http://external-page.com/"."%s$splitVal%s", rawurlencode(addslashes($tmpArr[0])), rawurlencode(addslashes($tmpArr[1]))), ENT_QUOTES);
echo "<a href=\"javascript: window.open('$link')\">'Open URL'</a>";
...