2010-04-20 16 views
24

Ho uno script PHP che fa la crittografia di base di una stringa mediante il metodo seguito:PHP - segno più con richiesta GET

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

Un esempio di URL per crittografare una stringa sarebbe simile a questa:

?

Encrypt.php method = Encrypt & str = rapido volpe

quale sarebbe tornato questo come la stringa crittografata:

LCUT/ieVa6cl3/4VtzE + jd9QPT3kvHY YJFqG6tY3P0Q =

Ora per decriptare la stringa di tutto ciò che dovete fare è modificare la query "metodo" a "decifrare", in questo modo:?

Encrypt.php method = decifrare & str = LCUT/ieVa6cl3/4VtzE + jd9QPT3kvHYYJFqG6tY3P0Q =

l'unico problema è che quando viene decifrato che stringa crittografata restituisce questo:

¬ƒ§rYV} ̳5Äš · NSSI (ñïX8Þ; b

ho ristretto il problema alla segno più questo è nella stringa crittografata. Il metodo GET di PHP sembra tradurre un segno più in uno spazio vuoto. Ho cercato questo bug e ho scoperto che è già stato archiviato here. Ho provato diversi metodi elencati in quella pagina e altri senza successo. Il più vicino ho ottenuto è quello di utilizzare questo:

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

e quindi utilizzando $ fixedstring nei metodi di crittografia, il problema è, su decrittazione, tutti gli spazi vuoti vengono convertiti in segni più. Qualche idea?

So che usare il POST avrebbe più senso, ma sto utilizzando GET per motivi specifici. Risparmierò i dettagli.

risposta

32

Se leggerai la totalità di tale segnalazione di bug vedrai un riferimento a RFC 2396. Quale dichiara che + è riservato. PHP è corretto nel tradurre un segno + non codificato in uno spazio.

È possibile utilizzare urlencode() il testo cifrato quando si restituisce all'utente. Pertanto, quando l'utente invia il testo cifrato per la decrittografia, è possibile urldecode(). PHP lo farà automaticamente per te se arriva anche attraverso la stringa GET.

riassumere: Il + deve essere presentata a PHP come valore codificato:% 2B

+0

So che è una risposta semplice, ma sto inviando tramite GET per un certo motivo. – user

+2

Questa è la risposta corretta al tuo problema. Se si desidera utilizzare un segno più letterale ovunque in un URL, indipendentemente dal linguaggio utilizzato sul lato server, DEVE essere codificato, ad esempio sostituendolo con "% 2B". Ciò è dovuto al fatto che più segni negli URL vengono utilizzati come riferimento per i caratteri dello spazio e qualsiasi script sul lato server li interpreterà correttamente come caratteri di spazio. – thomasrutter

+0

ah whoops vedo questa risposta è stata modificata. Oh bene, ora è corretto. +1 – thomasrutter

4

Si deve usare urlencode() prima di mettere la stringa cifrata sulla stringa di query, che "fuga" caratteri speciali (incluso +) e quindi chiamare urldecode() prima di decrittografarlo, per ripristinarli nella loro forma originale.

+0

Semplice; al punto. Grazie! –

10

Mi rendo conto che questa è una domanda vecchia, ma cercavo una soluzione a un problema simile con i segni + in una stringa GET. Mi sono imbattuto in questa pagina e ho pensato di condividere la soluzione che ho trovato.

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

Grazie! Vedere il codice disposto mi ha aiutato. Avevo bisogno di preservare il carattere più nella variabile di query da utilizzare in uno script che ha passato la variabile di query in un'intestazione per una richiesta API. Semplicemente codificando, sostituendo + con% 2B, e quindi decodificando la variabile fa proprio questo. –

Problemi correlati