2

我想防止 SQL 注入攻击。我们有一个表单,要求输入用户的 AD 用户名和密码。那么我们的处理代码如下所示:

<cfldap name="ldap_result" action="query" server="999.999.999.999" 
attributes="userprincipalname,title,samaccountname,sn,name,mail,cn" 
filter="(&(objectclass=user)(sAMAccountName=#form.username#))"
start="dc=us,dc=company,dc=lan"
scope="subtree"
username="US\#form.username#" 
password="#form.password#">

我永远不会在没有 cfqueryparam 的情况下运行带有用户输入的查询(以包装用户名和密码输入),但是类似的东西甚至可用于 cfldap 吗?(如果这有所作为,我们将使用 CF10。)

更新:

为了澄清,当我尝试这个时,我收到以下错误:

标记 CFLDAP 的属性验证错误。它不允许属性 CFSQLTYPE、VALUE。

4

1 回答 1

5

不,您不能在cfqueryparam标签中使用该cfldap标签。cfqueryparam专门用于 SQL 查询。不过,您的想法是正确的。从不相信用户输入

标签本身确实为您提供cfldap了一些保护。

LDAP 注入

ColdFusion 使用<cfldap>标签与 LDAP 服务器进行通信。此标记具有指示针对 LDAP 执行的查询的 ACTION 属性。此属性的有效值为:add、delete、query(默认)、modify 和 modifyDN。所有<cfldap>调用都转换为 JNDI(Java 命名和目录接口)查找。但是,由于<cfldap>封装了调用,如果将本机 JNDI 代码传递给其属性,它将引发语法错误,从而使 LDAP 注入更加困难。

ColdFusion 8 开发人员安全指南的第 14 页开始,如果您还没有这样做,您应该阅读该指南。它是为 ColdFusion 8 编写的,但如果不是全部的话,它仍然是相关的。ColdFusion 11 文档有一个更新版本,但它实际上也引用了版本 8 文档作为参考。

我建议您在这里采用白名单方法。您的活动目录对用户名和密码字段有特定要求;只有小写和大写字母、数字等。创建一个正则表达式,只检查用户输入的那些有效字符。如果任一字段包含其他任何内容,则拒绝提交并且不运行cfldap调用。

于 2015-03-23T19:06:35.443 回答