安全なソースコードを書く

セキュリティ問題が見つかった時には、セキュリティチームに知らせてください。
作成したのがわずかなPHPのソースコードであろうとモジュール全体であろうと、ソースコードがセキュアであることは重要です。

クロスサイトスクリプティングの脆弱性を防ぐために出力時にcheck関数を使用する

入力した値をそのままHTMLとして登録するべきではありません。

  • プレーンテキストの場合、「check_plain」関数を使います。
  • マークアップテキストには「filter_xss 」を利用します。また、管理者によって入力され、ほとんどのマークアップが含まれるテキストには「filter_xss_admin」を利用します。「check_markup」はテキストのサニタイズを行うことができますが、関連するテキスト形式を伴うテキストエリアのようなコンテキストを除いて、テーマやモジュールの中で「check_markup」を使用してはいけません。
  • 安全で翻訳可能な文字列を生成するには、@ や % などの置き換え文字を利用して「t() 」関数を使ってください。
    詳細については、テキストの安全な取り扱い を参照してください。

SQLインジェクション攻撃を避けるにはデータベース抽象化レイヤーを使ってください。

データベース層を正しく使ってください。例えば、以下に示すようにデータをSQLクエリと直接連結しないでください。

 db_query('SELECT foo FROM {table} t WHERE t.name = '. $_GET['user']); 

db_queryの適切な引数を使ってください。

Drupal6 と過去のバージョンの場合、

 db_query("SELECT foo FROM {table} t WHERE t.name = '%s' ", $_GET['user']); 

SQLに複数の引数を入れたい場合、置き換え文字の配列を作成してください。以下のような書き方は避けるようにしてください。

 db_query("SELECT t.s FROM {table} t WHERE t.field IN (%s)", $from_user);

次にサンプルコードを示します。

$placeholders = implode(',', array_fill(0, count($from_user), "%d"));

db_query("SELECT t.s FROM {table} t WHERE t.field IN ($placeholders)", $from_user); 

Drupal7以降では、データベース層はPHP PDO上に存在し、名前付きの置き換え文字の配列を利用します。

db_query("SELECT foo FROM {table} t WHERE t.name = :name", array(':name' => $_GET['user'])); 

複数の引数がある場合は、引数の配列を使うか「db_select()」を使ってください。

db_query("SELECT t.s FROM {table} t WHERE t.field IN (:users)",  array(':users' => $from_user)); 

または、

$result = db_select('table', 't')
    ->fields('t', array('s'))
    ->condition('t.field', $from_user, 'IN')
    ->execute();

ノードアクセス制約を有効にする「db_rewrite_sql」を使ってください。

ノードや{node} テーブルを参照するSQLには a db_rewrite_sql() 関数呼び出しでラップしてください。

 $result = db_query(db_rewrite_sql("SELECT n.nid, n.title FROM {node} n")); 

Drupalのノードアクセスメカニズムではこのような呼び出しが必要です。さもないと閲覧権限のないノードに訪問者がアクセスできてしまう恐れがあります。

翻訳元URL:https://www.drupal.org/writing-secure-code