2010-04-20 9 views
24

मुझे लगता है कि नीचे दी गई विधि के माध्यम से एक स्ट्रिंग के बुनियादी एन्क्रिप्शन करता है एक 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; 
?> 

एक यूआरएल एक स्ट्रिंग एन्क्रिप्ट करने के लिए का एक उदाहरण इस प्रकार दिखाई देगा:

?

Encrypt.php विधि = एन्क्रिप्ट & str = त्वरित लोमड़ी

कौन सा एन्क्रिप्टेड स्ट्रिंग के रूप में वापसी होगी:

LCuT/ieVa6cl3/4VtzE + jd9QPT3kvHY YJFqG6tY3P0Q =

अब स्ट्रिंग डिक्रिप्ट करने के लिए तुम सब करने की "विधि" क्वेरी बदल जाता है "डिक्रिप्ट" करने के लिए है, इसलिए जैसे:

Encrypt.php विधि = डिक्रिप्ट & str = LCuT/ieVa6cl3/4VtzE + jd9QPT3kvHYYJFqG6tY3P0Q =

केवल समस्या यह है कि जब कि एन्क्रिप्टेड स्ट्रिंग decrypted है यह इस रिटर्न है:

¬ƒ§rYV} ̳5Äš · nßì (ñïX8Þ;

ख मैं करने के लिए समस्या को संकुचित होता है पलस हसताक्षर वह एन्क्रिप्टेड स्ट्रिंग में है। PHP की GET विधि एक प्लस साइन का एक रिक्त स्थान में अनुवाद करने लगती है। मैंने इस बग की खोज की है और पता चला है कि इसे पहले से ही here दायर किया गया है। मैंने उस पृष्ठ पर सूचीबद्ध विभिन्न विधियों और अन्य सफलता के बिना प्रयास किए हैं। निकटतम मुझे मिल गया इस का उपयोग करना है:

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

और फिर एन्क्रिप्शन तरीकों में $ fixedstring का उपयोग कर, समस्या, डिक्रिप्शन पर, सभी रिक्त रिक्त स्थान के लिए धन चिह्न परिवर्तित कर रहे हैं। कोई विचार?

मुझे पता है कि POST का उपयोग करना अधिक समझ में आता है लेकिन मैं विशिष्ट कारणों से जीईटी का उपयोग कर रहा हूं। मैं विवरण छोड़ दूंगा।

उत्तर

32

यदि आप उस बग रिपोर्ट की संपूर्णता पढ़ लेंगे तो आपको RFC 2396 का संदर्भ दिखाई देगा। जो बताता है कि + आरक्षित है। एक अंतरिक्ष में एक unencoded + साइन अनुवाद करने में PHP सही है।

उपयोगकर्ता को लौटने पर आप ciphertext urlencode() का उपयोग कर सकते हैं। इस प्रकार, जब उपयोगकर्ता डिक्रिप्शन के लिए सिफरटेक्स्ट सबमिट करता है, तो आप इसे urldecode() कर सकते हैं। जीईटी स्ट्रिंग के माध्यम से आने पर PHP आपके लिए स्वचालित रूप से ऐसा करेगा।

निष्कर्ष: किसी + इनकोडिंग मूल्य के रूप में PHP के लिए प्रस्तुत किया जाना चाहिए:% 2 बी

+0

मुझे पता है कि यह एक साधारण जवाब है लेकिन मैं एक निश्चित कारण के लिए जीईटी के माध्यम से भेज रहा हूं। – user

+2

यह आपकी समस्या का सही उत्तर है। यदि आप यूआरएल में कहीं भी एक शाब्दिक प्लस साइन का उपयोग करना चाहते हैं, तो सर्वर-साइड भाषा के इस्तेमाल के बावजूद, इसे एन्कोड किया जाना चाहिए, जैसे इसे "% 2 बी" से बदलना। ऐसा इसलिए है क्योंकि URL में प्लस संकेत अंतरिक्ष वर्णों के लिए स्टैंड के रूप में उपयोग किए जाते हैं, और किसी भी सर्वर-साइड स्क्रिप्ट उन्हें वर्ण वर्णों के रूप में सही ढंग से व्याख्या करेंगे। – thomasrutter

+0

आह जो मुझे यह जवाब दिखाई देता है संपादित किया गया है। ओह ठीक है, अब यह सही है। +1 – thomasrutter

4

आप क्वेरी स्ट्रिंग है, जो "पलायन" होगा कोई विशेष वर्ण पर एन्क्रिप्टेड स्ट्रिंग डालने से पहले urlencode() का उपयोग करना चाहिए (+ सहित) और फिर इसे डीक्रिप्ट करने से पहले urldecode() पर कॉल करें, उन्हें वापस अपने मूल रूप में वापस करने के लिए।

+0

सरल; मुद्दे पर। धन्यवाद! –

10

मुझे एहसास है कि यह एक पुराना सवाल है, लेकिन मैं एक जीईटी स्ट्रिंग में + संकेतों के साथ एक समान समस्या का हल ढूंढ रहा था। मैं इस पृष्ठ पर ठोकर खाई और सोचा कि मैं उस समाधान को साझा करूंगा जिसके साथ मैं आया था।

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

धन्यवाद! रखे गए कोड को देखकर मेरी मदद की। मुझे एक स्क्रिप्ट में उपयोग के लिए क्वेरी वैरिएबल में प्लस कैरेक्टर को संरक्षित करने की आवश्यकता है जो एपीआई अनुरोध के लिए हेडर में क्वेरी वैरिएबल पास करता है। बस एन्कोडिंग,% 2 बी के साथ + को बदलना, और उसके बाद वैरिएबल को डीकोड करना बस यही करता है। –