【问题标题】:PHP Encrypt and Decrypt Parameter URL in URLURL中的PHP加密和解密参数URL
【发布时间】:2018-04-21 15:00:15
【问题描述】:

我正在尝试在 GET 请求中将下载 URL 从第 1 页传递到第 2 页。

第 1 页通过数据库获取原始 URL,然后加密 URL 并使其在站点上可用。当它通过 URL 时,第 2 页会解密 URL 并下载文件。

当前网址如下所示:

https://example.com/download.php?dl=x6%1A%D8j%C4%D2%9Cx%8FA%8B%29%23Y%D9%D6%B4%DE8%18%2C%7B%F4%86l%B0%0A+%D3%B1%01I%CFo%FF%BA%9C%22%A1%08%11%DB%12%282%DEi%B5%CA%14K%FF%21%CB%F3%9D%3C9f%3C%09%FA9%BB%BD%C9%B2%275%F0%06%A2%80%08h%A7f%8C%87%28%A4%A5%99%A9%A9%FA%D6f%C5%CA%9B%81.%92%CD%89%FA3%5C%0C%F0%ED%F6%D9%1E%B9%D0%B1%CFSA%F4%95k%1EZ%D1%3A%D4H%1D%93%40%087%92%88%C3%A5p%C7WH%FA%CF%9D%BAKd%A0%9A%D7a6%80%5Ex%A5%87%07AK%D7%5BQ%10%98%07%7E%82%9A%BA9%25%D5%EA%03%FD%C2%9A%22%8FBW%94k%D8T%93%F5%E3%D7-

它包含很多 %%%,因为它是 urlencoded,有没有办法改变它以减少 URL 的长度并使它看起来不那么混乱,但保持它现在的安全?

希望有人能帮帮我。

这是加解密脚本:

define("ENCRYPTION_KEY", "ducksandpizza");

function encrypt($pure_string, $encryption_key) {
    $iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    $encrypted_string = mcrypt_encrypt(MCRYPT_BLOWFISH, $encryption_key, utf8_encode($pure_string), MCRYPT_MODE_ECB, $iv);

    return urlencode($encrypted_string);
}

function decrypt($encrypted_string, $encryption_key) {
    $iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    $decrypted_string = urldecode($encrypted_string);
    $decrypted_string = mcrypt_decrypt(MCRYPT_BLOWFISH, $encryption_key, $encrypted_string, MCRYPT_MODE_ECB, $iv);

    return $decrypted_string;
}

//$encrypted = encrypt($_GET['dl'], ENCRYPTION_KEY);
$decrypted = decrypt($_GET['dl'], ENCRYPTION_KEY);

//echo 'encrypted: ' . $encrypted . '<br>';
echo 'decrypted: ' . $decrypted . '<br>';

【问题讨论】:

  • 使用base64_encode() 而不是urlencode()
  • 保护数据的概念多么可怕!
  • 这段代码有很多问题。 mcrypt 已弃用。此外,ECB 模式不保证消息的完整性。攻击者可以更改加密数据,而您需要相同的 IV 才能解密。最后,您使用的是 ECB....
  • “我正在尝试在 GET 请求中将下载 URL 从第 1 页传递到第 2 页” - 将“GET 请求”替换为“会话”,并且做得好!也使加密解密的废话变得多余。
  • 你必须使用GET吗? Cookie、会话或 POST 请求有效,不会弄乱 URL。

标签: php url encryption encryption-symmetric


【解决方案1】:

对未加密的数据使用某种类型的压缩,例如gzcompress(),然后将其传递给您的加密方法,并将其输出到base64_encode。 Base64 编码仍会增加整体大小,但不如 url 编码那么多。

【讨论】:

    【解决方案2】:

    虽然使用 base64_encode() 不一定是一个的想法,但没有人提到股票 base64 编码不是 URL 安全的,因为它使用了重要的字符网址语法。

    但是,有一个变体是安全的,用于编码 JWT 令牌:

    function base64url_encode($bin) {
        return str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($bin));
    }
    
    function base64url_decode($str) {
        return base64_decode(str_replace(['-', '_'], ['+', '/'], $str));
    }
    

    您还应该记住,GET 请求受到长度限制,这些限制因 HTTP 服务器实现和语言而异。您可能希望使用 cmets 中建议的 gzcompress() 之类的东西,但更有可能的是,您应该在 POST 中传递这些数据。

    【讨论】:

      猜你喜欢
      • 2011-12-06
      • 1970-01-01
      • 1970-01-01
      • 2013-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多