Почему URI.escape не экранирует одинарные кавычки? - PullRequest
12 голосов
/ 12 октября 2011

Почему URI.escape не экранирует одинарные кавычки?

URI.escape("foo'bar\" baz")
=> "foo'bar%22%20baz"

Ответы [ 4 ]

10 голосов
/ 12 октября 2011

По той же причине оно не ускользает ? или / или : и так далее.URI.escape() экранирует только символы, которые нельзя использовать в URL-адресах вообще , а не символы, имеющие особое значение.

Вам нужно узнать CGI.escape():

require "cgi"
CGI.escape("foo'bar\" baz")
=> "foo%27bar%22+baz"
4 голосов
/ 12 июля 2013

Это старый вопрос, но ответ долгое время не обновлялся.Я думал, что обновлю это для тех, у кого такая же проблема.Решение, которое я нашел, было размещено здесь : используйте ERB::Util.url_encode, если у вас есть модуль erb.Это позаботилось и об одинарных кавычках и * для меня.

CGI::escape неправильно закрывает пробелы (%20) и знаки плюс.

1 голос
/ 09 марта 2014

Согласно документам, URI.escape(str [, unsafe]) использует регулярное выражение, которое соответствует всем символам, которые должны быть заменены кодами.По умолчанию метод использует REGEXP :: UNSAFE.Когда этот аргумент является строкой, он представляет собой набор символов.

В вашем случае, чтобы изменить URI.escape, чтобы избежать даже одинарных кавычек, вы можете сделать что-то вроде этого ...

reserved_characters = /[^a-zA-Z0-9\-\.\_\~]/
URI.escape(YOUR_STRING, reserved_characters)

Объяснение: Некоторая информация о спецификации ...

Все имена и значения параметров экранируются с помощью механизма [rfc3986] процентного кодирования (% xx).Символы, не входящие в незарезервированный набор символов (раздел 2.3 [rfc3986]), должны быть закодированы.символы в незарезервированном наборе символов не должны кодироваться.шестнадцатеричные символы в кодировках должны быть в верхнем регистре.текстовые имена и значения должны быть закодированы как октеты utf-8, прежде чем они будут кодироваться в процентах согласно [rfc3629].

0 голосов
/ 28 марта 2017

Я знаю, что на этот вопрос уже получен ответ, но то, что я хотел, было чем-то немного другим, и я подумал, что я мог бы также опубликовать это: я хотел оставить "/" в URL, но избежать всех других нестандартныхперсонажи.Я сделал это так:

#public filename is a *nix filepath, 
#like `"/images/isn't/this a /horrible filepath/hello.png"`

public_filename.split("/").collect{|s| ERB::Util.url_encode(s)}.join("/")
=> "/images/isn%27t/this%20a%20/horrible%20filepath/hello.png"

Мне нужно было избегать одинарных кавычек, когда я писал аннулирование кэша для AWS Cloudfront, которому не нравились одинарные кавычки и ожидалось, что они будут экранированы.Вышеприведенное должно создать URI, который более безопасен, чем стандартный URI.escape, но который по-прежнему выглядит как URI (CGI Escape нарушает формат URI, экранируя "/").

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...