ऐसा लगता है कि आपके लक्ष्य 1. से दृश्यमान रूप से एक यूआरएल अस्पष्ट हैं, और 2. आमतौर पर URL में उपयोग के लिए कॉम्पैक्टली डेटा को एन्कोड करें।
सबसे पहले, हमें URL को अस्पष्ट करने की आवश्यकता है। चूंकि यूआरएल बेस 64 डिक्शनरी का अधिक उपयोग करते हैं, इसलिए कोई भी एन्कोडिंग जो बाइनरी उत्पन्न करती है (जो तब बेस 64-एड होना चाहिए) शायद आकार को बढ़ाएगी। urlencode()
लागू होने पर बचने के लिए न्यूनतम आवश्यकता के साथ शब्दकोश को यूआरएल-सुरक्षित श्रेणी में रखना सबसे अच्छा है। अर्थात।
/**
* Rot35 for URLs. To avoid increasing size during urlencode(), commonly encoded
* chars are mapped to more rarely used chars (end of the uppercase alpha).
*
* @param string $url
* @return string
*/
function rotUrl($url) {
return strtr($url,
'abcdefghijklmnopqrstuvwxyz0-:/?=&%#123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ',
'123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0-:/?=&%#');
}
अब, बाइट्स को बचाने के लिए, हम यूआरएल स्कीमा एक चार में सांकेतिक शब्दों में बदलना कर सकते हैं (जैसे कि, HTTPS के लिए HTTP के लिए h
, H
), और आधार में आयाम परिवर्तित 32. रैपिंग इस अप: यदि आप इस हैं:
function obscure($width, $height, $url) {
$dimensions = base_convert($width, 10, 32) . "."
. base_convert($height, 10, 32) . ".";
preg_match('@^(https?)://(.+)@', $url, $m);
return $dimensions . (($m[1] === 'http') ? 'h' : 'H') . rotUrl($m[2]);
}
function unobscure($str) { /* exercise for the reader! */ }
$url = 'https://en.wikipedia.org/w/index.php?title=Special%3ASearch&search=Base64';
$obs = obscure(550, 300, $url);
// h6.9c.H5E.N9B9G5491.FI7UNU9E45O.G8GVK9KC5W-G5391CYcj-51I38XJ51I38Wk1J5fd
चूंकि हम गैर यूआरएल-सुरक्षित वर्ण से बचा, अगर यह (urlencode
साथ) एक क्वेरी स्ट्रिंग में डाल रहा है, यह भी नहीं बढ़ता है बहुत (इस मामले में बिल्कुल नहीं)।
इसके अतिरिक्त आप इस स्ट्रिंग पर हस्ताक्षर करना चाहेंगे ताकि लोग जो एन्कोडिंग को जानते हों वे अभी भी यूआरएल के माध्यम से अपने पैरामीटर निर्दिष्ट नहीं कर सकते हैं। इसके लिए आप HMAC का उपयोग करेंगे, और बेस 64URL-हैश एन्कोड करें। आप अंतरिक्ष को बचाने के लिए हैश (~ 6 बिट प्रति चरित्र) के एक सबस्ट्रिंग को भी रख सकते हैं।
function sign($key, $data) {
return $data . _hmac($key, $data, 8);
}
function verify($key, $signed) {
$mac = substr($signed, -8);
$data = substr($signed, 0, -8);
return $mac === _hmac($key, $data, 8) ? $data : false;
}
function _hmac($key, $data, $macLength) {
$mac = substr(base64_encode(hash_hmac('sha256', $data, $key, true)), 0, $macLength);
return strtr($mac, '+/', '-_'); // for URL
}
$key = "Hello World!";
$signed = sign($key, $obs); // appends MAC: "w-jjw2Wm"
$obs = verify($key, $signed); // strips MAC and returns valid data, or FALSE
अपडेट:: एक बेहतर RotURL functionsign()
(नीचे) एक 8 चरित्र मैक (6 बिट्स/चार पर हैश के 48 बिट) कहते हैं।
क्या कोई विशेष कारण है कि पोस्ट या सत्र का उपयोग न करें? वे पृष्ठ –
के बीच डेटा के उचित आकार के हिस्सों को पारित करने के लिए बहुत बेहतर अनुकूल हैं पोस्ट का उपयोग करना वास्तव में संभव नहीं है (मुझे वैसे भी लगता है)। इसका उपयोग छवि और उसके आयाम (जो एन्कोडेड स्ट्रिंग के अंदर एक धारावाहिक सरणी में हैं) प्राप्त करने के लिए किया जा रहा है। इसे मानक एचटीएमएल टैग के साथ काम करना है। – Sk446
मैं उलझन में हूँ। क्या आप सर्वर से या ब्राउज़र से छवि भेज रहे हैं? –