Php plus in get

Можно ли сохранить знаки плюса в PHP $ _GET без кодирования?

Очевидно, я мог кодировать данные перед отправкой, а затем декодировать их, но мне интересно, является ли это единственным решением. Я мог бы также заменить пробелы символами плюс, но я хочу также разрешить пробелы. Я просто хочу, чтобы любые символы были переданы без каких-либо расшифровки или кодировки url. Спасибо!

Конечно. Вы можете прочитать $_SERVER[«QUERY_STRING»] , разбить его самостоятельно, а затем отказаться от обычного декодирования URL-адресов или только конвертировать %xx обратно.

preg_match_all('/(\w+)=([^&]+)/', $_SERVER["QUERY_STRING"], $pairs); $_GET = array_combine($pairs[1], $pairs[2]); 

(Пример работает только для буквенно-цифровых параметров и не выполняет упомянутое декодирование% xx. Просто разрывает исходный вход.)

if(strpos($_SERVER["QUERY_STRING"], "+") !== false)

Вы можете использовать urlencode , хотя это также переводит любые пробелы в плюс. Это имеет смысл, потому что + в URL обычно представляет собой пробел. Если вам действительно нужен знак «плюс», означающий знак «плюс», вы, вероятно, должны избегать ввода. Это означает, что + станет %2B а ваш URL будет http://mydomain.com/script.php?var=2%2B2 .

Кто-то генерирует URL-адрес, содержащий + в сегменте запроса, является неправильным, если только они не намерены представлять символ пробела. A + в запросе является зарезервированным символом (re: RFC2396 §3.4 ). Если вам нужно вставить литерал + в строку запроса, он должен быть закодирован как %2B (re: RFC2396 §2.2 ).

Для справок в будущем вы можете сделать символ «+» отображаться в запросе на получение без необходимости отправки url с закодированными символами.

Для этого требуется несколько шагов.

  • Просто замените свой параметр запроса плюс (+) знаком «% 2B» в URL-адресе перед запросом URL-адреса.
  • Теперь вы просто получите параметр запроса. Он автоматически заменит «% 2B» знаком «плюс».

Я просто использовал urlencode() для корректного кодирования URL и urldecode($_Get()) чтобы снова использовать строку.

Источник

PHP — Plus sign with GET query

If you’ll read the entirety of that bug report you’ll see a reference to RFC 2396. Which states that + is reserved. PHP is correct in translating an unencoded + sign to a space.

You could use urlencode() the ciphertext when returning it to the user. Thus, when the user submits the ciphertext for decryption, you can urldecode() it. PHP will do this automatically for you if it comes in via the GET string as well.

Читайте также:  Php выделить целую часть числа

Bottom line: The + must be submitted to PHP as the encoded value: %2B

Solution 2

I realize that this is an old question, but I was looking for a solution to a similar problem with + signs in a GET string. I stumble upon this page and thought I would share the solution I came up with.

 if ($_GET['method'] == "encrypt") < $output= base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $string, MCRYPT_MODE_CBC, md5(md5($key)))); >echo $output; ?> 

Solution 3

none of the above answers worked for me, I fixed the «+» sign problem using

Solution 4

You should be using urlencode() before putting the encrypted string on the query string, which will «escape» any special characters (including + ) and then call urldecode() before decrypting it, to revert them back to their original form.

Solution 5

We ran into the same problem trying to pass a URL to a PHP script with a string variable containing the «+» symbol. We were able to make it work with;

var modelString = "SEACAT+PROFILER"; modelString = encodeURIComponent(modelString); //"SEACAT%2BPROFILER" 

The %2B passes the correct value to the PHP GET as @hobodave said, and we get back the right data set.

Hope this helps someone else who ran into something like this, and needed a slightly different take on the examples above.

user

Comments

 if ($_GET['method'] == "encrypt") < $output= base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $string, MCRYPT_MODE_CBC, md5(md5($key)))); >echo $output; ?> 

An example of a URL to encrypt a string would look like this: Encrypt.php?method=encrypt&str=the quick fox Which would return this as the encrypted string: LCuT/ieVa6cl3/4VtzE+jd9QPT3kvHYYJFqG6tY3P0Q= Now to decrypt the string all you have to do is change the «method» query to «decrypt», like so: Encrypt.php?method=decrypt&str=LCuT/ieVa6cl3/4VtzE+jd9QPT3kvHYYJFqG6tY3P0Q= The only problem is that when that encrypted string is decrypted it returns this: ¬ƒ§rYV>̳5Äš·nßì(ñïX8Þ;b I have narrowed down the problem to the plus sign that is in the encrypted string. PHP’s GET method seems to translate a plus sign into a blank space. I have searched this bug and found out that it has already been filed here. I have tried different methods listed on that page and others with no success. The closest I got is by using this:

$fixedstring = str_replace(" ", "+", $string); 

and then using $fixedstring in the encryption methods, the problem is, upon decryption, all blank spaces are converted to plus signs. Any ideas? I know using POST would make more sense but I am using GET for specific reasons. I will spare the details.

Читайте также:  Json html parsing error

This is the correct answer to your problem. If you want to use a literal plus sign anywhere in a URL, regardless of the server-side language used, it MUST be encoded, such as by replacing it with «%2B». This is because plus signs in URLs are used as a stand in for space characters, and any server-side scripts will interpret them correctly as space characters.

Thanks! Seeing the code laid out helped me. I needed to preserve the plus character in the query variable for use in a script that passed the query variable in a header for an API request. Simply encoding, replacing + with %2B, and then decoding the variable does just that.

WRONG. RFC 2396 was made obsolete by RFC 3986 in 2005, which states that query strings in uri’s are composed of pchars, and pchars include all unreserved characters as well as the «sub delimiters» of which the «+» character is included. rfc-editor.org/rfc/rfc3986.txt see section 2.2 reserved characters section 3.3 path section 3.4 query

Robert Sinclair

Salem

That’s the only code worked for me, I was unable to delete file with + sign in it name, now it’s deleted perfectly .

Источник

Знак PHP – Plus с запросом GET

У меня есть PHP-скрипт, который выполняет базовое шифрование строки с помощью метода ниже:

php $key = 'secretkey'; $string = $_GET['str']; if ($_GET['method'] == "decrypt") < $output = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($string), MCRYPT_MODE_CBC, md5(md5($key))), "\0"); >if ($_GET['method'] == "encrypt") < $output= base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $string, MCRYPT_MODE_CBC, md5(md5($key)))); >echo $output; ?> 

Пример URL-адреса для шифрования строки будет выглядеть так:

Encrypt.php? Method = encrypt & str = быстрая лиса

Что бы вернуть это как зашифрованную строку:

LCuT / ieVa6cl3 / 4VtzE + jd9QPT3kvHYYJFqG6tY3P0Q =

Теперь для дешифрования строки все, что вам нужно сделать, это изменить запрос метода на «расшифровать», например:

Encrypt.php? Метод = дешифровать & ул = LCuT / ieVa6cl3 / 4VtzE + jd9QPT3kvHYYJFqG6tY3P0Q =

Читайте также:  Simple html login template

Единственная проблема заключается в том, что когда эта зашифрованная строка расшифровывается, она возвращает это:

Я сузил проблему до знака плюса, который находится в зашифрованной строке. Метод GET PHP, похоже, переводит знак плюса в пустое пространство. Я искал эту ошибку и узнал, что она уже подана здесь . Я пробовал разные методы, перечисленные на этой странице, и другие без успеха. Самое близкое, что я получил, это:

$fixedstring = str_replace(" ", "+", $string); 

а затем используя $ fixedstring в методах шифрования, проблема заключается в том, что при расшифровке все пробелы преобразуются в знаки плюс. Есть идеи?

Я знаю, что использование POST имеет смысл, но я использую GET по определенным причинам. Я пощажу детали.

Если вы прочитаете весь отчет об ошибке, вы увидите ссылку на RFC 2396 . Что означает, что + зарезервировано . PHP корректен при переводе знака unencoded + в пробел.

Вы можете использовать urlencode () зашифрованный текст, когда возвращаете его пользователю. Таким образом, когда пользователь отправляет шифрованный текст для дешифрования, вы можете urldecode () его. PHP будет делать это автоматически для вас, если он входит через строку GET.

Итог: + должен быть отправлен на PHP в виде закодированного значения:% 2B

Я понимаю, что это старый вопрос, но я искал решение аналогичной проблемы с + знаками в строке GET. Я натыкаюсь на эту страницу и думаю, что поделюсь решением, которое я придумал.

 if ($_GET['method'] == "encrypt") < $output= base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $string, MCRYPT_MODE_CBC, md5(md5($key)))); >echo $output; ?> 

Вы должны использовать urlencode() перед тем, как поместить зашифрованную строку в строку запроса, которая « urldecode() » от любых специальных символов (включая + ), а затем вызовет urldecode() перед расшифровкой, чтобы вернуть их обратно в исходную форму.

  • получение youtube video id PHP
  • Получить текст из тега опций в PHP
  • $ _SERVER с сообщением HTTP GET и CLI
  • Поиск строк и строк возврата PHP
  • Правильный синтаксис URL гиперссылки с PHP $ _GET
  • Как отправить запрос GET с PHP?
  • Пропустить массив с помощью ключей через HTTP GET
  • Пытаясь использовать завиток для выполнения GET, отправляемое значение допускает null
  • GET & Command — Неправильно
  • JavaScript эквивалентен PHP-методу __get () магии
  • Класс рефлексии PHP. Как получить значения свойств?
  • Проверка правильной формы ответа и отправки

Источник

Оцените статью