【问题标题】:ColdFusion Encrypting ID from JSON来自 JSON 的 ColdFusion 加密 ID
【发布时间】:2018-08-19 08:34:56
【问题描述】:

全部,

我绞尽脑汁想弄清楚如何使用 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 详细信息的另一个页面。

【问题讨论】:

  • 我猜,我把
  • 你应该写下你的答案,以便其他人可以从中学习。
  • 一旦我能弄清楚如何做到这一点,我会发布一个答案。
  • 您没有说代码实际在做什么(错误、错误结果等...),但我猜您没有得到加密值?详情请见my answer
  • Triva:了解范围优先级通常是 CF 认证考试中的一个问题。

标签: javascript jquery mysql coldfusion mvc.jquery.datatables


【解决方案1】:

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')/>

这会无意中创建两个“EMPLOYEE_ID”变量,从而在尝试读取此处的值时造成歧义:

<cfset obj = {
    "EMPLOYEE_ID" = EMPLOYEE_ID,
    ....
 } />

因为EMPLOYEE_ID 没有作用域,CF 必须猜测您想要的两个变量中的哪一个 - 查询中的一个或VARIABLES 作用域。然后 CF 在各个范围内搜索EMPLOYEE_ID

如果您使用不带范围前缀的变量名,ColdFusion 会按以下顺序检查范围以查找变量:

  1. 本地(仅限函数本地、UDF 和 CFC)
  2. 论据
  3. 线程本地(仅限线程内部)
  4. 查询(不是真正的范围;查询循环中的变量)
  5. 线程
  6. 变量
  7. CGI
  8. ...等等...

然后returns the one with the highest precedence。因为您在查询循环中,所以“查询”范围具有更高的优先级。这就是为什么你得到原始的未加密值,而不是加密的值。

<!--- 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>

【讨论】:

  • 问题,因为我的回复中不仅仅是employee_id,现在它出错并说last_name 未定义。似乎它在响应中唯一传递了employee_id。
  • 上面是一个简化的例子来说明为什么原始代码不起作用。将所有相同的键保留在您的真实代码中,只需更改您创建 EMPLOYEE_ID 的方式。
【解决方案2】:

所以,在一遍又一遍地阅读 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 的建议。

【讨论】:

  • 是的,不过为了避免类似的问题,最好在cfset 语句中使用variables 范围。您也可以完全跳过额外的变量并直接在结构中进行赋值。 &lt;cfset obj = { "EMPLOYEE_ID" = Encrypt(...), ... more keys } /&gt;
  • 很好的建议,我现在将其添加到代码中,再次感谢您的所有帮助。
  • 很高兴它有帮助。 (通常 CF 的灵活性很好,“查询范围”与“变量范围”是这种灵活性会咬你的一种情况;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-10
  • 1970-01-01
  • 2012-12-09
相关资源
最近更新 更多