我想防止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。
否,不能在cfldap
标记中使用cfqueryparam
标记。cfqueryparam
专门用于SQL查询。不过你的想法是正确的从不信任用户输入
cfldap
标签本身确实为您提供了一些保护。
LDAP注入
ColdFusion使用
<cfldap>
标签与LDAP服务器进行通信。这个标记有一个ACTION属性,它指示对LDAP执行的查询。此属性的有效值为:add、delete、query(默认值)、modify和modifyDN。所有<cfldap>
调用都转换为JNDI(Java命名和目录接口)查找。但是,由于<cfldap>
封装了调用,如果将本机JNDI代码传递给其属性,它将抛出语法错误,从而使LDAP注入更加困难。
来自ColdFusion8开发人员安全指南的第14页,如果您还没有这样做,您应该阅读该指南。它是为ColdFusion 8编写的,但即使不是全部,也有很多内容仍然相关。ColdFusion 11有一个更新版本的文档,但它实际上也引用了版本8的文档作为参考。
我建议你在这里采用白名单的方法。您的active directory对用户名和密码字段有特定的要求;只有小写和大写字母、数字等。创建一个正则表达式,只检查用户输入中的有效字符。如果任一字段包含任何其他内容,则拒绝提交,并且不运行cfldap
调用。