web-dev-qa-db-ja.com

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

WordPress用の安全なテーマを書くのに役立つように、データのサニタイズ(データの検証ではなく)を理解しようとしています。私はインターネットを検索して、ベストプラクティスを詳述したテーマ開発者のための包括的なガイドを見つけようとしました。 Data Validationというタイトルのコーデックスページなど、出会ったリソースがいくつかありましたが、役に立ちませんでした。コーデックスページには、使用可能なサニタイズ機能、その使用方法、およびその機能がリストされていますが、なぜ一方を他方で使用するのか、または特定のサニタイズ機能を使用するのは説明できません。この記事の目的は、悪意のある/サニタイズされていないコードの例と、適切なサニタイズのためにどのように書き直すべきかを投稿するよう全員に依頼することです。これは投稿タイトルや投稿thumnails srcをサニタイズするための一般的なコードか、Ajaxリクエストのための$_POSTデータのサニタイズを処理するより複雑なコードです。

さらに、データベースを追加/更新するための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>

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

16
John

この codexページ はそれをかなりよく説明していると思います。

最も重要で一般的に使用される関数はおそらく 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'];

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

$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インラインに対してサニタイズを異なる方法で行う必要がありますか。

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

いいえ.

12
onetrickpony

Mark Jaquithによるこのビデオは、私にとってそれをすべて片付けました。 http://wordpress.tv/2011/01/29/mark-jaquith-theme-plugin-security/ /

5
byronyasgur