Лучший способ безопасно прочитать параметры строки запроса? - PullRequest
3 голосов
/ 24 сентября 2008

У нас есть проект, который генерирует фрагмент кода, который можно использовать в других проектах. Цель кода - прочитать два параметра из строки запроса и назначить их атрибуту "src" в iframe.

Например, страница по URL http://oursite/Page.aspx?a=1&b=2 будет иметь JavaScript для чтения параметров "a" и "b". Затем JavaScript установит атрибут «src» iframe на основе этих параметров. Например, "

В настоящее время мы делаем это с помощью серверного кода, который использует библиотеку Microsoft Anti-Cross-Scripting для проверки параметров. Однако появилось новое требование о том, что нам нужно использовать JavaScript и что он не может использовать какие-либо сторонние инструменты JavaScript (такие как jQuery или Prototype).

Один из известных мне способов заключается в замене любых экземпляров «

Одним из параметров всегда является «P», за которым следуют 9 целых чисел. Другой параметр - это всегда 15 буквенно-цифровых символов. (Спасибо, Лиам, за то, что предложил мне это прояснить).

У кого-нибудь есть предложения для нас?

Большое спасибо за ваше время.

Ответы [ 5 ]

7 голосов
/ 24 сентября 2008

Не используйте escape и unescape, используйте decodeURIComponent. Например.

function queryParameters(query) {
  var keyValuePairs = query.split(/[&?]/g);
  var params = {};
  for (var i = 0, n = keyValuePairs.length; i < n; ++i) {
    var m = keyValuePairs[i].match(/^([^=]+)(?:=([\s\S]*))?/);
    if (m) {
      var key = decodeURIComponent(m[1]);
      (params[key] || (params[key] = [])).push(decodeURIComponent(m[2]));
    }
  }
  return params;
}

и передайте document.location.search.

Чтобы превратить <в & lt;, этого недостаточно, чтобы убедиться, что контент можно безопасно внедрить в HTML, не позволяя сценарию работать. Убедитесь, что вы избежали следующих <,>, &, и ".

Это не гарантирует, что параметры не были подделаны. Если вам необходимо убедиться, что один из ваших серверов сгенерировал URL, выполните поиск по подписи URL.

4 голосов
/ 24 сентября 2008

Я думаю, что лучше использовать белый список. Избегайте только удаления "плохих" вещей. Удалите все, кроме того, что вы считаете "безопасным".

Также я настоятельно рекомендую сделать HTMLEncode для параметров. Там должно быть много функций Javascript, которые могут это.

1 голос
/ 24 сентября 2008

вы можете использовать функции escape () и unescape () javascript.

0 голосов
/ 24 сентября 2008

Вы можете использовать регулярные выражения для проверки того, что у вас есть P, за которым следуют 9 целых чисел, и что у вас есть 15 буквенно-цифровых значений. Я думаю, что в этой книге, которую я держу за столом RegEx, есть несколько примеров на JavaScript, которые помогут вам.

Поможет ограничить набор символов только значениями ASCII, и следуйте всем советам выше (белый список, установите src через DOM и т. Д.)

0 голосов
/ 24 сентября 2008

Несколько вещей, которые вы должны делать:

  • Строго внесите в список допустимые значения, в соответствии с типом, форматом, диапазоном и т. Д.
  • Явно помещает в черный список определенные символы (даже если это обычно обходится), ЕСЛИ ваш белый список не может быть слишком узким.
  • Кодируйте значения перед выводом, если вы используете Anti-XSS, вы уже знаете, что простого HtmlEncode недостаточно
  • Установите свойство src через DOM - и не путем генерации фрагмента HTML
  • Используйте динамическое значение только в качестве параметра строки запроса, но не для произвольных сайтов; т. е. жестко указать имя сервера, целевой страницы и т. д.
  • Ваш сайт через SSL? В этом случае использование фрейма может привести к несоответствиям с интерфейсом SSL ...
  • Использование именованных фреймов в общем, позволяет разрешать спуфирование кадров; если на защищенном сайте это может быть соответствующий вектор атаки (для использования с фишингом и т. д.)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...