如果我有一个网站,并且 URL 是www.example.com/mainpage.cfm?id=0123&app=2
,我该如何隐藏id=0123
,app=2
这样用户将无法更改这些变量?
我正在查看一个由我之前的人编写的复杂程序,他正在通过 URL 将这些变量从一个页面传递到另一个页面。我只是在寻找快速修复,因为我不想重写整个程序。
如果我有一个网站,并且 URL 是www.example.com/mainpage.cfm?id=0123&app=2
,我该如何隐藏id=0123
,app=2
这样用户将无法更改这些变量?
我正在查看一个由我之前的人编写的复杂程序,他正在通过 URL 将这些变量从一个页面传递到另一个页面。我只是在寻找快速修复,因为我不想重写整个程序。
这是您对其进行编码的方式:
#URLEncodedFormat(Encrypt(id, "#key#"))#
id 是变量,key 可以是任何东西(用作编码和解码的证书)。
解码:
cfset url.id = #Decrypt(url.id, "#key#")#
同样,关键变量将与要编码的变量相同。
我想我找到了更好的解决方案。
使用 (CGI.SERVER_NAME, CGI.HTTP_REFERER, 1) 可以让我知道 url 中是否有任何更改。我可以按如下方式应用它:
<cfif FindNoCase(CGI.SERVER_NAME, CGI.HTTP_REFERER, 1) eq 0>
<cfabort>
<cfelse> enter code here...
</cfif>
如何使用 hashids 库。 http://www.hashids.org/coldfusion/
除了 ColdFusion,该库还支持 JavaScript、Ruby、Python、Java、PHP、Perl、CoffeeScript、Objective-C、C++、Go、Lua、Elixir、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 通用捕获以防止错误,无论您的页面是作为与数字关联的文件还是作为数据库中的文件存储的。
您可以为原本无意义的页面创建密钥,例如只是对数字进行简单加盐的直接哈希(例如 hash("1blueplug") 变为 a79ea61e3b69d54a008772bcaf0fb398。将哈希存储在数据库中或作为文件名或其他任何内容。因为它们不会知道你的盐(这里是blueplug),他们没有真正的方法可以访问他们不应该访问的页面。
我不会被我的用户更改我网站上的参数并破坏他们自己的体验所困扰。页面应该进行必要的检查,以确保确实提交了表单。
除此之外,他们能够访问哪些类型的页面比破坏他们自己的体验更有害?如果他们正在访问的页面是某种安全问题(管理页面或其他用户的页面),那么是时候考虑一个新的应用程序了。
这是一种快速而肮脏的方法,我很久以前就学过一次,但是描述它的原始网页被删除了。因此,从这里的记忆中,它大约是同一件事:
<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 = "typeanythingdoesnotmatter123" 否则将很难破译该值,因此很难用任何可以代替那些四处寻找 id 或其他帐户的东西的东西来代替。