在ColdFusion中隐藏/加密URL变量

在ColdFusion中隐藏/加密URL变量,coldfusion,urlvariables,Coldfusion,Urlvariables,如果我有一个网站,URL是www.example.com/mainpage.cfm?id=0123&app=2,我如何隐藏id=0123和app=2,以便用户无法更改这些变量 我正在看一个由我之前的人编写的复杂程序,他通过URL将这些变量从一页传递到另一页。我只是在寻找一个快速解决方案,因为我不想重写整个程序。下面是如何对其进行编码: #URLEncodedFormat(Encrypt(id, "#key#"))# id是变量,密钥可以是任何用作编码和解码证书的东西 要解码: cfset ur

如果我有一个网站,URL是www.example.com/mainpage.cfm?id=0123&app=2,我如何隐藏id=0123和app=2,以便用户无法更改这些变量


我正在看一个由我之前的人编写的复杂程序,他通过URL将这些变量从一页传递到另一页。我只是在寻找一个快速解决方案,因为我不想重写整个程序。

下面是如何对其进行编码:

#URLEncodedFormat(Encrypt(id, "#key#"))#
id是变量,密钥可以是任何用作编码和解码证书的东西

要解码:

cfset url.id = #Decrypt(url.id, "#key#")#

同样,关键变量与要编码的变量相同。

我想我找到了更好的解决方案

使用CGI.SERVER\u名称CGI.HTTP\u REFERER,1可以让我知道url中是否有任何更改。 我可以这样做:

<cfif FindNoCase(CGI.SERVER_NAME, CGI.HTTP_REFERER, 1) eq 0> 
<cfabort> 
<cfelse> enter code here... 
</cfif>

使用hashids库怎么样

除了CydFLUX之外,该库还可以在JavaScript、Ruby、Python、java、PHP、Perl、CopeFEXcript、ObjuleC、C++、GO、Lua、ILIXIR、NoDE.JS和.NET中使用。这使得它非常容易与其他语言一起使用,甚至可以在客户端动态生成ID

<cfscript>
hashids = new Hashids(salt="this is my salt"
    ,minLen=8
    ,alphabet="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890");

id_to_hash = listtoArray("1");   // try "1,2,3" and "3,2,1" and "1,1,1"
writeoutput('original = #arrayToList(id_to_hash)#<br>');

hashed_id = hashids.encrypt(id_to_hash);
writeoutput('hash = #hashed_id#<br>');

unhashed_id = arraytolist(hashids.decrypt(hashed_id));
writeoutput('unhashed = #unhashed_id#<br>');
</cfscript>

人们更改ID有什么问题

当然,它们可能会发现自己位于不存在的页面上,您需要执行一些cfif通用捕获以防止错误,无论您的页面是存储为与数字关联的文件还是存储为数据库中的文件

您可以为本来毫无意义的页面创建键,比如简单地添加数字的直接哈希,比如hash1blueplug变为a79ea61e3b69d54a008772bcaf0fb398。将散列存储在数据库中或作为文件名或其他任何形式。因为他们不知道你的盐蓝塞在这里,他们没有真正的方式来获得他们不应该的页面

我不会被我的用户在我的网站上更改参数并破坏他们自己的体验所困扰。页面应该进行必要的检查,例如确保表单确实已提交


除此之外,他们能够访问哪种页面比破坏自己的体验危害更大?如果他们访问的页面是某种安全问题,管理或其他用户的页面,是时候考虑一个新的应用程序了。

< P>这是一个快速而肮脏的方法,我很久以前就知道了,但是描述它的原始网页被删除了。因此,从这里的记忆来看,它是关于同样的事情:

    <cfset email = "test@myemail.com">
    <cfset algorithmkey = "typeanythingdoesnotmatter123">
    <cfoutput>#email#</cfoutput><br>
    <cfset test = #encrypt(email, algorithmkey, "CFMX_COMPAT", "HEX")#>
    <cfoutput>#test#</cfoutput><br>
    <cfset emailagain = #decrypt(test, algorithmkey, "CFMX_COMPAT", "HEX")#>
    <cfoutput>#emailagain#</cfoutput><br>
如果将上述内容保存到CFM模板中,您将获得以下输出:

test@myemail.com

650CEDC7328BA59A21980793329A73F6

test@myemail.com

除非试图破解该值的人知道您的algorithmkey=typeanythingdoetmatter123,否则将很难破译该值,因此 换上任何适合钓鱼的东西
id或来自其他帐户的信息。

变量是如何传递的?锚定标签?地点?meta refresh?数据从客户端传递到服务器的任何时候,无论是使用您描述的GET url变量还是提交表单后,例如,用户都可以更改数据。但是,如果这是需要逐页跟踪的信息,您可以考虑将这些值存储在会话范围中。Dan-他正在循环中填充链接,并添加a href标记和变量。然后在下一页中,他编写一个查询并使用url.id。我试图避免会话变量,因为有150多页,但这可能是唯一的解决方案。这就是为什么我很少再使用整数作为ID的原因之一。我更喜欢UUID。使用UUIDDan时很难猜测另一个ID-隐藏的表单字段可以在客户端进行操作,因此问题仍然存在。这可能会混淆信息,但不会“隐藏”信息或阻止客户端对其进行更改。您是否查看了加密值?简短、不安全的字符和可见的模式。我建议避免加密/解密。示例:85=+^86=+^$87=+^88=+^\n我建议避免使用加密/解密,我怀疑您的意思是避免使用默认算法加密;-正如Adobe自己的文档所说,该算法是最不安全的,仅用于向后兼容遗留应用程序。它不应该用于任何IMO。然而,真正的加密算法,如AES、Blowfish等,是完全可以接受的。也许你应该在将其投入生产之前进行一点测试。cgi.http_referer可以被欺骗。我不相信它。是的,它可以被欺骗。Reffer它对我来说很好,它比我正在做的东西更好,所以我现在将使用它。为什么我不应该使用ColdFusion内置的加密函数呢?默认算法CFMX_COMPAT,是ColdFusion独有的。这意味着散列值只能由ColdFusion加密和解密,而不能由第三方库进行加密和解密。如果您想向第三方开放访问权限,请访问我们
e AES。这将生成一个最少32个字符的代码。使用哈希ID时,整数将转换为单个哈希。代码很短,可以指定最小长度,也可以添加salt值。hashid不会生成诅咒词,不会使用看起来像数字的字符,可以保留数字排序顺序,并且不会发生任何冲突;所有哈希都是唯一的。我开始在密码重置脚本中使用它,因为我更喜欢短URL。我担心SQL注入。我不想有人编辑url和删除表。下面是一篇解释用户可以通过更改url变量来做什么的文章。请注意,显示向URL末尾添加拖放表产品的行这与混淆ID是分开的。即使传递了无效ID,也可以执行SQL注入。为了保护您自己,请使用CFQUERYPARAM、验证所有输入和/或安装FuseGuard之类的应用程序防火墙。正如Moberg先生所说,您可以而且应该做CFQUERYPARAM或Where pID=valurl.pID之类的事情。Val将任何非数字数字转换为0,因此尝试说?pid=7删除表格。。将该值转换为0,则不会获得任何页面。根据您拥有的控件类型,您还可以创建一个数据库用户,该用户没有权限执行某些类型的语句,作为附加的安全层。它不是安全脚本的替代品,只是一个附加层。您可能错过了它,但几年前的版本已经做到了这一点。当未指定算法时,cfmx_compat是默认值。尽管现在,cfmx_compat不再被推荐用于加密。有关详细信息,请参见加密文档。