javascript - 来自 JSON 的 ColdFusion 加密 ID

标签 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 详细信息的页面。

最佳答案

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:

If you use a variable name without a scope prefix, ColdFusion checks the scopes in the following order to find the variable:

  1. Local (function-local, UDFs and CFCs only)
  2. Arguments
  3. Thread local (inside threads only)
  4. Query (not a true scope; variables in query loops)
  5. Thread
  6. Variables
  7. CGI
  8. ... etc...

然后 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>

关于javascript - 来自 JSON 的 ColdFusion 加密 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49216331/

相关文章:

javascript - $ ('body' ).click ('li' , func) 与 $ ('li' ).click(func),第二个选项不起作用?

javascript - CSS 或 JavaScript 以突出显示图像不透明度的特定区域

javascript - 具有数据持久性的 jQuery 插件模式

javascript - 在按钮中获取未捕获的类型错误 : when i try to use my . tableExport

javascript - 从公共(public)类名中获取集合类名

javascript - 如何使用 href 函数将光标移动到页面的特定部分

mysql - sudo apt-get install (Ubuntu) 安装的应用程序后的文件夹在哪里

Enterprise Architect 的 MySQL 存储库?

javascript - 在 React.js 中使用 chrome api

mysql - 如何进行标签组合搜索?