データのサニタイズ:コード例を使用したベストプラクティス


15

WordPressの安全なテーマを作成するために、データ検証(データ検証ではなく)を理解しようとしています。テーマ開発者向けのベストプラクティスを詳しく説明する包括的なガイドを探して、インターネットを検索しました。Data Validationというコーデックスページなど、私が出会ったいくつかのリソースがありましたが、役に立つものはありませんでした。コーデックスページには、使用可能なサニタイズ機能、その使用法、およびその機能がリストされていますが、なぜ他のサニタイズ機能を使用するのか、またはどのような状況で特定のサニタイズ機能を使用するのかを説明できません この投稿の目的は、すべての人に不正/非サニタイズコードの例を提供し、適切なサニタイズのためにどのように書き換えるかを要求することです。これは、投稿タイトルまたは投稿サムネイルをサニタイズする一般的なコードsrcまたはサニタイズを処理するより精巧なコードです。$_POST Ajaxリクエストのデータ。

さらに、データベースを追加/更新するためのWordPress機能(たとえば、以下のコードブロックで言及されている機能)が自動的にサニタイズ作業を処理するかどうかを知りたいですか?「はい」の場合、これらのWordPress機能に送信されたデータをサニタイズするための追加措置を講じるときに例外はありますか?

add_user_meta
update_user_meta
add_post_meta
update_post_meta
//just to name a few

また、PHPのHTMLをHTMLのPHPインラインに対してエコーする場合、サニタイズは異なる方法で行う必要がありますか?私が尋ねていることをより明確にするために、ここにコードがあります:

<?php echo '<div class="some-div ' . $another_class . '" data-id="' . $id . '" >' . $text . '</div>'; ?>

<div class="some-div <?php echo $another_class; ?>" data-id="<?php echo $id; ?>"><?php echo $text; ?></div>

上記のステートメントは両方とも同じことを達成します。しかし、それらを異なる方法でサンテートする必要がありますか?


1
あなたがサニタイズしようとしているものを知っていれば助けになるかもしれません。テーマはデータを提示するためのものです...ユーザーが送信するデータをサニタイズするだけでよく、送信は通常プラグインによって処理されます。
EAMann

@EAMann esc_attrやesc_htmlなどのエスケープ関数は、出力をエスケープするために構築されます。間違っている場合は修正してください。データを提示するということは、データを出力しているということなので、テーマ内でもエスケープする必要があります。それ以外の場合、esc関数は必要ありません。1つまたは2つのコードフラグメントのサニタイズに限らず、WordPressテーマ全体のサニタイズを理解したいと思います。
ジョン

「データを提示することは、データを出力していることを意味するため、テーマ内でもエスケープする必要があります」-いいえ。繰り返しますが、信頼できないデータのみをエスケープする必要があります
onetrickpony

@OneTrickPonyそれは私にとってより明確になっています。私がこれを理解していることを絶対に確信するために-コメント内容をエスケープしますが、コメントIDまたは投稿IDをHTMLで出力する場合はエスケープしません。ごめんなさい、本当に次々に質問であなたを悩ませます。
ジョン

2
「信頼できないデータをエスケープするだけでよい」-私は完全に同意します。私が追加する唯一のことは、データを決して信用してはいけないということです;)
Ian Dunn

回答:


12

このコーデックスのページでは、かなりよく説明されていると思います。

最も重要で一般的に使用される関数はおそらくesc_attrです。次の例をご覧ください。

<a href="<?php print $author_url; ?>" title="<?php print $author_name; ?>"> 
  <?php print $author_name; ?>
</a>

場合は$author_name含まれてい"た文字を、あなたの属性を閉じ取得し、その文字が続いている場合onclick="do_something();"、それはさらに悪化得ることができる:)

こうprint esc_attr($author_name)することで、そのような文字が確実にエンコードされ、ブラウザーは想定外のことを行いません。

必要ない場合が1つあります。数字が必要な場合です。その場合、入力データを整数にキャストできます。次に例を示します。

print (int)$_POST['some_number'];


そこにリストしたmeta *関数は、データベースストレージへの入力のサニタイズをすでに処理しているので、心配する必要はありません。

このwpdb->prepare()メソッドは、DBクエリを自分で行うときに使用する必要があります。以下に例を示します。

$sql = $wpdb->prepare('
    UPDATE wp_posts SET post_title = %s WHERE ID = %d', 
      $_POST['title'], $_POST['id']);

$wpdb->query($sql);

%sそして%dキーワードは、あなたの消毒の$ _POSTの値に置き換えられてしまいます。

WP.orgリポジトリ内の多くのプラグインでよく見られる間違いは、次のように、既に準備されたクエリを渡すことです。

$wpdb->prepare('UPDATE wp_posts SET post_title = \''.$_POST['title'].' WHERE ...

これをしないでください:)

また、PHPのHTMLをHTMLのPHPインラインに対してエコーする場合、サニタイズは異なる方法で行う必要がありますか?

上記のステートメントは両方とも同じことを達成します。しかし、それらを異なる方法でサンテートする必要がありますか?

番号。


入力のためのThx。あなたの説明は私にとって物事をより明確にします。
ジョン

さらに小さな説明が必要です。PHP内でvar(たとえば$ var = 'string';)に文字列を渡し、それをHTML属性としてエコーする場合、エコーするときに$ varをサニタイズしますか。または、データベースから$ varの値を取得した場合にのみサニタイズが必要です。
ジョン

何らかの方法で画面にエコーするとき
-onetrickpony

したがって、PHPコード内で文字列を$ varに渡したか、データベースからデータを取得して$ varに渡したかにかかわらず、正しく理解できた場合は、どちらも出力をescする必要があります。正しい?
ジョン

はい。たとえば、コメントの作成者の名前など、そのデータがユーザー入力に含まれている場合。「PHPコード内で文字列を$ varに渡す」ことで、変数に既知の値を割り当てたことを意味する場合、明らかに-いいえ、その変数を
サニタイズ

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.