ColdFusion:服务器端用户验证

ColdFusion:服务器端用户验证,coldfusion,cfml,server-side-validation,Coldfusion,Cfml,Server Side Validation,有什么方法可以改进这些服务器端用户字段验证吗 <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.PasswordConfirma

有什么方法可以改进这些服务器端用户字段验证吗

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

您将业务逻辑与显示器耦合的方式还有一点不尽如人意。你可能会从阅读和阅读中受益

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

我会考虑停止按程序思考,以更面向对象的方式思考,定义User.cfc的概念,并提供某种验证服务。或者类似的

最后,这并不是关于堆栈溢出的最佳问题,但对我们来说是很好的。这个问题没有一个答案,所以人们倾向于建议关闭它,因为它主要是基于观点的


我还将把它重新命名为ColdFusion,而不是ColdFusion 10,因为它实际上与CF10无关,这只是一个CFML问题。将其标记为ColdFusion会吸引更多的观众。

将业务逻辑与显示相结合的方式有点不尽如人意。你可能会从阅读和阅读中受益

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

我会考虑停止按程序思考,以更面向对象的方式思考,定义User.cfc的概念,并提供某种验证服务。或者类似的

最后,这并不是关于堆栈溢出的最佳问题,但对我们来说是很好的。这个问题没有一个答案,所以人们倾向于建议关闭它,因为它主要是基于观点的


我还将把它重新命名为ColdFusion,而不是ColdFusion 10,因为它实际上与CF10无关,这只是一个CFML问题。你会因为它被标记为ColdFusion而获得更多的观众。

这是另一种方式。你可以自己决定是否更好

步骤1-创建错误消息变量

<cfset ErrorMessage = "">
<cfif len(trim(form.LoginName)) gt 0>
<cfset ErrorMessage &= "<h3>Login Name is required</h3>">
</cfif>
more checks
第二步-做你的检查。如果看到不喜欢的内容,请将文本附加到变量中

<cfset ErrorMessage = "">
<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\u referer进行此操作

还有一件事。而不是像这样返回表单页面的锚定标记

<p><a href="users.cfm">Return to users list</a>.</p>
您可以使用javascript,这样页面就不必在浏览器中重新加载

<p><a href="javascript:history.back()">Return to users list</a>.</p>

这是另一种方式。你可以自己决定是否更好

步骤1-创建错误消息变量

<cfset ErrorMessage = "">
<cfif len(trim(form.LoginName)) gt 0>
<cfset ErrorMessage &= "<h3>Login Name is required</h3>">
</cfif>
more checks
第二步-做你的检查。如果看到不喜欢的内容,请将文本附加到变量中

<cfset ErrorMessage = "">
<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\u referer进行此操作

还有一件事。而不是像这样返回表单页面的锚定标记

<p><a href="users.cfm">Return to users list</a>.</p>
您可以使用javascript,这样页面就不必在浏览器中重新加载

<p><a href="javascript:history.back()">Return to users list</a>.</p>

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

接受已知货物 这种策略也称为白名单或积极验证。其思想是,您应该检查数据是否是一组严格约束的已知良好值中的一个。任何不匹配的数据都应被拒绝

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

消毒 另一个选择是将用户输入更改为可接受的格式,而不是接受或拒绝输入

无验证 这本身就是不安全的,强烈反对。业务部门必须签署每一个未验证的示例,因为缺少验证通常会导致直接取消应用程序、主机和网络安全控制

这篇文章将更详细地讨论每一个问题。

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

接受已知货物 这种策略也称为白名单或积极验证。其思想是,您应该检查数据是否是一组严格约束的已知良好值中的一个。任何不匹配的数据都应被拒绝

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

消毒 另一个选择是将用户输入更改为可接受的格式,而不是接受或拒绝输入

无验证 这本身就是不安全的,强烈反对。业务部门必须签署每一个未验证的示例,因为缺少验证通常会导致直接取消应用程序、主机和网络安全控制


本文将更详细地讨论其中的每一个问题。

看看ValidateThis——它是一个用于处理客户端和服务器端验证的开源库。非常酷,非常强大。看看ValidateThis——它是一个开源库,用于处理客户端和服务器端的验证。非常酷,非常强大。