有什么方法可以改进这些服务器端用户字段验证吗?
<cfif Form.LoginName EQ ""><h1>Login Name is required.</h1></cfif>
<cfif Form.Password EQ ""><h1>Password is required.</h1></cfif>
<cfif Form.Password NEQ Form.PasswordConfirmation><h1>Password confirmation does not match Password.</h1></cfif>
<cfif Form.FirstName EQ ""><h1>First Name is required.</h1></cfif>
<cfif Form.LastName EQ ""><h1>Last Name is required.</h1></cfif>
<cfif Form.LoginName EQ "" OR Form.Password EQ "" OR Form.Password NEQ Form.PasswordConfirmation OR Form.FirstName EQ "" OR Form.LastName EQ "">
<p>User has not been created</p>
<p>You can use your browser's back button to keep form fields filled and try again.</p>
<p><a href="users.cfm">Return to users list</a>.</p>
<cfabort>
</cfif>
将业务逻辑与显示器耦合的方式还有一些不足。您可能会从阅读MVC和关注点分离中受益。
从逻辑的角度来看,您的验证规则似乎很好,但您要做两次验证,这似乎太过分了:每个元素,然后是所有元素。这在一定程度上是由于我在上面强调的问题。
我会考虑停止程序化思考,以更OO的方式思考,定义User.cfc的概念,并提供某种验证服务(请参阅ValidateThis)。或者类似的东西。
最后,这不是在Stack Overflow上最好问的问题,但对代码审查来说很好。这个问题没有一个答案,所以人们倾向于建议关闭它,因为它"主要基于观点"。
我还将把它重新命名为"ColdFusion",而不是"ColdFusion 10",因为它实际上与CF10无关,这只是CFML的问题。如果它被标记为"ColdFusion",你会得到更多的观众。
我不想与您共享代码,而是向您介绍这些概念。您应该做的第一件事是阅读OWASP对数据验证的建议。在报告中,他们建议有四种验证数据的策略,它们应该按以下顺序使用我会在这里发布一些摘录,但我强烈建议你阅读整篇文章
-
接受已知商品
这种策略也被称为"白名单"或"积极"验证。其想法是,您应该检查数据是否是一组严格约束的已知良好值中的一个。任何不匹配的数据都应该被拒绝。 -
拒绝已知错误
这种策略,也被称为"负面"或"黑名单"验证,是积极验证的薄弱替代方案。本质上,如果您不希望看到%3f或JavaScript或类似字符,请拒绝包含它们的字符串。这是一种危险的策略,因为可能的坏数据集可能是无限的。采用这种策略意味着你将不得不永远维护"已知的坏"字符和模式的列表,并且根据定义,你将得到不完整的保护。 -
消毒
另一种选择不是接受或拒绝输入,而是将用户输入更改为可接受的格式 -
无验证
这本质上是不安全的,强烈反对。业务部门必须签署每一个没有验证的例子,因为缺乏验证通常会直接排除应用程序、主机和网络安全控制。
这篇文章将更详细地讨论每一个问题。
这是另一种方式。你可以自己决定它是否更好。
步骤1-创建一个错误消息变量。
<cfset ErrorMessage = "">
第2步-检查。如果您看到不喜欢的内容,请将文本附加到变量中。
<cfif len(trim(form.LoginName)) gt 0>
<cfset ErrorMessage &= "<h3>Login Name is required</h3>">
</cfif>
more checks
步骤3-检查您的错误消息变量的长度
<cfif len(ErrorMessage) gt 0>
display it
<cfelse>
code for no errors
</cfif>
除此之外,您可能还想检查页面请求是否真的来自您的表单页面。您可以使用cgi.http_referrer。
还有一件事。不是像这样将锚标记返回到表单页面
<p><a href="users.cfm">Return to users list</a>.</p>
您可以使用javascript,这样页面就不必在浏览器中重新加载。
<p><a href="javascript:history.back()">Return to users list</a>.</p>