跳转到主要内容
zheojian 提交于 2 February 2013

原文链接: Writing secure code https://drupal.org/writing-secure-code

 

想了解安全问题吗?请关注security team

无论你是在写一个PHP代码片段还是一个完整的模块,重要的是确保你的代码安全。

对输出使用check函数,以防止跨站点脚本攻击。

用户提交的任何一个片段的内容都不能原样放到HTML中。

使用数据库抽象层,以避免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的节点访问机制需要这样的调用。否则,访问者可能获得的节点但是却没有权限查看。