【问题标题】:CFForm vs Form in ColdfusionCFForm 与 Coldfusion 中的形式
【发布时间】:2011-06-07 19:26:56
【问题描述】:

我在 Coldfusion 中使用普通表单和输入字段已有一段时间了,但最近发现 cfinput 标签会自动为我防止一些 xss 攻击。这让我想知道,在冷融合中使用 cffrom 和 cfinput 而非普通形式和输入标签是否有任何缺点。

我在短时间内发现的唯一缺点是它向页面添加了 2 个外部样式表和 1 个脚本标记。

简而言之:

在coldfusion中使用CFFORM相对于FORM有什么优缺点?

【问题讨论】:

  • 我很想知道您认为您从 cfforms 获得了什么 XSS 保护。我不知道。
  • <cfform/> 导致无法从这里到达那里的问题。我一直觉得这背后的代码应该是开源的,这样人们就可以独立地向前发展。一种可能的方法是使用 XML 可换肤表单:help.adobe.com/en_US/ColdFusion/9.0/Developing/…,但我一直认为 XSL 是寻找问题的解决方案。
  • @Jason AFAIK cfinput/cfselect/cftextarea 中的所有 value="" 都会自动进行 xmlFormat() 处理,仅此而已。
  • 对于 XSS,我建议您参考我对另一个问题的回答:stackoverflow.com/questions/4550668/…
  • @Henry:不知道 ESAPI,但这个邮件线程似乎解决了您的问题:lists.owasp.org/pipermail/owasp-esapi/2009-August/000701.html。看起来 ESAPI 是某种继承者,但不验证 HTML 输入(例如,来自 WYSIWYG 编辑器),在这种情况下你仍然会使用 AntiSamy。

标签: forms coldfusion cfform


【解决方案1】:

我更喜欢围绕我的表单编写自己的 JS。我从那天开始使用 cfform,但最终想做比 cfform 能够处理的更强大的事情(验证等)。这迫使我学习 JS,从那以后我一直很高兴编写自己的 JS。

所以我想我想说一个很大的缺点是您受限于 cfform 可以处理的内容。根据您的情况,这可能没问题。

我很久以前遇到的另一个缺点(公平地说,这可能已经解决了)是 cfform 生成的 JS 会与我的手写 JS 发生冲突或干扰。

这肯定会归结为偏好。使用 cfform 或常规形式既不是“正确”也不是“错误”。对我来说,我更喜欢能够手动完成我需要做的任何操作,因为没有限制/限制。

【讨论】:

  • 我不打算使用 cfinput 来验证前端的表单,我更关注后端。每当我在基本输入表单中输入“”/>”之类的东西时,它都会结束输入并运行js。我必须使用HTMLEditFormat来防止这种情况。但是如果我使用 cfinput,它将转换 HTMLEditFormat 之类的符号,但我不必实际调用 HTMLEditFormat
  • 我还是更喜欢自己添加 HTMLEditFormat(),我想添加它。这样,如果需要使用它,我就不必想出解决方法。但这就是我。就像亨利在他的回应中所说的(我在解释),如果它对你有用,那就使用它。在大多数情况下,“优势”或“劣势”都是主观的。
  • 在客户端方面,我同意 Charlie。我曾多次遇到 CFFORM 的 JavaScript 导致其他脚本函数出现问题的情况。我也对 Adob​​e 坚持让您必须手动破解 cfform.js 来制作所需的选择框有疑问。话虽如此,如果本质上非常基本,我将使用带有 onServer validateAt 属性的 CFFORM 来快速处理服务器端验证。
【解决方案2】:

我与<cfform><cfinput> 有着爱恨交织的关系。

要获得与 CFFORM 提供的相同的 xss 保护,只需像这样将 htmlEditFormat() 包裹在 value="" 周围:

<input name="x" value="#htmlEditFormat(x)#">

要获得更好的 XSS 保护,请使用 OWASP Enterprise Security API(CF9 最新修补程序之一中包含的 .jar)

我喜欢无需编写 JS 即可轻松实现 ajaxified 表单,但我讨厌它如何生成大量丑陋的 JavaScript 并为相当简单的事情加载大量 JS 和 css 文件。因此,我决定仅将 cfform 用于内部网站,而不用于面向公众的网站(性能问题)。

除了 ajax 功能之外,checked 属性接受 CF 布尔值并使用查询对象填充 select 是 cfinputcfselect 提供的非常有用的功能。

为正确的工作使用正确的工具。如果您发现&lt;cfform&gt; 的功能有用,请使用它。只需了解其局限性,然后自行决定。

【讨论】:

【解决方案3】:

我使用 ColdFusion 已经快 14 年了。 CF 之所以如此出色的产品,是因为它使新用户能够在没有太多了解的情况下快速完成大量工作,并且它使火箭科学家也能够快速构建真正强大且安全的应用程序。

CFFFORM、CFINPUT、CFLAYOUT、CFPOD 是为新用户创建的标签。基本上,它们是训练轮。如果您是 Web 开发的新手,您应该试试这个标签。随着经验的积累,您会希望放弃这些标签并转向其他技术来创建更强大的应用程序。

这些标签没有问题,就像训练轮没有问题一样。您只需要知道每项工作都有合适的工具。实际上,每项工作都有很多合适的工具。

目前,我正在开发一个用于构建外部网站的 ColdFusion 9 / jQuery / SQL Server 内部网。我在不使用单个表单标签的情况下这样做。而且,我完全是在 CFSCRIPT 中完成的。哇!

使用 jQuery,您不需要表单。你只需要输入。以下是我在 CFSCRIPT 中创建输入的方法。

<cfscript>
Options = "";
for (i = 1; i lte 10; i++) {
  Options = Options & wrapOption("Some choice #i# ", i);
}
SelectBox = wrapSelect(Options, "MySelectID");
writeOutput(SelectBox);
SecretDiv = wrapDiv("", "", "MyDivID");
writeOutput(SecretDiv);
</cfscript>

用于创建 HTML 的用户定义函数在我的 UDF_Library.cfm 文件中:

// WRAP SELECT
function wrapSelect(SelectContent, Class, ID) {
    LOCAL.SelectContent = ARGUMENTS.SelectContent;
    LOCAL.Properties = "";
    // CLASS
    if (isDefined("ARGUMENTS.Class")) {
        LOCAL.Properties = LOCAL.Properties & " class='#ARGUMENTS.Class#'";
    }
    // ID
    if (isDefined("ARGUMENTS.ID")) {
        LOCAL.Properties = LOCAL.Properties & " id='#ARGUMENTS.ID#'";
    }
    LOCAL.Item = "<select #LOCAL.Properties#>#LOCAL.SelectContent#</select>";
    return LOCAL.Item;
}
// WRAP OPTION
function wrapOption(Content, Value, Selected) {
    LOCAL.Content = ARGUMENTS.Content;
    LOCAL.Properties = " value='#ARGUMENTS.Value#'";
    // SELECTED
    if (isDefined("ARGUMENTS.Selected") and (ARGUMENTS.Selected eq "selected")) {
        LOCAL.Properties = LOCAL.Properties & " selected";
    }
    LOCAL.Item = "<option #LOCAL.Properties#>#LOCAL.Content#</option>";
    return LOCAL.Item;
}
// CREATE DIV
function wrapDiv(Content, Class, ID) {
    LOCAL.Properties = "";
    // CLASS
    if (isDefined("ARGUMENTS.Class")) {
        LOCAL.Properties = LOCAL.Properties & " class='#ARGUMENTS.Class#'";
    }
    // ID
    if (isDefined("ARGUMENTS.ID")) {
        LOCAL.Properties = LOCAL.Properties & " id='#ARGUMENTS.ID#'";
    }
    LOCAL.Item = "<div #LOCAL.Properties#>#ARGUMENTS.Content#</div>";
    return LOCAL.Item;
}

我使用 jQuery 并通过其类或 ID 引用每个元素。如果这样做,您可以将每个元素中的数据提交给 ajax 调用,如下所示:

<script type="text/javascript">
$(document).ready(function() {
$("#MySelectID").change(function() {
   MyID = $("#MySelectID").val();
   $("#MySecretDiv").load("CoolQuery.cfm?UserID"+MyID);
});


});
</script>

关键是,只要你使用 CFFORM 和 CFINPUT,你就不能做所有真正强大的 jQuery 东西。但是,您需要这些标签才能开始使用。

2012 年将是 ColdFusion 和 jQuery 强大的一年!!!

祝你好运!

【讨论】:

    【解决方案4】:

    我已经很久没有使用 ColdFusion 的 CFInput 了。我一直在使用 jQuery Validation 插件,这样我就可以对其他事情进行验证,例如:

    • 元素是否可见? (即,如果不是必要的部分,则隐藏一个部分,但如果未显示,则删除该要求。)
    • 是否选中了复选框? (即,您勾选了“其他”,现在需要填空。)
    • 它是一个有效的日期/时间值吗? (即,我另外使用 DateJS 库来协助)
    • 执行 ajax 查询以确定用户名是否唯一
    • 输入的网址有效吗?
    • 比较密码1和密码2
    • 基于事物组合的自定义规则

    大多数验证规则可以内联添加到类参数中:

    <input type="text" name="Name" class="required">
    <input type="text" name="Birthdate" class="required date">
    <input type="text" name="Email" class="required email">
    <input type="text" name="Website" class="url">
    

    我更喜欢使用 jQuery,因为有时我需要将相同的逻辑添加到基于非 ColdFusion 的表单中,而且我不必担心 CFInput 是一个 ColdFusion-Only 标记这一事实。

    这是一个链接,其中包含有关 jQuery 验证库的更多信息:

    http://bassistance.de/jquery-plugins/jquery-plugin-validation/

    【讨论】:

    • 当您将 ColdFusion 与 jQuery 结合使用时,您会放任自流,这真是太棒了!使用 jQuery,您可以完全控制。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多