有没有办法改进这些服务器端用户字段验证?
<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>
答案 0 :(得分:6)
您将业务逻辑与显示器耦合的方式有点不尽如人意。您可以通过阅读MVC和separation of concerns来获益。
从你的逻辑的角度来看,你的验证规则似乎很好,但是你正在进行两次验证,这似乎是过分的:每个元素,然后是所有元素。这部分是由于我在上面强调的问题。
我会考虑停止在程序上思考,并以更OO的方式思考,并定义User.cfc的概念,并提供某种验证服务(请参阅ValidateThis)。或类似的东西。
最后,这不是Stack Overflow上最好的问题,但对Code Review有好处。对于这个问题没有一个答案,因此人们倾向于建议将其关闭为“主要基于意见”。
我也将其视为“ColdFusion”而不是“ColdFusion 10”,因为它与CF10没有任何关系,它只是一个CFML问题。你会得到一个更大的观众,标记为“ColdFusion”。
答案 1 :(得分:3)
我想向您介绍这些概念,而不是与您共享代码。你应该做的第一件事是阅读OWASP recommendations for Data Validation。在其中,他们建议有四种验证数据的策略,它们应按以下顺序使用。 我会在此发布一些摘录,但我强烈建议您阅读整篇文章。
接受已知的好处
该策略也称为“白名单”或“正面”验证。我们的想法是,您应该检查数据是否是一组严格约束的已知良好值之一。任何不匹配的数据都应该被拒绝。
拒绝已知的错误
这种策略,也称为“否定”或“黑名单”验证,是积极验证的弱选择。基本上,如果您不希望看到%3f或JavaScript等字符,请拒绝包含它们的字符串。这是一种危险的策略,因为可能的坏数据集可能是无限的。采用这种策略意味着你必须永远保持“已知坏”字符和模式的列表,你将根据定义保护不完整。
消毒
除了接受或拒绝输入外,另一种选择是将用户输入更改为可接受的格式
无需验证
这本质上是不安全的,并且强烈反对。企业必须签署每个没有验证的例子,因为缺乏验证通常会导致直接避免应用程序,主机和网络安全控制。
本文继续更详细地讨论其中的每一个。
答案 2 :(得分:2)
这是另一种方式。你可以自己决定它是否更好。
步骤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>