3
八/09
0

编写安全的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安全方面的资料。

关键字:
1
八/09
1

快速从drupal5升级到drupal6

从drupal5升级到drupal6的必要性有必要先说明下(听着有点绕口):一年前drupal6刚出来的时候大家都不建议升级,因为最大的问题就是相关模块支持太少,但到现在drupal6已经相当成熟,包括更严格的菜单路径映射功能(drupal5的时候菜单系统出现很多安全问题),更好的jquery加强站点UE,以前设置权重值很是麻烦,而现在只要进行拖动保存后就可以了,另外很多api更加细化,人性化和简单化。BTW,能升级到windows7的用户赶紧升级吧,因为比XP好用很多,我没有枪手嫌疑,因为我是个忠实的Linux用户。

关于升级服务器端部署问题这篇文章将不涉及,前面文章有介绍过,并且我记得在drupal.org上有篇文章是专门介绍如何从drupal5直接升级到drupal6的,我这里只是介绍模块开发人员要学习和参考的东西。

首先,菜单系统。我想这是在drupal6中最大的变化,首先$items这个序列化数组的键完全不同了,从callback 和 callback arguments变成了page callback,access也变成了access_callback以及access_arguments(包括title属性),这就意味着开发人员可以更好的定制drupal的菜单系统。而且drupal6引入的path arguments更好的规范了drupal的动态菜单,配合load后缀函数方面页面传递参数,这里改动比较复杂,大家参考官方文档。

数据库层改动不大,接下来说说form api几个地方的改动,几个hook的参数发生了改变,form_alter , form_validate, form_submit,第一个变成了三个参数,最后一个参数才是form_id,并且为了性能问题,因为之前form_alter要检测所有的form,加入了modulename_form_formname_alter函数。第二个参数数组发生了变化,现在都用$form_state['value']['element_name']判断,其中element_name是form数组中定义的表单元素。第三个提交后返回地址更加方便,直接修改$form['redirect']的值为内部链接就可以了,不用drupal_goto函数(其实也是对drupal_goto的再次包装),不过记得传递进来的是地址引用,而不是值。

在使用上来看,很多模块都更新了,操作更加方面,所以建议大家升级到drupal6系统。

关键字:
16
七/09
1

drupal的WAP页面

要给站点提供一些wap访问的简单页面,数据在drupal的db中已经有了,网上找了找没有相关模块,只能自己动手了。

在站点根目录下创建文件wap.php

 
$output = '';
 
switch ($_GET['op']) {
  case 'list':
    $pid = ( isset($_GET['id']) ? intval($_GET['id']) : '' );
 
    $result = // fetch from database.
 
    $output .= '';
    foreach ($result as $key => $val) {
      $output .= '
 
';
      $output .= '<a href="?'. htmlentities('op=view&amp;id='. $key) . '">'.$val. '</a>';
      $output .= '
 
';
    }
    $output .= '';
    break;
 
  default:
    break;
}
$output .= '';
print $output;

一个简单的功能就有了,可以分离模板,包含别的功能进来,做更多的处理。

关键字:
9
六/09
1

【转载】drupal的性能问题

原文地址: http://www.bloggern.com/3577.html

我因为工作原因,曾经对Drupal做过比较全面的测试。当时的环境是双服务器(DB server+Web Server),硬件配置都是单CPU+4G。数据库里面有几千条记录。用JMeter对各种情况下(开/关各种cache模块,logged user/anonymous user)不同页面的读取和写入操作都进行过测试。 测试的结论可能和很多人印象中不一样。都说Drupal对数据库要求高,但事实上,无论是cache还是非cache模式,DB server的压力都是相当小的(CPU在10%以下),而Web Server的CPU在80%以上。跟踪所有的db query的执行时间后,也证明了这一点(全部db query的执行时间只占页面生成时间的一小部分)。所以结论是,Drupal在大量logged user并发情况下的瓶颈,在于执行Drupal代码的CPU时间。

2
六/09
4

关于drupal区块的小问题

drupal模块开发中经常用到区块的概念,将一些相关数据放到区块中,配合权限验证,将用户能看到的信息以区块的形式展示到用户浏览器中。不过区块是跟节点无关了,如果要根据当前节点页面的特性针对性的在区块中显示内容,我的做法是:

if (arg(0) == ‘node’ && is_numeric(arg(1)) { // 初步设想是仅仅当路径是’ node / 3 ‘,类似这样的地址时显示

  $node = node_load(arg(1));

  if (!$node->teaser) // 初步设想是节点以全节点方式显示的时候才有效(提高一点效率)

}

在调试的过程中发现,arg函数是和drupal内置的path模块无关的。也就是说如果给某个节点设置了path,比如给公司的帮助页面设置了path : www.target.com/help,那么arg(0)我们取到的还是node,而不是help。

另外, $node对象中的teaser属性指的是节点的摘要,而不是“是否以全文的方式显示”,这个跟nodeapi钩子,以及hook_view中的$teaser形式参数是不一样的,后者确确实实指的是“是否以全文的方式显示”,也就是说上面的判断是错误的。

关键字: