八/090
编写安全的drupal代码
本文主要是参考那本经典的drupal 6 模块开发指南,接合自己对脚本安全的一点理解整理出来的,方便E文不是很好的朋友共享。
首先是文本格式转换方面的有效函数,以前的文章我也提过。check_plain()函数能安全的将用户任意输入转换为纯文本,filter_xss()函数放宽了用户的输入,可以输入一些不被过滤的html字符,既有好的样式也保证了安全性,而drupal_urlencode()则对url安全编码,比较常用,是对php的urlencode函数更好的一次封装。mime_header_encode()函数对邮件更好的编码,使用drupal_mail()函数时不需调用,已经内部应用了。
————-为database抽象层使用安全方面预留位置—————
drupal的文件安全已经在htaccess文件中做了很多限制,这个是web容器级别的安全,脚本方面我们仍然要考虑,使用文件路径前,最好调用file_check_location函数。为了避免邮件头部注入,drupal为我们引进了mime_header_encode()函数,文中提到一个很简单的例子作为参考。
如果邮件的标题(subject)是用户输入的,如果输入
Have a nice day%0ABcc:spamtarget@example.com%0A%0AL0w%20c0st%20mortgage!
邮件头部注入后则会变成:
Subject: Have a nice day
Bcc: spamtarget@example.com
L0w c0st mortgage!
…
一目了然。
另外,我们经常会编写独立的php文件来为drupal做一些维护或者数据迁移的工作,
include_once ‘includes/bootstrap.inc’;
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
这两行代码执行后,我们就可以在独立的php文件中使用drupal的db抽象层和相关函数,但最好我们加上uid为1的判断,只有超级用户才可以执行该php文件,如果该文件是操作发布站点数据,则这个限制更显得至关重要。
ajax的安全大家可以参考其他资料,请求脚本程序要格外小心。
最后,drupal的表单api中,title和description等元素必须check_plain()转换为纯文本,而default_value则无需,因为theme_textfield() 在includes/form.inc文件中已经调用一次了,二次转义将会使数据更加混乱。
以上只是接合drupal的安全方面简单陈述,要想更加安全你的代码,请参考更多的PHP安全方面的资料。