原文链接: 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的节点访问机制需要这样的调用。否则,访问者可能获得的节点但是却没有权限查看。