原文链接: Writing secure code https://drupal.org/writing-secure-code
想了解安全问题吗?请关注security team。
无论你是在写一个PHP代码片段还是一个完整的模块,重要的是确保你的代码安全。
对输出使用check函数,以防止跨站点脚本攻击。
用户提交的任何一个片段的内容都不能原样放到HTML中。
- 对纯文本使用check_plain或theme('placeholder')(drupal 7: drupal_placeholder)。
- 使用check_markup或filter_xss来标记包含的文本。
- 使用函数t()以及 @ 或 % 这样的占位符来构造安全的、可翻译的字符串。
使用数据库抽象层,以避免SQL注入攻击
正确使用数据库层。例如,绝对不要将数据直接连接到SQL查询中,像这样:
<?php 
 db_query ( 'SELECT foo FROM {table} t WHERE t.name = ' . $_GET [ 'user' ]); 
 ?>
相反,在db_query中使用适当的参数替换:
对于Drupal 6及以前的版本
 <?php 
 db_query ( "SELECT foo FROM {table} t WHERE t.name = '%s' " , $_GET [ 'user' ]); 
 ?>
 
如果你的SQL中的参数是可变数目的,你应该创建一个占位符数组,不要这样做:
 <?php
 db_query("SELECT t.s FROM {table} t WHERE t.field IN (%s)", $from_user); 
?>
相反的,要这样做:
<?php
$placeholders = implode(',', array_fill(0, count($from_user), "%d"));
db_query("SELECT t.s FROM {table} t WHERE t.field IN ($placeholders)", $from_user); 
?>
对于Drupal 7+
DB层用了PHP PDO,可以用占位符数组
<?php
db_query("SELECT foo FROM {table} t WHERE t.name = :name", array(':name' => $_GET['user']));
?>
对于可变数目的参数,使用参数数组或者使用db_select():
<?php
db_query("SELECT t.s FROM {table} t WHERE t.field IN (:users)",  array(':users' => $from_user));
?>
或者:
<?php
$result = db_select('table', 't')
    ->fields('t', array('s'))
    ->condition('t.field', $from_user, 'IN')
    ->execute();
?>
使用db_rewrite_sql来遵守节点的访问限制规则。
大多数跟节点或{node}表相关的SQL语句都应该被包裹在一个db_rewrite_sql()函数调用里面:
<?php 
 $result = db_query ( db_rewrite_sql ( "SELECT n.nid, n.title FROM {node} n" )); 
 ?>
Drupal的节点访问机制需要这样的调用。否则,访问者可能获得的节点但是却没有权限查看。
