1

有没有办法改进这些服务器端用户字段验证?

<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>
4

3 回答 3

6

您将业务逻辑与显示相结合的方式还有待改进。您可能会受益于阅读MVC关注点分离

从您的逻辑的角度来看,您的验证规则似乎很好,但是您进行了两次验证,这似乎过分了:每个元素,然后是所有元素。这部分是由于我在上面强调的问题。

我会考虑停止程序性思考,并以更面向对象的方式思考,并定义 User.cfc 的概念,并拥有某种验证服务(请参阅ValidateThis)。或类似的东西。

最后,这并不是 Stack Overflow 上最好问的问题,但对Code Review有好处。这个问题没有一个答案,所以人们会倾向于建议关闭它,因为它“主要基于意见”。

我还将把它重新标记为“ColdFusion”而不是“ColdFusion 10”,因为它实际上与 CF10 没有任何关系,这只是一个 CFML 问题。将其标记为“ColdFusion”,您将获得更多的观众。

于 2013-08-04T13:31:45.027 回答
3

我不想与您共享代码,而是想向您介绍这些概念。您应该做的第一件事是阅读OWASP 对数据验证的建议。他们在其中建议有四种验证数据的策略,它们应该按以下顺序使用。我将在这里发布一些摘录,但我强烈建议您阅读整篇文章。

  1. 接受已知良好
    此策略也称为“白名单”或“肯定”验证。这个想法是您应该检查数据是否是一组严格约束的已知良好值之一。任何不匹配的数据都应该被拒绝。

  2. Reject known bad
    这种策略,也称为“否定”或“黑名单”验证,是肯定验证的弱替代方案。本质上,如果您不希望看到 %3f 或 JavaScript 或类似字符,请拒绝包含它们的字符串。这是一种危险的策略,因为可能的坏数据集可能是无限的。采用这种策略意味着您将不得不永远维护“已知不良”字符和模式的列表,并且根据定义,您将获得不完整的保护。

  3. 清理
    而不是接受或拒绝输入,另一种选择是将用户输入更改为可接受的格式

  4. 无验证
    这本质上是不安全的,强烈建议不要这样做。企业必须签署每个未验证的示例,因为缺乏验证通常会导致直接忽略应用程序、主机和网络安全控制。

本文继续更详细地讨论其中的每一个。

于 2013-08-05T18:07:50.463 回答
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>
于 2013-08-04T23:51:18.517 回答