ブロック、ノード、ビュー引数、ルールなどで(Drupal UIからの)カスタムPHP/PHPフィルターを使用しないことを言っている人々を何度も目にしました。少し調べてみましたが、多くが見つかりました、これはDrupalのベストプラクティスであり、すべて「知っている」だけのようです。
特にDrupalまたはPHPを初めて使用するエンドユーザーまたは人々の手に潜在的なセキュリティリスクをもたらすことを理解していますが、開発者/サイトビルダーとして、カスタムを使用しない本当の理由PHP Drupal UIから?
いくつかの理由:
他にも理由はあるかもしれませんが、それで十分でしょう:)
このコードはデバッグおよび保守が困難です。私はそのような種類のphpコードのバージョン管理を使用する方法を知りません。
そしてこれは、DrupalまたはPHPを初めて使用する人にとっては、潜在的なセキュリティリスクです。
PHPフィルターがノードで使用される場合を考慮して、それを使用しない理由は、すべてのユーザーを許可したくない場合、そのノードを編集できるユーザーを制限することです。 PHPフィルターを使用します。
PHPフィルターを使用するよりも、ノードコンテンツ内の特定のテキストを、それが実行するコードの結果で置き換えるカスタムモジュールを使用することをお勧めします(eval()
)、またはノードの本文に独自のテキストを追加します。この場合、任意のPHPコードを追加する権限がなくても、すべてのユーザーがノードを編集できます。次に、PHPフィルターによって実行されます。
一般に、eval()
はコードの可読性、実行前にコードパスを予測する機能(およびその潜在的なセキュリティへの影響)、ひいてはコードをデバッグする機能を低下させるため、回避することをお勧めします。
開発サイトやテストサイト以外では、PHPフィルターを有効にしたり、PHP eval()
に渡されるコードを使用したりします。
PHPフィルターはDrupal 8.から削除されました。これは現在 サードパーティモジュール であり、- セキュリティ勧告ポリシー 。これは、おそらく本番サーバーでそれを使用しない理由です(すでに与えられた理由で納得しなかった場合)。
管理者以外のユーザーにdbを直接変更させたくない場合に、ユーザーにこの権限を与えないようにするセキュリティの脆弱性の理由を次に示します。
<?php
echo file_get_contents(dirname(__FILE__)."/../sites/default/settings.php");
?>
Drupal db credentials のハッキング
上記で指定されたさまざまな問題の回避策として、コードのメンテナンスの難しさ、バージョン管理、エラーの発見など、わずかに「klugey」の可能性があります。
常に含まれているいくつかのファイルに関数を作成します(機能に応じて慎重に名前を付けます)。サイト用に作成しているカスタムモジュールがある場合、これらの関数を配置するのに最適な場所です。次に入力するphpは単純です:return my_specialfunc($somevar);
-$somevar
ここでは、作業対象のノードオブジェクトである可能性があります。
たいていの場合、自分のコードを呼び出す柔軟性が必要な場合があります。この手法を使用すると、ファイル内の関数を変更するだけなので、コードの保守が簡単になります。関数はバックトレースに表示されるため、エラーの特定は簡単です。
ただし、これは潜在的なセキュリティ問題を解決しないことに注意してください。これらは、Drupalコアのセキュリティに大きく依存します。一般に、データベースに含まれるコードは、多くの場合、セキュリティのアヒルのかかとです。データベースに含まれるコードを使用する機能は、悪用、およびそれらの周りのセキュリティは非常に厳格である必要があります。ただし、Drupalは一般に、これらの問題のセキュリティを維持するのに非常に優れています。 。
return functionname($object)
のようなことをするのではなく、可能な限りトークン/フィルターシステムを使用することをお勧めします。 Insert ViewやEmbed Nodeのようなモジュールがあります。これは、ノードまたはブロックの本体にPHPを埋め込む必要がある一般的な状況に役立ちます。
データの移植性に注意する必要があります。ノードをdrupal 7からdrupal 8に移行し、一部のノードの本文に<?php whatever_function_that_does_not_exist_anymore(); ?>
が含まれている場合はどうなりますか?
5か月以内ではなく5年以内にプロジェクトについて考えないでください。私の意見では、更新、優れた実践、および移植性は、優れたITプロジェクトの重要な側面です。
貢献度の低いモジュールをできるだけ使用することも、この1つの側面です。