Нужно ли всё экранирование encodeURIComponent?

Понятно, что encodeURIComponent нужен чтобы предотвратить неоднозначности в парсинге url, а также избежать проблем с кодировкой. Но действительно ли всё производимое экранирование требуется для query-параметров (именно для них, а не для любой части адреса)? Например, следующие ссылки работают одинаково:

https://www.google.com/search?q=[1,{"a":"b"}]
https://www.google.com/search?q=%5B1%2C%7B%22a%22%3A%22b%22%7D%5D

скриншот

Я хочу сделать более красивый адрес, для чего требуется отказаться от экранирования скобок, кавычек, двоеточия и запятой. Безопасно ли так поступать, может ли что-то сломаться и не появятся ли из-за этого какие-то уязвимости?

function beautifulEncode(s) {
  return encodeURIComponent(s).replace(/%../g, m => ({
    "%5B": '[',
    "%5D": ']',
    "%7B": '{',
    "%7D": '}',
    "%2C": ',',
    "%3A": ':',
    "%22": '"',
  }[m] || m))
}

console.log(beautifulEncode(JSON.stringify([1, {a: "b"}])))
console.log(beautifulEncode(JSON.stringify([1, {'A&B+1': "I'm here"}])))

PS: Этот вопрос на английском.


Ответы (0 шт):