Я получаю строку из внешнего клиентского скрипта, который позже должен быть присоединен как часть 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