所有
我正试图弄清楚如何使用ColdFusion从JSON请求中拦截和加密数据库记录ID。下面是我的代码和我的抱歉尝试。任何帮助都会很棒。
<cfquery name="GetAppData" datasource="MYSQLSTUFF">
SELECT *
From MYDATATABLE
</cfquery>
<cfset myKey = "VpugAocKZVP8BZzamx52Yw=="/>
<cfset data = [] />
<cfoutput query="GetAppData">
<cfset EID = #EMPLOYEE_ID#/>
<cfset EMPLOYEE_ID = #Encrypt(EID,myKey,'AES/CBC/PKCS5Padding','HEX')#/>
<cfset obj = {
"EMPLOYEE_ID" = EMPLOYEE_ID,
"LAST_NAME" = LAST_NAME,
"FIRST_NAME" = FIRST_NAME,
"EVER_NUM" = EVER_NUM,
"SortOrderDate" = SortOrderDate,
"DOCS_VER" = DOCS_VER,
"DOCS_WAIT" = DOCS_WAIT,
"APP_STATUS" = APP_STATUS,
"LOCATION_NAME" = LOCATION_NAME
} />
<cfset arrayAppend(data, obj) />
</cfoutput>
<cfprocessingdirective suppresswhitespace="Yes">
<cfoutput>
{"data":
#serializeJSON(data)#
}
</cfoutput>
</cfprocessingdirective>
<cfsetting enablecfoutputonly="No" showdebugoutput="No">
我正在尝试使用此加密ID用于指向显示员工ID详细信息的其他页面的链接。
答案 0 :(得分:4)
TLDR;
再看看my sample code on your other question。它是由不正确的范围引起的。解决方案是正确范围所有变量(或使用不是查询列名称之一的变量名称)。
<!--- use query scope to overwrite query column value --->
<cfset queryName.columnName[queryName.currentRow] = Encrypt(...)>
<!--- OR use "variables" scope to reference new variable --->
<cfset variables.EMPLOYEE_ID = Encrypt(...)>
...
<cfset obj = {
"EMPLOYEE_ID" = variables.EMPLOYEE_ID,
....
} />
<强>解释强>
当您指定一个没有范围的变量时,它将被置于默认范围VARIABLES
中。因此,此代码不会覆盖查询列值,而是在VARIABLES
范围内创建一个全新的变量。
<cfset EMPLOYEE_ID = Encrypt(EID,sampleKey,'AES/CBC/PKCS5Padding','HEX')/>
......就像你写这个一样:
<cfset variables.EMPLOYEE_ID = Encrypt(EID,sampleKey,'AES/CBC/PKCS5Padding','HEX')/>
无意中创建了两个&#34; EMPLOYEE_ID&#34;变量,在尝试读取值时导致歧义:
<cfset obj = {
"EMPLOYEE_ID" = EMPLOYEE_ID,
....
} />
由于EMPLOYEE_ID
不是作用域,因此CF必须猜测您想要的两个变量中的哪一个 - 查询或VARIABLES
范围中的变量。然后CF搜索EMPLOYEE_ID
各种范围:
如果使用不带范围前缀的变量名,ColdFusion将按以下顺序检查范围以查找变量:
- 本地(仅限函数本地,UDF和CFC)
- 参数
- 线程本地(仅限内部线程)
- 查询(不是真正的范围;查询循环中的变量)
- 发
- 变量
- CGI
- ......等......
醇>
然后returns the one with the highest precedence。因为您在查询循环中,所以&#34;查询&#34;范围具有更高的优先级。这就是您获取原始未加密值而不是加密值的原因。
<!--- simulate query data --->
<cfset myKey = "VpugAocKZVP8BZzamx52Yw=="/>
<cfset GetAppData = queryNew("EMPLOYEE_ID","integer", [ {EMPLOYEE_ID=1}])>
<cfoutput query="GetAppData">
<cfset EMPLOYEE_ID = Encrypt(EMPLOYEE_ID,myKey,'AES/CBC/PKCS5Padding','HEX')/>
(Unscoped) EMPLOYEE_ID = #EMPLOYEE_ID#<br>
(Scoped) variables.EMPLOYEE_ID = #variables.EMPLOYEE_ID#<br>
(Scoped) GetAppData.EMPLOYEE_ID = #GetAppData.EMPLOYEE_ID#<br>
</cfoutput>
答案 1 :(得分:1)
因此,在一遍又一遍地阅读Ageax反应然后有一点清晰度之后,我意识到解决方案是多么容易。
<cfoutput query="GetAppData">
<cfset ED_ID = Encrypt(EMPLOYEE_ID,myKey,'AES/CBC/PKCS5Padding','HEX')/>
<cfset obj = {
"EMPLOYEE_ID" = variables.ED_ID,
通过捕获EMPLOYEE_ID,然后将其设置为ED_ID,我能够准确地定义正确的项目。
以下作品完美无缺。再次感谢Ageax的伟大建议。