问题描述
尝试通过带有 encodeforURL()
和 decodefromUrl()
的 url 发送密钥时,我不断收到错误消息。代码示例如下。
这是我的入口页面:
key = generateSecretKey(("AES"),128);
data = encrypt(serializeJSON(pg_info),key,"AES","HEX");
location("home.cfm?str=#encodeForURL(key)#&dt=#data#","false","301");
这是我的主页:
if ( structKeyExists(url,"str") ) {
key = DecodeFromURL(url.str);
strData = deserializeJSON(decrypt(url.dt,"HEX")); // This is the line where the error message is pointing
} else {
writeOutput("<p>Error! Please contact your administrator.</p>");
abort;
}
代码非常简单。当用户进入入口页面时,数据参数被加密并通过 url 发送到主页。一旦用户进入主页,数据就会从 ul 中提取出来。我尝试在创建密钥 (128) 时添加大小,希望问题得到解决。错误仍在发生,似乎可能与其他事情有关。我虽然密钥长度是问题所在,但错误消息指向将 url 字符串应用于 deserializeJSON()
的代码行。有没有办法找出导致错误的原因以及如何解决此问题?谢谢。
解决方法
顺便说一句,我认为此代码仅用于测试目的,因为将加密密钥与加密文本一起传递完全完全违背了加密的目的;-)
有没有办法找出导致错误的原因
进行故障排除时,location()
往往会成为障碍,因此最好暂时将其替换为超链接。然后,您就可以输出生成的原始密钥,并将其与主页上实际收到的密钥进行比较。
测试用例(单页)
<cfscript>
// It make take a few executions to hit a failing key like `n+Py4flPF6uOwNXwpq2J4g==`.
pg_info = { "plain" : "text" };
key = "generateSecretKey(("AES"),128);
data = encrypt(serializeJSON(pg_info),key,"AES","HEX");
writeOutput( "[key] "& key &"<br>[encoded] "& encodeForURL(key) &"<br><br>");
writeOutput( '<a href="#CGI.SCRIPT_NAME#?str=#encodeForURL(key)#&dt=#data#">Test</a>' );
if ( url.keyExists("str")) {
writeDump( var=[url.str],label="url.str (Original)" );
writeDump( var=[DecodeFromURL(url.str)],label="url.str (Decoded)" );
key = DecodeFromURL(url.str);
strData = deserializeJSON(decrypt(url.dt,"HEX"));
writeDump( var=strData,label="strData" );
}
</cfscript>
如何解决这个问题?
CF 已经自动解码了 url 参数。因此,第二次解码 url.str
会改变原始密钥值,导致decrypt() 失败,因为密钥不再有效。注意像 n+Py4flPF6uOwNXwpq2J4g==
这样的失败键,原始 url.str
值与解码后的 key
不同吗?
-
url.str(原文)
n+Py4flPF6uOwNXwpq2J4g==
(有“+”字符) -
key(解码)
n Py4flPF6uOwNXwpq2J4g==
(“+”变成空格字符)