关于通过url传递加密字符串,我有一个奇怪的问题。我正在使用mcrypt()中的base64加密来加密HTML()和decryptHTML()。
我有这段代码要加密:
$link_string = http_build_query(array('index_number'=>30843854, 'extra_attendence_id'=>27982423, 'target_temporary_id'=>378492085, 'date'=>'2016-05-06', 'action'=>'OUT', 'target_id'=>390234), '', '&');
$link_string = encryptHTML($link_string);
然后我通过这个网址传递了它:
'localhost/website/controller/action/'.$link_string
然后我用这段代码解密它:
$id = $this->request->param('id');
$id = decryptHTML($id);
parse_str($id, $arr_id2);
var_dump($arr_id2);
我会像预期的那样得到这些:
array(6) { ["index_number"]=> string(8) "30843854" ["extra_attendence_id"]=> string(8) "27982423" ["target_temporary_id"]=> string(9) "378492085" ["date"]=> string(10) "2016-05-06" ["action"]=> string(3) "OUT" ["target_id"]=> string(6) "390234" }
接下来的情况是我还想要加密链接,但我需要在页面中附加DOM元素的其他值,所以我试着
'localhost/website/controller/action/encrypt='.$link_string.'&DOMvalue=10000'
然后我用这段代码修改了解密:
$id = $this->request->param('id');
parse_str($id, $arr_id2);
$the_DOMValue = $arr_id2['DOMvalue'];
$id = decryptHTML($arr_id2['crypted']);
parse_str($id, $arr_id);
var_dump($the_DOMValue); echo "<br>";
var_dump($arr_id);
然而,令我惊讶的是,我得到了这些:
string(5) "10000"
array(3) { ["index_number"]=> string(13) "58_2016-04-26" ["extra_attendence_id"]=> string(1) "0" ["target_t"]=> string(0) "" }
我原来的字符串缩短了!请注意,DOMvalue很好。 然后,如果给定的加密字符串不同,我在解密之前检查了它:
关于decryptHTML的第一个案例:
$id = $this->request->param('id');
var_dump($id);
$id = decryptHTML($id);
返回:
string(224) "zCQnh-rNP2R7h4UHyV5Dm5zp494DIIku5LWN51yYGMXBaHf0gJgEDw8UCuHRZxr-CkjkevHQ70kOPnSBQ9CJP6lZrFone-nDMDJhYlL8330wz+zud8-3tSWvdOLB7je5D-22aX4OrE3zlBYZZZtI-rMT73H0JGIRzZge2GzcZGLwS7Rj+GL5Ym-ET6JEHDShST4etgcQaEYXml-+BZ2+0BQKvubZEBOB"
关于decryptHTML的第二个案例:
$id = $this->request->param('id');
parse_str($id, $arr_id2);
$the_DOMValue = $arr_id2['DOMvalue'];
var_dump($arr_id2['crypted']);
$id = decryptHTML($arr_id2['crypted']);
返回:
string(224) "zCQnh-rNP2R7h4UHyV5Dm5zp494DIIku5LWN51yYGMXBaHf0gJgEDw8UCuHRZxr-CkjkevHQ70kOPnSBQ9CJP6lZrFone-nDMDJhYlL8330wz zud8-3tSWvdOLB7je5D-22aX4OrE3zlBYZZZtI-rMT73H0JGIRzZge2GzcZGLwS7Rj GL5Ym-ET6JEHDShST4etgcQaEYXml- BZ2 0BQKvubZEBOB"
对我来说看起来完全一样,但奇怪的是它被解密了。我当然使用相同的功能来解密这两种情况......
任何人都可以对此有所了解吗?
答案 0 :(得分:1)
通过url传递加密字符串
Passing an encrypted string through a URL是一个坏主意。完全停止。
我正在使用mcrypt()中的base64加密来加密HTML()和decryptHTML()。
如果不了解这些功能的作用,这不是有用的信息,而是mcrypt should be avoided。使用Libsodium(如果可以;否则,请使用OpenSSL)。
我原来的字符串缩短了!
它可能将+视为空格。使用urlencode()
可以解决一个问题,但它不能解决在没有消息验证代码(MAC)的情况下使用mcrypt引入应用程序的vulnerability to chosen-ciphertext attacks。