我想防止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。
答案 0 :(得分:5)
不,您无法在cfqueryparam
标记中使用cfldap
标记。 cfqueryparam
专门用于SQL查询。你在考虑正确。 永远不要信任用户输入
cfldap
标记确实为您提供了一些保护。
LDAP注入
ColdFusion使用
<cfldap>
标记与LDAP服务器通信。此标记具有ACTION属性,该属性指示针对LDAP执行的查询。此属性的有效值为:add,delete,query(default),modify和modifyDN。所有<cfldap>
调用都转换为JNDI(Java命名和目录接口)查找。但是,因为<cfldap>
包装了调用,如果将本机JNDI代码传递给其属性,它将抛出语法错误,从而使LDAP注入更加困难。
如果您还没有这样做,请阅读ColdFusion 8 developer security guidelines的第14页。它是为ColdFusion 8编写的,但如果不是全部,它仍然是相关的。有一个updated version of the document for ColdFusion 11但它实际上也引用了版本8文档作为参考。
我建议你在这里使用白名单方法。您的活动目录对用户名和密码字段有特定要求;只有小写和大写字母,数字等。创建一个正则表达式,仅检查用户输入的有效字符。如果任何一个字段包含其他内容,则拒绝提交,不要运行cfldap
调用。