Parece que sus objetivos son 1. a ocultar visualmente una URL, y 2. a generalmente codifican los datos de manera compacta para usarlos en una URL.
Primero, necesitamos ocultar la URL. Como las URL usan gran parte del diccionario Base64, cualquier codificación que produzca código binario (que luego tiene que ser Base64-ed) probablemente solo aumente el tamaño. Lo mejor es mantener el diccionario en el rango de URL segura con una mínima necesidad de escaparse cuando se aplica urlencode()
. Es decir. desea que esta:
/**
* 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-:/?=&%#');
}
Ahora, para el ahorro de bytes, que puede codificar el esquema URL en un char (por ejemplo, h
para HTTP, HTTPS para H
), y convertir las dimensiones en la base 32. Envoltura esto:
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
Desde evitamos caracteres no-URL seguro, si esto se pone en una cadena de consulta (con urlencode
), que no crece mucho (en este caso no en todos).
Además, es posible que desee firmar esta cadena para que las personas que conocen la codificación todavía no puedan especificar sus propios parámetros a través de la URL. Para esto, usaría HMAC, y Base64URL-codificaría el hash. También puede mantener una subcadena del hash (~ 6 bits por carácter) para ahorrar espacio.sign()
(abajo) añade un carácter 8 MAC (48 bits del hash de 6 bits/char):
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
Actualizar: una mejor RotURL function.
¿Hay alguna razón en particular para no usar POST o Sesiones en su lugar? Son mucho más adecuados para pasar trozos de datos de tamaño justo entre las páginas –
No es posible utilizar la publicación (creo que de todos modos). Se usa para obtener una imagen y sus dimensiones (que están en una matriz serializada dentro de la cadena codificada). Tiene que funcionar con una etiqueta estándar html . – Sk446
Estoy confundido. ¿Estás enviando la imagen desde el servidor o desde el navegador? –