ColdFusion加密来自JSON的ID

时间:2018-03-11 03:26:31

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

所有

我正试图弄清楚如何使用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详细信息的其他页面的链接。

2 个答案:

答案 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将按以下顺序检查范围以查找变量:

     
      
  1. 本地(仅限函数本地,UDF和CFC)
  2.   
  3. 参数
  4.   
  5. 线程本地(仅限内部线程)
  6.   
  7. 查询(不是真正的范围;查询循环中的变量)
  8.   
  9.   
  10. 变量
  11.   
  12. CGI
  13.   
  14. ......等......
  15.   

然后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的伟大建议。