我打算将 GET 用于我的表单,但想加密查询字符串中的值,以便用户无法更改它。(不是为了安全,而是为了隐藏数据)
我遇到了几个解释加密的网站,但是一旦用户按下提交按钮,我就不清楚如何实现它。例如: http: //myscriptlibrary.wordpress.com/2010/04/14/how-to-encrypt-query-string-in-php/
有没有一个例子可以证明这一点?
谢谢。
我打算将 GET 用于我的表单,但想加密查询字符串中的值,以便用户无法更改它。(不是为了安全,而是为了隐藏数据)
我遇到了几个解释加密的网站,但是一旦用户按下提交按钮,我就不清楚如何实现它。例如: http: //myscriptlibrary.wordpress.com/2010/04/14/how-to-encrypt-query-string-in-php/
有没有一个例子可以证明这一点?
谢谢。
根据我对您提供的链接的理解。你想加密 GET 变量,或者至少混淆它们。
可以做到这一点的最好和最简单的方法是使用base64_decode/encode
例如对字符串进行编码,您可以执行以下操作:
$link = "http://www.example.com/?item=".urlencode(base64_encode("user-data"));
$link
看起来像http://www.example.com/?item=rklgEwkelnf%3D%3D
,但是要将看似乱码(base64ed)的文本翻译成可用的东西,你可以使用:
foreach($_GET as $loc=>$item)
$_GET[$loc] = base64_decode(urldecode($item));
然后,您可以$_GET
像往常一样自由地使用该变量。
以下解决方案很容易实现并且足够强大,除非您处理非常敏感的数据,例如信用卡信息或 NASA 算法......
当您通过发送参数时。GET - 添加一个哈希值,例如:
$parameter = "abc"; //The parameter which you'll pass as a GET parameter
$salt = "cV0puOlx";
$hashed = md5($salt.$parameter);//A hash that you'll pass as well
header("Location: http://www.yourdomain.com?param=$parameter&hash=$hash");
然后在读取参数时,检查哈希是否有效:
$parameter = $_GET['param'];
$hash = $_GET['hash'];
$salt = "cV0puOlx";
$hashed = md5($salt.$parameter);
//now you check:
if ($hash === $hashed){
//everything's fine - continue processing
}
else{
// ERROR - the user tried to tamper with your parameter
// show error-message and bail-out
}
这里接受的答案没有提供任何真正的保护。您可以只获取编码参数并将它们放入在线 base64_decode 中,它会显示值,就好像您刚刚直接传递它们一样!
另一个答案使用 $hash 作为传递值,但该值并未仅定义为 $hashed。
1- 加密你的 var
2- 确保使用 base64 MIME 正确编码。
3-做你想做的事(例如:存储在你的数据库中以便稍后解密,传递到GET等......)
4-安全地解码base64你的var。
5-解密你的var
我实现了一个完成这项工作的类。(安全和数据隐藏)使用 openssl 方法和 aes-256 模式 cbc 来保护 crypt(不要忘记初始化向量)
class Encryption{
public static function safe_b64encode($string='') {
$data = base64_encode($string);
$data = str_replace(['+','/','='],['-','_',''],$data);
return $data;
}
public static function safe_b64decode($string='') {
$data = str_replace(['-','_'],['+','/'],$string);
$mod4 = strlen($data) % 4;
if ($mod4) {
$data .= substr('====', $mod4);
}
return base64_decode($data);
}
public static function encode($value=false){
if(!$value) return false;
$iv_size = openssl_cipher_iv_length('aes-256-cbc');
$iv = openssl_random_pseudo_bytes($iv_size);
$crypttext = openssl_encrypt($value, 'aes-256-cbc', 'your security cipherSeed', OPENSSL_RAW_DATA, $iv);
return self::safe_b64encode($iv.$crypttext);
}
public static function decode($value=false){
if(!$value) return false;
$crypttext = self::safe_b64decode($value);
$iv_size = openssl_cipher_iv_length('aes-256-cbc');
$iv = substr($crypttext, 0, $iv_size);
$crypttext = substr($crypttext, $iv_size);
if(!$crypttext) return false;
$decrypttext = openssl_decrypt($crypttext, 'aes-256-cbc', 'your security cipherSeed', OPENSSL_RAW_DATA, $iv);
return rtrim($decrypttext);
}
}
例子 :
$pass_get = 'hello';
$base64_crypt = Encryption::encode($pass_get); // get base64 of crypt data
// 稍后传入 $_GET 例如
<a href="https://toto.com?v=<?php echo $base64_crypt;?>" >Other page</a>
// 在您的其他页面中,恢复您的 var
$my_get_crypt_var = $_GET['v'];
Encryption::decode($my_get_crypt_var); // return 'hello' or false in case the string to be decrypted is invalid.
!!!这个解决方案不是散列,而是 CRYPTING !因此,这意味着您可以恢复 var 的内容。可用于非敏感数据,但不能用于密码等。!!!