PHP - GET sorgu ile Artı işareti

3 Cevap php

Ben aşağıda yöntemi ile bir dize temel şifreleme yapan bir PHP komut dosyası var:

<?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;
?>

Bir dize şifrelemek için bir URL örneği şuna benzer:

Encrypt.php? Yöntemi = şifrelemek & str = hızlı tilki

Şifreli bir dize olarak bu dönecekti Hangi:

LCuT/ieVa6cl3/4VtzE + jd9QPT3kvHYYJFqG6tY3P0Q =

Şimdi dize şifresini yapmanız gereken bu yüzden gibi, "deşifre" etmek "yöntem" sorguyu değiştirmektir:

Encrypt.php?method=decrypt&str=LCuT/ieVa6cl3/4VtzE + jd9QPT3kvHYYJFqG6tY3P0Q =

Tek sorun o şifreli dize deşifre olduğunda bu döndürür olduğunu:

B; ¬ ƒ rYV} Ì ³ 5aS · nßì (ñïX8Þ §

Ben şifreli string içinde artı işareti sorunu daralmış. PHP'nin GET yöntemi bir boş alana bir artı işareti çevirmek gibi görünüyor. Ben bu hatayı araştırdım ve zaten dava olduğunu öğrendim here. Ben hiçbir başarı ile bu sayfada ve diğerleri listelenen farklı yöntemler denedim. I got yakın bu kullanmaktır:

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

ve daha sonra şifreleme yöntemlerinde $ fixedstring kullanılarak problem çözme üzerine, tüm boşluklar artı işaretleri dönüştürülür vardır. Herhangi bir fikir?

I know using POST would make more sense but I am using GET for specific reasons. I will spare the details.

3 Cevap

Eğer bu hata raporunun tamamını okumak olacak eğer RFC 2396 bir başvuru görürsünüz. + Kılyorduk reserved. PHP bir alana bir şifresiz + işaretini çeviri doğrudur.

Kullanıcıya iade zaman () şifreli urlencode kullanabilirsiniz. Kullanıcı şifre çözme için şifreli gönderdiğinde Böylece, () bunu UrlDecode edebilirsiniz. O da GET dizesi yoluyla gelirse PHP sizin için otomatik olarak yapacaktır.

Bottom line: + kodlanmış değer olarak PHP teslim edilmelidir:% 2B

Bu eski bir soru olduğunu biliyoruz, ama ben bir GET dize + işaretleri ile benzer bir sorun için bir çözüm arıyordu. Bu sayfada takılmaları ve ben ile geldi çözüm paylaşmak düşündüm.

<?php
$key = 'secretkey';
$string = $_GET['str'];

if ($_GET['method'] == "decrypt")
{
    $string = urlencode($string);
    $string = str_replace("+", "%2B",$string);
    $string = urldecode($string);
    $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;
?>

Kullandığınız urlencode() before putting the encrypted string on the query string, which will "escape" any special characters (including +) ve ardından aramak gerektiğini urldecode() geri orijinal form onları dönmek, şifresini önce.