web-dev-qa-db-ja.com

フォームAPIを使用したユーザー入力のサニタイズ-ノードの作成

D7フォームAPIを使用して、送信時にノードを作成するユーザー向けにいくつかのカスタムフォームを作成しています(node_submitおよびnode_save関数を使用)。これは私が使用しているフォームの例です:

function create_article_form($form, &$form_state) {

$form['node_title'] = array(
    '#type' => 'textfield',
    '#title' => t('Node Title'),
    '#size' => 20,
    '#required' => TRUE,
 );

$form['submit_button'] = array(
   '#type' => 'submit',
   '#value' => t('Create Node'),
 );

return $form;
}

これはうまくいきますが、私は消毒について疑問に思っています。私の調査から、check_plain()関数はセキュリティのためにテキストフィールドに使用する必要があるようです。ただし、生のHTMLエンティティも保存されます。

たとえば、次のように送信機能でノードのタイトルを設定しています。

$node->title = check_plain($form_state['values']['node_title']);

この問題は、ユーザーが次のようなものを入力した場合です。

Mike's Tacos

次のようにノードのタイトルに保存されます:

Mike's Tacos

したがって、そのタイトルを任意の場所(ビュー、カスタムノード、XX.tlp.phpなど)に出力すると、このように表示されます。

Check_plain(または最高のセキュリティを提供する関数)の使用方法を手伝ってくれる人はいませんが、人間が読める形式(Mike's Tacos)で値を保存できますか?

6
Micah Boon

フィルターはoutputに使用され、入力には使用されません。これはDrupalの方法です。生の無害化されていないデータをストレージに保存し、レンダリング時にフィルター(およびキャッシュ)します。

ノードがレンダリングされているときにcore/contribによって同じ関数を介して実行されるため、保存する前にノードタイトルでcheck_plain()を実行しないでください。 。

自分でノードタイトルをレンダリングする責任がある場合は、常に最初にcheck_plain()を介して実行する必要があります。

echo check_plain($node->title);

しかし、常に出力ではあり、入力ではありません。

4
Clive