当サイト、Codex 日本語版は今後積極的な更新は行わない予定です。後継となる新ユーザーマニュアルは、https://ja.wordpress.org/support/ にあります。
万が一、当サイトで重大な問題を発見した際などは、フォーラムWordSlack #docs チャンネルでお知らせください。</p>

「データ検証」の版間の差分

提供: WordPress Codex 日本語版
移動先: 案内検索
(最新版のマージ <!-- 02:48, 22 July 2015‎ Taupecat 版 -->)
(残りを和訳。)
1行目: 1行目:
 
信頼できないデータが、さまざまな情報源から入ってきます (ユーザー、第三者のサイト、あなた自身のデータベースも!…)。そして、これらすべては、入力時と出力時の両方で検証する必要があります。
 
信頼できないデータが、さまざまな情報源から入ってきます (ユーザー、第三者のサイト、あなた自身のデータベースも!…)。そして、これらすべては、入力時と出力時の両方で検証する必要があります。
  
<div id="Output Sanitization">
+
<div id="Output_Sanitization">
 
== 出力の無害化 ==
 
== 出力の無害化 ==
 
</div>
 
</div>
16行目: 16行目:
 
: 結果が負でないことを保証します。
 
: 結果が負でないことを保証します。
  
<div id="HTML/XML">
+
<div id="HTML.2FXML">
 
=== HTML/XML ===
 
=== HTML/XML ===
 
</div>
 
</div>
(HTML文書に対して) 多くの形式のXML文書が理解する文字実体参照は <code>&amp;apos;</code>、<code>&amp;amp;</code>、<code>&amp;gt;</code>、<code>&amp;lt;</code>、<code>&amp;quot;</code> の5つのみであることに注意してください。テキストを XML 書類として出力するときは、不正な文字実体参照を含むあらゆるテキストを、WordPress の <code>[[関数リファレンス/ent2ncr|ent2ncr]]( $text )/[[:en:Function_Reference/ent2ncr|en]]</code> 関数を通してフィルターしてください。
+
(HTML 書類とは異なり) 多くの形式の XML 書類が理解する文字実体参照は <code>&amp;apos;</code>、<code>&amp;amp;</code>、<code>&amp;gt;</code>、<code>&amp;lt;</code>、<code>&amp;quot;</code> の 5 つのみであることに注意してください。テキストを XML 書類として出力するときは、不正な文字実体参照を含むあらゆるテキストを、WordPress の <code>[[関数リファレンス/ent2ncr|ent2ncr]]( $text )</code> /[[:en:Function_Reference/ent2ncr|en]] 関数を通してフィルターしてください。
  
<div id="HTML/XML Fragments">
+
<div id="HTML.2FXML_Fragments">
 
==== HTML/XML の断片 ====
 
==== HTML/XML の断片 ====
 
</div>
 
</div>
; <tt>[[関数リファレンス/wp_kses|wp_kses]]( (string) $fragment, (array) $allowed_html, (array) $protocols = null ) /[[:en:Function_Reference/wp_kses|en]]</tt>
+
; <tt>[[関数リファレンス/wp_kses|wp_kses]]( (string) $fragment, (array) $allowed_html, (array) $protocols = null )</tt>
 
: KSES は悪意あるスクリプトを除去します。すべての信頼できない HTML (投稿文、コメント文など) は <code>wp_kses()</code> を通すべきです。使い方やデフォルト値などは {{Trac|wp-includes/kses.php}} を参照してください。
 
: KSES は悪意あるスクリプトを除去します。すべての信頼できない HTML (投稿文、コメント文など) は <code>wp_kses()</code> を通すべきです。使い方やデフォルト値などは {{Trac|wp-includes/kses.php}} を参照してください。
 
:
 
:
: 許可する HTML タグの配列を <code>wp_kses()</code> に渡す代わりに、 <code>[[関数リファレンス/wp_kses_post|wp_kses_post]]( (string) $fragment ) /[[:en:Function_Reference/wp_kses_post|en]]</code> を用いて投稿やページで許可されるタグを定義したり、 <code>[[関数リファレンス/wp_kses_data|wp_kses_data]]( (string) $fragment )</code> を用いてコメントで許可されるタグのリストを定義することができます。
+
: 許可する HTML タグの配列を <code>wp_kses()</code> へ渡す代わりに <code>[[関数リファレンス/wp_kses_post|wp_kses_post]]( (string) $fragment )</code> を用いれば、投稿や固定ページで許可されるタグのみを残せます。また <code>[[関数リファレンス/wp_kses_data|wp_kses_data]]( (string) $fragment )</code> を用いれば、コメントで許可される少数のタグのみを残せます。
:  
+
:
: Note that the kses system can be resource-intensive, and should therefore not be run as an output sanitization filter directly, but as a filter to data after it has been input and processed, before it is saved in the database. WordPress runs kses on the pre_comment_content filter, for example, to filter the HTML before saving the comment.
+
: KSES システムはリソースをたくさん消費する場合があるので、出力を無害化するフィルターとして直接実行するのは避けるべきであることに注意してください。そうではなくデータが入力され処理された後、データベースへ保存する前にフィルターとすべきです。例えば WordPress は KSES を <tt>pre_comment_content</tt> フィルターとして実行し、コメントを保存する前に HTML を除去します。
; <code>[[関数リファレンス/wp_rel_nofollow|wp_rel_nofollow]]( (string) $html ) /[[:en:Function_Reference/wp_rel_nofollow|en]]</code>
+
; <code>[[関数リファレンス/wp_rel_nofollow|wp_rel_nofollow]]( (string) $html )</code> /[[:en:Function_Reference/wp_rel_nofollow|en]]
 
: あらゆる <nowiki><a></nowiki> リンクに "rel='nofollow'" 属性をつけます。
 
: あらゆる <nowiki><a></nowiki> リンクに "rel='nofollow'" 属性をつけます。
 
:
 
:
; <code>[[関数リファレンス/wp_kses_allowed_html|wp_kses_allowed_html]]( (string) $context ) /[[:en:Function_Reference/wp_kses_allowed_html|en]]</code>
+
; <code>[[関数リファレンス/wp_kses_allowed_html|wp_kses_allowed_html]]( (string) $context )</code>
: 所定のコンテキストで許可される HTML タグの配列を提供します。許可されるものは、<tt>post | strip | data | entities</tt> <tt>pre_user_description</tt> のようなフィールドフィルターです。
+
: 所定のコンテキストで許可される HTML タグの配列を提供します。指定できるのは <tt>post</tt>, <tt>strip</tt>, <tt>data</tt>, <tt>entities</tt> または <tt>pre_user_description</tt> のようなフィールド用フィルターの名前です。
  
<div id="Text Nodes">
+
<div id="Text_Nodes">
 
==== テキスト節 ====
 
==== テキスト節 ====
 
</div>
 
</div>
 
; <code>[[関数リファレンス/esc_html|esc_html]]( $text )/[[:en:Function_Reference/esc_html|en]]</code> (Version 2.8 以降)
 
; <code>[[関数リファレンス/esc_html|esc_html]]( $text )/[[:en:Function_Reference/esc_html|en]]</code> (Version 2.8 以降)
: <tt>< (小ナリ)」、「> (大ナリ)」、「& (アンド)」、「" (ダブルクォーテーション)」、「' (シングルクォーテーション)」&#39;</tt> をエンコードします。<code>esc_attr</code>と似ている, except it applies the <code>esc_html</code> filter to the output.
+
: <tt>&lt;</tt> (小ナリ)」、「<tt>&gt;</tt> (大ナリ)」、「<tt>&amp;</tt> (アンド)」、「<tt>&quot;</tt> (ダブルクォーテーション)」、「<tt>&#39;</tt> (シングルクォーテーション)」 をエンコードします。<code>esc_attr</code> と同様ですが、こちらは出力に <code>esc_html</code> フィルターを適用します。
 
; <code>[[関数リファレンス/esc_html_2|esc_html__]] /[[:en:Function_Reference/esc_html_2|en]]</code> (Version 2.8 以降)
 
; <code>[[関数リファレンス/esc_html_2|esc_html__]] /[[:en:Function_Reference/esc_html_2|en]]</code> (Version 2.8 以降)
 
: 翻訳、エンコードをします。
 
: 翻訳、エンコードをします。
46行目: 46行目:
 
: 翻訳、エンコード、出力をします。
 
: 翻訳、エンコード、出力をします。
 
; <code>[[関数リファレンス/esc_textarea|esc_textarea]] /[[:en:Function_Reference/esc_textarea|en]]</code> (Version 3.1 以降)
 
; <code>[[関数リファレンス/esc_textarea|esc_textarea]] /[[:en:Function_Reference/esc_textarea|en]]</code> (Version 3.1 以降)
: テキストエリアの要素をエンコードします。
+
: textarea 要素の中で使用するためにテキストをエンコードします。
; <code>[[関数リファレンス/sanitize_text_field|sanitize_text_field]] /[[:en:Function_Reference/sanitize_text_field|en]]</code> (Version 2.9.0 以降)
+
; <code>[[関数リファレンス/sanitize_text_field|sanitize_text_field]]</code> (Version 2.9.0 以降)
: ユーザーからの入力又はデータベースからの入力を無害化します。
+
: ユーザーからの入力またはデータベースからの入力を無害化します。
  
<div id="Attribute Nodes">
+
<div id="Attribute_Nodes">
 
==== 属性値 ====
 
==== 属性値 ====
 
</div>
 
</div>
 
; <code>[[関数リファレンス/esc_attr|esc_attr]]( $text )</code> (Version 2.8 以降)
 
; <code>[[関数リファレンス/esc_attr|esc_attr]]( $text )</code> (Version 2.8 以降)
: Encodes <tt>< > & " '</tt> (less than, greater than, ampersand, double quote, single quote). Identical to <code>esc_html</code>, except it applies the <code>attribute_escape</code> filter to the output.
+
: <tt>&lt;</tt> (小ナリ)」、「<tt>&gt;</tt> (大ナリ)」、「<tt>&amp;</tt> (アンド)」、「<tt>&quot;</tt> (ダブルクォーテーション)」、「<tt>&#39;</tt> (シングルクォーテーション)」 をエンコードします。<code>esc_html</code> と同様ですが、こちらは出力に <code>attribute_escape</code> フィルターを適用します。
 
; <code>[[関数リファレンス/esc_attr_2|esc_attr__]]()</code>
 
; <code>[[関数リファレンス/esc_attr_2|esc_attr__]]()</code>
 
: 翻訳、エンコードをします。
 
: 翻訳、エンコードをします。
 
; <code>[[関数リファレンス/esc_attr_e|esc_attr_e]]()</code>
 
; <code>[[関数リファレンス/esc_attr_e|esc_attr_e]]()</code>
: 翻訳、エンコード、出力します。
+
: 翻訳、エンコード、出力をします。
  
 
<div id="JavaScript">
 
<div id="JavaScript">
 
 
==== JavaScript ====
 
==== JavaScript ====
 
</div>
 
</div>
; <code>[[関数リファレンス/esc_js|esc_js]]( $text ) /[[:en:Function_Reference/esc_js|en]]</code> (Version 2.8 以降)
+
; <code>[[関数リファレンス/esc_js|esc_js]]( $text )</code> /[[:en:Function_Reference/esc_js|en]] (Version 2.8 以降)
 +
 
  
 
<div id="URLs">
 
<div id="URLs">
71行目: 71行目:
 
; <code>[[関数リファレンス/esc_url|esc_url]]( $url, (array) $protocols = null )</code> (Version 2.8 以降)
 
; <code>[[関数リファレンス/esc_url|esc_url]]( $url, (array) $protocols = null )</code> (Version 2.8 以降)
 
: URL を無害化するときは、常に <code>esc_url</code> を使ってください (テキスト中、属性値、その他あらゆる場所で)。ホワイトリストで提供されたプロトコル(デフォルトは <tt>http</tt> ならびに <tt>https</tt>、<tt>ftp</tt>、<tt>ftps</tt>、<tt>mailto</tt>、<tt>news</tt>、<tt>irc</tt>、<tt>gopher</tt>、<tt>nntp</tt>、<tt>feed</tt>、<tt>telnet</tt>)を持たない URL は拒否し、不正な文字を排除し、危険な文字を除去します。3.0 で非推奨とされた <code>clean_url()</code> の代わりに使います。
 
: URL を無害化するときは、常に <code>esc_url</code> を使ってください (テキスト中、属性値、その他あらゆる場所で)。ホワイトリストで提供されたプロトコル(デフォルトは <tt>http</tt> ならびに <tt>https</tt>、<tt>ftp</tt>、<tt>ftps</tt>、<tt>mailto</tt>、<tt>news</tt>、<tt>irc</tt>、<tt>gopher</tt>、<tt>nntp</tt>、<tt>feed</tt>、<tt>telnet</tt>)を持たない URL は拒否し、不正な文字を排除し、危険な文字を除去します。3.0 で非推奨とされた <code>clean_url()</code> の代わりに使います。
: この関数は文字を HTML 実体にエンコードします。(X)HTML あるいは XML 書類を生成するときはこの関数を使ってください。アンド (<tt>&</tt>) とシングルクォートは (<tt>'</tt>) 数値実体参照 (<tt>&#038, &#039</tt>) にエンコードします。
+
: この関数は文字を HTML 実体にエンコードします。(X)HTML あるいは XML 書類を生成するときはこの関数を使ってください。アンド (<tt>&</tt>) とシングルクォート (<tt>'</tt>) は数値実体参照 (<tt>&#038, &#039</tt>) にエンコードします。
; <code>[[関数リファレンス/esc_url_raw|esc_url_raw]]( $url, (array) $protocols = null ) /[[:en:Function_Reference/esc_url_raw|en]]</code> (Version 2.8 以降)
+
; <code>[[関数リファレンス/esc_url_raw|esc_url_raw]]( $url, (array) $protocols = null )</code> /[[:en:Function_Reference/esc_url_raw|en]] (Version 2.8 以降)
: URL をデータベースに格納するための関数です。この関数は文字を HTML 実体にエンコードしません。URL をエンコードしない形で保存したいときはこの関数を使ってください。 この機能は古い関数 <code>clean_url</code> 関数の <code>$context</code> を <code>db</code> に設定するのと同等です。
+
: URL をデータベースに格納するときに使う関数です。この関数は文字を HTML 実体にエンコードしません。URL を保存するときやエンコードしない形で保存したいときはこの関数を使ってください。この機能は古い関数 <code>clean_url</code> 関数の <code>$context</code> を <code>db</code> に設定したときと同等です。
 
; <code>[[関数リファレンス/urlencode|urlencode]]( $scalar ) /[[:en:Function_Reference/urlencode|en]]</code>
 
; <code>[[関数リファレンス/urlencode|urlencode]]( $scalar ) /[[:en:Function_Reference/urlencode|en]]</code>
: URL をエンコードします。(例えば、クエリパラメータで使用する、など)
+
: URL をエンコードします。(例えばクエリパラメータで使用するなど)
 
; <code>[[関数リファレンス/urlencode_deep|urlencode_deep]]( $array ) /[[:en:Function_Reference/urlencode_deep|en]]</code>
 
; <code>[[関数リファレンス/urlencode_deep|urlencode_deep]]( $array ) /[[:en:Function_Reference/urlencode_deep|en]]</code>
: 配列の全要素を URL エンコードします。
+
: 配列のすべての要素を URL エンコードします。
  
 
<div id="Database">
 
<div id="Database">
92行目: 92行目:
 
  );
 
  );
 
; <code>[[Class Reference/wpdb#Protect Queries Against SQL Injection Attacks|$wpdb->prepare]]( $format, (scalar) $value1, (scalar) $value2, ... )</code>
 
; <code>[[Class Reference/wpdb#Protect Queries Against SQL Injection Attacks|$wpdb->prepare]]( $format, (scalar) $value1, (scalar) $value2, ... )</code>
: <code>$format</code> は [http://php.net/sprintf sprintf()] 形式に似た文字列です。<code>%s</code>、<code>%d</code>、<code>%f</code> のみ理解します。どちらもクォート文字で囲む必要はありません。
+
: <code>$format</code> は [http://php.net/sprintf sprintf()] 形式に似た文字列です。<code>%s</code>、<code>%d</code>、<code>%f</code> のみ理解します。どれもクォート文字で囲む必要はありません。
 
  $wpdb->get_var( $wpdb->prepare(
 
  $wpdb->get_var( $wpdb->prepare(
 
   "SELECT something FROM table WHERE foo = %s and status = %d",
 
   "SELECT something FROM table WHERE foo = %s and status = %d",
99行目: 99行目:
 
  ) );
 
  ) );
 
; <code>[[関数リファレンス/esc_sql|esc_sql]]( $sql )</code>
 
; <code>[[関数リファレンス/esc_sql|esc_sql]]( $sql )</code>
: [[Version_3.6|3.6]]から非推奨になりました。<code>esc_sql()</code> または <code>$wpdb->prepare()</code> を代わりに使ってください。
+
: 文字列またはその配列を SQL クエリで使えるようにエスケープします。配列に対して動作する、見せかけの <code>addslashes()</code> です。一般的に <code>$wpdb->prepare()<code> の方が好まれます。これは共通のフォーマットエラーを直してくれるからです。
; <code>$wpdb->escape( $text )</code>
+
; <del><code>$wpdb->escape( $text )</code></del>
: [[Version 3.6|3.6]]から非推奨になりました。<tt>esc_sql()</tt> または <tt>$wpdb->prepare()</tt>を代わりに使ってください。
+
: [[Version 3.6|3.6]]から非推奨になりました。代わりに <tt>esc_sql()</tt> または <tt>$wpdb->prepare()</tt> を使ってください。
 
; <code>$wpdb->escape_by_ref( &$text )</code>
 
; <code>$wpdb->escape_by_ref( &$text )</code>
 
: 返り値はありません。パラメータが参照で渡されるので、テキストが直接変更され、返り値を割り当てる必要がありません。
 
: 返り値はありません。パラメータが参照で渡されるので、テキストが直接変更され、返り値を割り当てる必要がありません。
; <code>[[Class_Reference/wpdb/esc_like|$wpdb->esc_like]]( $text )</code>
+
; <code>[[Class_Reference/wpdb/esc_like|$wpdb->esc_like]]( $text )</code> /[[:en:Class_Reference/wpdb/esc_like|en]]
: Sanitizes <code>$text</code> for use in a LIKE expression of a SQL query. Will still need to be SQL escaped (with one of the above functions).
+
: <code>$text</code> SQL クエリの LIKE 式で使えるように無害化します。別途 SQL エスケープが必要です(上記のいずれかの関数を使って)。
 
; <del><code>[[関数リファレンス/like_escape|like_escape]]( $string )</code></del>
 
; <del><code>[[関数リファレンス/like_escape|like_escape]]( $string )</code></del>
: [[Version 4.0|4.0]]から非推奨になりました。<tt>$wpdb->esc_like()</tt>を代わりに使ってください。
+
: [[Version 4.0|4.0]] から非推奨になりました。<tt>$wpdb->esc_like()</tt> を代わりに使ってください。
  
 
<div id="Filesystem">
 
<div id="Filesystem">
113行目: 113行目:
 
</div>
 
</div>
  
; <code>[[関数リファレンス/validate_file|validate_file]]( (string) $filename, (array) $allowed_files = "" ) /[[:en:Function_Reference/validate_file|en]]</code>
+
; <code>[[関数リファレンス/validate_file|validate_file]]( (string) $filename, (array) $allowed_files = "" )</code> /[[:en:Function_Reference/validate_file|en]]
: ディレクトリートラバーサル攻撃を防止する、あるいはファイル名がホワイトリストにあるか確認します。<code>$filename</code> が正答な相対パスならば <tt>0</tt> を返します。検証後、<code>$filename</code> を相対パスとして'''扱わなければなりません (MUST)''' (例えば、ABSPATH の後に繋げる等)。なぜなら、<code>/etc/hosts</code> はこの関数で正当と判定されるからです。返り値が正の整数の場合は、<tt>..</tt>, <tt>./</tt>, あるいは <tt>:</tt> がパスに含まれているか、または <code>$allowed_files</code> ホワイトリストに含まれていません。この結果を真偽判定する場合は注意してください。<tt>false</tt> (0) はファイル名が検証を通過したことを示し、<tt>true</tt> (> 0) は検証されなかったことを示します。
+
: ディレクトリートラバーサル攻撃を防止するため、あるいはファイル名がホワイトリストにあるか確認するために使用します。<code>$filename</code> が正当な相対パスなら <tt>0</tt> を返します。検証後、<code>$filename</code> を相対パスとして'''扱わなければなりません (MUST)''' (例えば、ABSPATH の後に繋げる等)。なぜなら、<code>/etc/hosts</code> のような文字列はこの関数で正当と判定されるからです。返り値がゼロより大きい整数の場合は、<tt>..</tt>, <tt>./</tt>, あるいは <tt>:</tt> がパスに含まれているか、または <code>$allowed_files</code> ホワイトリストに含まれていません。この結果を真偽判定するときは次の点に注意してください。<tt>false</tt> (0) はファイル名が検証を通過したことを示し、<tt>true</tt> (> 0) は通過しなかったことを示します。
  
<div id="HTTP Headers">
+
<div id="HTTP_Headers">
=== HTTP ヘッダ ===
+
=== HTTP ヘッダー ===
 
</div>
 
</div>
  
ヘッダ分割攻撃は、HTTP クライアントに依存するため、やっかいなものです。
+
ヘッダー分割攻撃は HTTP クライアントに依存するため、やっかいなものです。WordPress は HTTP ヘッダーにユーザーが生成したコンテンツを含める必要はほとんどありません。しかしそうするなら、WordPress は HTTP ヘッダーの多くに[[#ホワイトリスト|ホワイトリスト]]を用います。
WordPress は、HTTP ヘッダにユーザーが生成した内容を含む必要はほとんどありませんが、それを行うならば、WordPress は HTTP ヘッダの多くに[[#ホワイトリスト|ホワイトリスト]]を用います。
+
  
WordPress は、HTTP のロケーションヘッダにユーザーが生成した内容を使えますが、以下のように無害化できます。
+
WordPress は、HTTP の Location ヘッダーにユーザーが生成したコンテンツを使えますが、以下のように無害化できます。
  
 
; <code>[[関数リファレンス/wp_redirect|wp_redirect]]($location, $status = 302)</code>
 
; <code>[[関数リファレンス/wp_redirect|wp_redirect]]($location, $status = 302)</code>
: あらゆる URL に対する安全なリダイレクト方法です。結果の HTTP ロケーションヘッダが妥当であることを保証します。
+
: あらゆる URL に対する安全なリダイレクト方法です。結果の HTTP Location ヘッダーが妥当であることを保証します。
 
; <code>[[関数リファレンス/wp_safe_redirect|wp_safe_redirect]]($location, $status = 302)</code>
 
; <code>[[関数リファレンス/wp_safe_redirect|wp_safe_redirect]]($location, $status = 302)</code>
: さらに安全です。ホワイトリストにあるドメインしかリダイレクトしません。
+
: さらに安全です。ホワイトリストにあるドメインのみへリダイレクトします。
  
<div id="Input Validation">
+
 
 +
<div id="Input_Validation">
 
== 入力の検証 ==
 
== 入力の検証 ==
 
</div>
 
</div>
  
[[#出力の無害化|出力の無害化]]に挙げられた多くの関数は、入力の検証にも使えます。
+
[[#Output_Sanitization|出力の無害化]]に挙げられた多くの関数は入力の検証にも使えます。さらに WordPress は以下の関数を使っています。
さらに、WordPress は以下の関数を使っています。
+
  
 
<div id="Slugs">
 
<div id="Slugs">
141行目: 140行目:
 
</div>
 
</div>
  
; <code>[[関数リファレンス/sanitize_title|sanitize_title]]( $title )</code>
+
; <code>[[関数リファレンス/sanitize_title|sanitize_title]]( $title )</code> /[[:en:Function Reference/sanitize_title|en]]
 
: 投稿スラッグなどに使われています。
 
: 投稿スラッグなどに使われています。
; <code>[[関数リファレンス/sanitize_user|sanitize_user]]( $username, $strict = false )</code>
+
; <code>[[関数リファレンス/sanitize_user|sanitize_user]]( $username, $strict = false )</code> /[[:en:Function Reference/sanitize_user|en]]
: 新規ユーザーを作成するときは <code>$strict</code> を使ってください (API でユーザー追加するとき)。
+
: 新規ユーザーを作成するときは <code>$strict</code> を使ってください (特に API でユーザーを追加するとき)。
  
 
<div id="HTML">
 
<div id="HTML">
 
=== HTML ===
 
=== HTML ===
 
</div>
 
</div>
; <code>[[関数リファレンス/balanceTags|balanceTags]]( $html )</code> or <code>[[関数リファレンス/force_balance_tags|force_balance_tags]]( $html )</code>
+
; <code>[[関数リファレンス/balanceTags|balanceTags]]( $html )</code> /[[:en:Function Reference/balanceTags|en]] または <code>[[関数リファレンス/force_balance_tags|force_balance_tags]]( $html )</code> /[[:en:Function Reference/force_balance_tags|en]]
 
: 正当な XML 出力になるよう、HTML タグの開き/閉じの釣り合いを取ります。
 
: 正当な XML 出力になるよう、HTML タグの開き/閉じの釣り合いを取ります。
; <code>[[関数リファレンス/tag_escape|tag_escape]]( $html_tag_name )</code>
+
; <code>[[関数リファレンス/tag_escape|tag_escape]]( $html_tag_name )</code> /[[:en:Function Reference/tag_escape|en]]
: HTML タグ名を無害化します (関数名と違って、エスケープは何もしません)。
+
: HTML タグ名を無害化します (関数名の印象とは違って、何もエスケープしません)。
; <code>[[関数リファレンス/sanitize_html_class|sanitize_html_class]]( $class, $fallback )</code>
+
; <code>[[関数リファレンス/sanitize_html_class|sanitize_html_class]]( $class, $fallback )</code> /[[:en:Function Reference/sanitize_html_class|en]]
: HTML クラス名を無害化し、妥当な文字列のみを含むことを保証します。A-Z,a-z,0-9,'-' に限定します。結果が空文字列になる場合は、第二引数で与えられた代替文字列を返します。
+
: HTML クラス名を無害化し、妥当な文字列のみを含むことを保証します。<tt>A-Z,a-z,0-9,'-'</tt> に限定します。結果が空文字列になる場合は、第 2 引数で与えられた代替文字列を返します。
  
 
<div id="Email">
 
<div id="Email">
 
=== Email ===
 
=== Email ===
 
</div>
 
</div>
; <code>[[関数リファレンス/is_email|is_email]]( $email_address )</code>
+
; <code>[[関数リファレンス/is_email|is_email]]( $email_address )</code> /[[:en:Function Reference/is_email|en]]
 
: 妥当でない場合は false を返し、妥当な場合は $email_address を返します。
 
: 妥当でない場合は false を返し、妥当な場合は $email_address を返します。
  
166行目: 165行目:
 
</div>
 
</div>
 
; <code>array_map( 'absint', $array )</code>
 
; <code>array_map( 'absint', $array )</code>
: 配列要素がすべて非負であることを保証します。あなたのデータに合うようにコールバック関数 <tt>'absint'</tt> を入れ替えてください。<tt>array_map()</tt> は PHP コアの関数で、配列の要素に任意のコールバック関数を実行します。この例ではコールバック関数は <tt>absint()</tt> です。
+
: 配列要素がすべて非負であることを保証します。あなたのデータに合うようにコールバック関数 <tt>'absint'</tt> を入れ替えてください。<tt>array_map()</tt> は [http://php.net/manual/ja/function.array-map.php PHP コアの関数] で、配列の要素に任意のコールバック関数を実行します。この例ではコールバック関数は <tt>absint()</tt> です。
  
 
<div id="Other">
 
<div id="Other">
180行目: 179行目:
 
* [[関数リファレンス/sanitize_option|sanitize_option()]] /[[:en:Function_Reference/sanitize_option|en]]
 
* [[関数リファレンス/sanitize_option|sanitize_option()]] /[[:en:Function_Reference/sanitize_option|en]]
 
* [[関数リファレンス/sanitize_sql_orderby|sanitize_sql_orderby()]] /[[:en:Function_Reference/sanitize_sql_orderby|en]]
 
* [[関数リファレンス/sanitize_sql_orderby|sanitize_sql_orderby()]] /[[:en:Function_Reference/sanitize_sql_orderby|en]]
* [[関数リファレンス/sanitize_text_field|sanitize_text_field()]] /[[:en:Function_Reference/sanitize_text_field|en]]
+
* [[関数リファレンス/sanitize_text_field|sanitize_text_field()]]
 
* [[関数リファレンス/sanitize_title_for_query|sanitize_title_for_query()]] /[[:en:Function_Reference/sanitize_title_for_query|en]]
 
* [[関数リファレンス/sanitize_title_for_query|sanitize_title_for_query()]] /[[:en:Function_Reference/sanitize_title_for_query|en]]
 
* [[関数リファレンス/sanitize_title_with_dashes|sanitize_title_with_dashes()]] /[[:en:Function_Reference/sanitize_title_with_dashes|en]]
 
* [[関数リファレンス/sanitize_title_with_dashes|sanitize_title_with_dashes()]] /[[:en:Function_Reference/sanitize_title_with_dashes|en]]
 
* [[関数リファレンス/sanitize_user|sanitize_user()]] /[[:en:Function_Reference/sanitize_user|en]]
 
* [[関数リファレンス/sanitize_user|sanitize_user()]] /[[:en:Function_Reference/sanitize_user|en]]
 
* [[関数リファレンス/sanitize_meta|sanitize_meta()]] /[[:en:Function_Reference/sanitize_meta|en]]
 
* [[関数リファレンス/sanitize_meta|sanitize_meta()]] /[[:en:Function_Reference/sanitize_meta|en]]
* [[関数リファレンス/sanitize_term|sanitize_term()]] /[[:en:Function_Reference/sanitize_term|en]]
+
* [[関数リファレンス/sanitize_term|sanitize_term()]]
* [[関数リファレンス/sanitize_term_field|sanitize_term_field()]] /[[:en:Function_Reference/sanitize_term_field|en]]
+
* [[関数リファレンス/sanitize_term_field|sanitize_term_field()]]
  
<div id="Validation Philosophies">
 
  
 +
<div id="Validation_Philosophies">
 
== 検証の哲学 ==
 
== 検証の哲学 ==
 
</div>
 
</div>
197行目: 196行目:
 
=== ホワイトリスト ===
 
=== ホワイトリスト ===
 
</div>
 
</div>
既知および信頼された値の一覧にあるデータのみ受理します。
 
ホワイトリストに対して信頼されていないデータを比較すると、それは厳密な型チェックが使用されていることを確認することが重要です。
 
それ以外の場合は攻撃者がホワイトリストを渡すが、まだ悪質な効果を持つような方法で入力を作成する可能性があります。
 
  
 +
既知および信頼された値の有限な一覧にあるデータのみ受理します。
 +
 +
ホワイトリストに対して信頼されていないデータを比較するとき、厳密な型チェックが行われていることを確認することが重要です。そうでなければ攻撃者が入力を工夫して、ホワイトリストを通過するけれどもまだ悪質な効果を持たせることができるかもしれません。
 +
 +
<div id="Comparison_Operator">
 
==== 比較演算子 ====
 
==== 比較演算子 ====
 +
</div>
  
 
<code><pre>
 
<code><pre>
$untrusted_input = '1 malicious string';  // will evaluate to integer 1 during loose comparisons
+
$untrusted_input = '1 malicious string';  // ゆるく比較すると値が 1 になる
  
if ( 1 === $untrusted_input ) {  // == would have evaluated to true, but === evaluates to false
+
if ( 1 === $untrusted_input ) {  // == を使うと true になるが、=== なら false
 
echo '<p>有効なデータ';
 
echo '<p>有効なデータ';
 
} else {
 
} else {
213行目: 215行目:
 
</pre></code>
 
</pre></code>
  
 +
<div id="in_array.28.29">
 
==== in_array() ====
 
==== in_array() ====
 +
</div>
  
 
<code><pre>
 
<code><pre>
$untrusted_input = '1 malicious string';  // will evaluate to integer 1 during loose comparisons
+
$untrusted_input = '1 malicious string';  // ゆるく比較すると値が 1 になる
 
$safe_values    = array( 1, 5, 7 );
 
$safe_values    = array( 1, 5, 7 );
  
if ( in_array( $untrusted_input, $safe_values, true ) ) {  // `true` enables strict type checking
+
if ( in_array( $untrusted_input, $safe_values, true ) ) {  // `true` は厳密な型チェックを有効にする
 
echo '<p>有効なデータ';
 
echo '<p>有効なデータ';
 
} else {
 
} else {
226行目: 230行目:
 
</pre></code>
 
</pre></code>
  
 +
<div id="switch.28.29">
 
==== switch() ====
 
==== switch() ====
 +
</div>
  
 
<code><pre>
 
<code><pre>
$untrusted_input = '1 malicious string';  // will evaluate to integer 1 during loose comparisons
+
$untrusted_input = '1 malicious string';  // ゆるく比較すると値が 1 になる
  
 
switch ( true ) {
 
switch ( true ) {
case 1 === $untrusted_input:  // do your own strict comparison instead of relying on switch()'s loose comparison
+
case 1 === $untrusted_input:  // switch() のゆるい比較に頼るのでなく自分で厳密に比較する
 
echo '<p>有効なデータ';
 
echo '<p>有効なデータ';
 
break;
 
break;
246行目: 252行目:
 
</div>
 
</div>
  
既知の信頼できない値の一覧にあるデータを拒否します。これがよい方法であることは、めったにありません。
+
既知の信頼できない値の有限な一覧にあるデータを拒否します。これがよい方法であることは、めったにありません。
  
<div id="Format Detection">
+
<div id="Format_Detection">
 
=== 書式の検出 ===
 
=== 書式の検出 ===
 
</div>
 
</div>
263行目: 269行目:
 
</pre>
 
</pre>
  
<div id="Format Correction">
+
<div id="Format_Correction">
 
=== 書式の訂正 ===
 
=== 書式の訂正 ===
 
</div>
 
</div>
 +
 
ほとんどのデータを受理し、危険な部分を除去または変更します。
 
ほとんどのデータを受理し、危険な部分を除去または変更します。
 
  $trusted_integer = (int) $untrusted_integer;
 
  $trusted_integer = (int) $untrusted_integer;
 
  $trusted_alpha = preg_replace( '/[^a-z]/i', "", $untrusted_alpha );
 
  $trusted_alpha = preg_replace( '/[^a-z]/i', "", $untrusted_alpha );
 
  $trusted_slug = sanitize_title( $untrusted_slug );
 
  $trusted_slug = sanitize_title( $untrusted_slug );
 +
  
 
<div id="Changelog">
 
<div id="Changelog">
 
== 変更履歴 ==
 
== 変更履歴 ==
 
</div>
 
</div>
 +
 
* [[Version 3.6|3.6]]: <code>$wpdb->escape()</code> の代わりに <code>esc_sql()</code> と <code>$wpdb->preapre()</code> が推奨となりました。
 
* [[Version 3.6|3.6]]: <code>$wpdb->escape()</code> の代わりに <code>esc_sql()</code> と <code>$wpdb->preapre()</code> が推奨となりました。
 
* [[Version 3.1|3.1]]: <code>[[Function_Reference/esc_textarea|esc_textarea]]</code> が導入されました。 ([http://core.trac.wordpress.org/ticket/15454 #15454])
 
* [[Version 3.1|3.1]]: <code>[[Function_Reference/esc_textarea|esc_textarea]]</code> が導入されました。 ([http://core.trac.wordpress.org/ticket/15454 #15454])
 
* [[Version 3.0|3.0]]: <code>[[#URLs|clean_url()]]</code> の代わりに <code>esc_url()</code> と <code>esc_url_raw()</code> が推奨となりました。 ([http://core.trac.wordpress.org/ticket/12309 #12309])
 
* [[Version 3.0|3.0]]: <code>[[#URLs|clean_url()]]</code> の代わりに <code>esc_url()</code> と <code>esc_url_raw()</code> が推奨となりました。 ([http://core.trac.wordpress.org/ticket/12309 #12309])
* [[Version 2.8|2.8]]: 以下の関数が非推奨となりました。(via [http://wpdevel.wordpress.com/tag/escaping/ WordPress Development Updates])
+
* [[Version 2.8|2.8]]: 以下の関数が非推奨となりました。([http://wpdevel.wordpress.com/tag/escaping/ WordPress Development Updates] を参照)
 
** <code>sanitize_url()</code> -> <code>esc_url_raw()</code>
 
** <code>sanitize_url()</code> -> <code>esc_url_raw()</code>
** <code>wp_specialchars()</code> -> <code>esc_html()</code> (also: <code>esc_html__()</code> and <code>esc_html_e()</code>)
+
** <code>wp_specialchars()</code> -> <code>esc_html()</code> (他に <code>esc_html__()</code> および <code>esc_html_e()</code>)
** <code>attribute_escape()</code> -> <code>esc_attr()</code> (also: <code>esc_attr__()</code> and <code>esc_attr_e()</code>)
+
** <code>attribute_escape()</code> -> <code>esc_attr()</code> (他に <code>esc_attr__()</code> および <code>esc_attr_e()</code>)
  
<div id="External Resources">
+
<div id="External_Resources">
 
== 外部資料 ==
 
== 外部資料 ==
 
</div>
 
</div>
 +
 
* [http://wp.tutsplus.com/tutorials/creative-coding/data-sanitization-and-validation-with-wordpress/ Data Sanitization and Validation With WordPress] by Stephen Harris
 
* [http://wp.tutsplus.com/tutorials/creative-coding/data-sanitization-and-validation-with-wordpress/ Data Sanitization and Validation With WordPress] by Stephen Harris
 
* [http://wordpress.tv/2011/01/29/mark-jaquith-theme-plugin-security/ Theme and Plugin Security] by Mark Jaquith
 
* [http://wordpress.tv/2011/01/29/mark-jaquith-theme-plugin-security/ Theme and Plugin Security] by Mark Jaquith
 
* [http://groups.google.com/group/wp-hackers/browse_thread/thread/8f1466febb168935?pli=1 wp_specialchars() vs attribute_escape() ( now esc_attr() ) and quote entity-encoding].
 
* [http://groups.google.com/group/wp-hackers/browse_thread/thread/8f1466febb168935?pli=1 wp_specialchars() vs attribute_escape() ( now esc_attr() ) and quote entity-encoding].
  
{{NeedTrans|一部}}
+
{{原文|Data Validation|152690}} <!-- 02:48, 22 July 2015 Taupecat 版 -->
 
+
{{原文|Data Validation|152690}}<!-- 02:48, 22 July 2015‎ Taupecat 版 -->
+
 
+
  
 
[[Category:セキュリティ]]
 
[[Category:セキュリティ]]
300行目: 307行目:
 
[[Category:wp3.1]]
 
[[Category:wp3.1]]
 
[[Category:wp3.6]]
 
[[Category:wp3.6]]
 +
 +
[[en:Data Validation]]
 +
[[ru:Валидация данных]]

2015年9月13日 (日) 18:05時点における版

信頼できないデータが、さまざまな情報源から入ってきます (ユーザー、第三者のサイト、あなた自身のデータベースも!…)。そして、これらすべては、入力時と出力時の両方で検証する必要があります。

データの無害化 (サニタイズ) をする方法は、データの種類およびそれが使われる文脈 (コンテキスト) に依存します。WordPress における共通の処理と、どのように無害化すべきかを以下に示します。

ヒント : 出力の検証は、可能な限り遅く行うことがよいでしょう。スクリプトでは、出力をする、まさにその時に検証するのが理想です。こうすることで、常にデータが適切に検証/エスケープされていることが確認でき、変数が既に検証されているか覚えておく必要はありません。

整数値

intval( $int ) または (int) $int
整数値を想定するならば、キャストします。
absint( $int )
結果が負でないことを保証します。

HTML/XML

(HTML 書類とは異なり) 多くの形式の XML 書類が理解する文字実体参照は &apos;&amp;&gt;&lt;&quot; の 5 つのみであることに注意してください。テキストを XML 書類として出力するときは、不正な文字実体参照を含むあらゆるテキストを、WordPress の ent2ncr( $text ) /en 関数を通してフィルターしてください。

HTML/XML の断片

wp_kses( (string) $fragment, (array) $allowed_html, (array) $protocols = null )
KSES は悪意あるスクリプトを除去します。すべての信頼できない HTML (投稿文、コメント文など) は wp_kses() を通すべきです。使い方やデフォルト値などは wp-includes/kses.php を参照してください。
許可する HTML タグの配列を wp_kses() へ渡す代わりに wp_kses_post( (string) $fragment ) を用いれば、投稿や固定ページで許可されるタグのみを残せます。また wp_kses_data( (string) $fragment ) を用いれば、コメントで許可される少数のタグのみを残せます。
KSES システムはリソースをたくさん消費する場合があるので、出力を無害化するフィルターとして直接実行するのは避けるべきであることに注意してください。そうではなくデータが入力され処理された後、データベースへ保存する前にフィルターとすべきです。例えば WordPress は KSES を pre_comment_content フィルターとして実行し、コメントを保存する前に HTML を除去します。
wp_rel_nofollow( (string) $html ) /en
あらゆる <a> リンクに "rel='nofollow'" 属性をつけます。
wp_kses_allowed_html( (string) $context )
所定のコンテキストで許可される HTML タグの配列を提供します。指定できるのは post, strip, data, entities または pre_user_description のようなフィールド用フィルターの名前です。

テキスト節

esc_html( $text )/en (Version 2.8 以降)
< (小ナリ)」、「> (大ナリ)」、「& (アンド)」、「" (ダブルクォーテーション)」、「' (シングルクォーテーション)」 をエンコードします。esc_attr と同様ですが、こちらは出力に esc_html フィルターを適用します。
esc_html__ /en (Version 2.8 以降)
翻訳、エンコードをします。
esc_html_e /en (Version 2.8 以降)
翻訳、エンコード、出力をします。
esc_textarea /en (Version 3.1 以降)
textarea 要素の中で使用するためにテキストをエンコードします。
sanitize_text_field (Version 2.9.0 以降)
ユーザーからの入力またはデータベースからの入力を無害化します。

属性値

esc_attr( $text ) (Version 2.8 以降)
< (小ナリ)」、「> (大ナリ)」、「& (アンド)」、「" (ダブルクォーテーション)」、「' (シングルクォーテーション)」 をエンコードします。esc_html と同様ですが、こちらは出力に attribute_escape フィルターを適用します。
esc_attr__()
翻訳、エンコードをします。
esc_attr_e()
翻訳、エンコード、出力をします。

JavaScript

esc_js( $text ) /en (Version 2.8 以降)


URL

esc_url( $url, (array) $protocols = null ) (Version 2.8 以降)
URL を無害化するときは、常に esc_url を使ってください (テキスト中、属性値、その他あらゆる場所で)。ホワイトリストで提供されたプロトコル(デフォルトは http ならびに httpsftpftpsmailtonewsircgophernntpfeedtelnet)を持たない URL は拒否し、不正な文字を排除し、危険な文字を除去します。3.0 で非推奨とされた clean_url() の代わりに使います。
この関数は文字を HTML 実体にエンコードします。(X)HTML あるいは XML 書類を生成するときはこの関数を使ってください。アンド (&) とシングルクォート (') は数値実体参照 (&#038, &#039) にエンコードします。
esc_url_raw( $url, (array) $protocols = null ) /en (Version 2.8 以降)
URL をデータベースに格納するときに使う関数です。この関数は文字を HTML 実体にエンコードしません。URL を保存するときやエンコードしない形で保存したいときはこの関数を使ってください。この機能は古い関数 clean_url 関数の $contextdb に設定したときと同等です。
urlencode( $scalar ) /en
URL をエンコードします。(例えばクエリパラメータで使用するなど)
urlencode_deep( $array ) /en
配列のすべての要素を URL エンコードします。

データベース

$wpdb->insert( $table, (array) $data )
$data は未エスケープとしてください (この関数がエスケープしてくれます)。配列キーがカラム、配列値がデータベース値になります。
$wpdb->update( $table, (array) $data, (array) $where )
$data は未エスケープとしてください。配列キーがカラム、配列値がデータベース値になります。$where は未エスケープとしてください。複数の WHERE 節は AND で連結されます。
$wpdb->update(
  'my_table',
  array( 'status' => $untrusted_status, 'title' => $untrusted_title ),
  array( 'id' => 123 )
);
$wpdb->prepare( $format, (scalar) $value1, (scalar) $value2, ... )
$formatsprintf() 形式に似た文字列です。%s%d%f のみ理解します。どれもクォート文字で囲む必要はありません。
$wpdb->get_var( $wpdb->prepare(
  "SELECT something FROM table WHERE foo = %s and status = %d",
  $name, // 未エスケープの文字列 (関数が無害化します)
  $status // 信頼できない整数値 (関数が無害化します)
) );
esc_sql( $sql )
文字列またはその配列を SQL クエリで使えるようにエスケープします。配列に対して動作する、見せかけの addslashes() です。一般的に $wpdb->prepare()<code> の方が好まれます。これは共通のフォーマットエラーを直してくれるからです。
<code>$wpdb->escape( $text )</code>
3.6から非推奨になりました。代わりに esc_sql() または $wpdb->prepare() を使ってください。
<code>$wpdb->escape_by_ref( &$text )
返り値はありません。パラメータが参照で渡されるので、テキストが直接変更され、返り値を割り当てる必要がありません。
$wpdb->esc_like( $text ) /en
$text を SQL クエリの LIKE 式で使えるように無害化します。別途 SQL エスケープが必要です(上記のいずれかの関数を使って)。
like_escape( $string )
4.0 から非推奨になりました。$wpdb->esc_like() を代わりに使ってください。

ファイルシステム

validate_file( (string) $filename, (array) $allowed_files = "" ) /en
ディレクトリートラバーサル攻撃を防止するため、あるいはファイル名がホワイトリストにあるか確認するために使用します。$filename が正当な相対パスなら 0 を返します。検証後、$filename を相対パスとして扱わなければなりません (MUST) (例えば、ABSPATH の後に繋げる等)。なぜなら、/etc/hosts のような文字列はこの関数で正当と判定されるからです。返り値がゼロより大きい整数の場合は、.., ./, あるいは : がパスに含まれているか、または $allowed_files ホワイトリストに含まれていません。この結果を真偽判定するときは次の点に注意してください。false (0) はファイル名が検証を通過したことを示し、true (> 0) は通過しなかったことを示します。

HTTP ヘッダー

ヘッダー分割攻撃は HTTP クライアントに依存するため、やっかいなものです。WordPress は HTTP ヘッダーにユーザーが生成したコンテンツを含める必要はほとんどありません。しかしそうするなら、WordPress は HTTP ヘッダーの多くにホワイトリストを用います。

WordPress は、HTTP の Location ヘッダーにユーザーが生成したコンテンツを使えますが、以下のように無害化できます。

wp_redirect($location, $status = 302)
あらゆる URL に対する安全なリダイレクト方法です。結果の HTTP Location ヘッダーが妥当であることを保証します。
wp_safe_redirect($location, $status = 302)
さらに安全です。ホワイトリストにあるドメインのみへリダイレクトします。

 

入力の検証

出力の無害化に挙げられた多くの関数は入力の検証にも使えます。さらに WordPress は以下の関数を使っています。

スラッグ

sanitize_title( $title ) /en
投稿スラッグなどに使われています。
sanitize_user( $username, $strict = false ) /en
新規ユーザーを作成するときは $strict を使ってください (特に API でユーザーを追加するとき)。

HTML

balanceTags( $html ) /en または force_balance_tags( $html ) /en
正当な XML 出力になるよう、HTML タグの開き/閉じの釣り合いを取ります。
tag_escape( $html_tag_name ) /en
HTML タグ名を無害化します (関数名の印象とは違って、何もエスケープしません)。
sanitize_html_class( $class, $fallback ) /en
HTML クラス名を無害化し、妥当な文字列のみを含むことを保証します。A-Z,a-z,0-9,'-' に限定します。結果が空文字列になる場合は、第 2 引数で与えられた代替文字列を返します。

Email

is_email( $email_address ) /en
妥当でない場合は false を返し、妥当な場合は $email_address を返します。

配列

array_map( 'absint', $array )
配列要素がすべて非負であることを保証します。あなたのデータに合うようにコールバック関数 'absint' を入れ替えてください。array_map()PHP コアの関数 で、配列の要素に任意のコールバック関数を実行します。この例ではコールバック関数は absint() です。

その他

その他の、データの無害化に役立つ関数です。


検証の哲学

検証をどのように行うか、いくつか異なった哲学があります。どれが正しいかは筋書によって異なります。

ホワイトリスト

既知および信頼された値の有限な一覧にあるデータのみ受理します。

ホワイトリストに対して信頼されていないデータを比較するとき、厳密な型チェックが行われていることを確認することが重要です。そうでなければ攻撃者が入力を工夫して、ホワイトリストを通過するけれどもまだ悪質な効果を持たせることができるかもしれません。

比較演算子

$untrusted_input = '1 malicious string';  // ゆるく比較すると値が 1 になる

if ( 1 === $untrusted_input ) {  // == を使うと true になるが、=== なら false
	echo '<p>有効なデータ';
} else {
	wp_die( '不正なデータ' );
}

in_array()

$untrusted_input = '1 malicious string';  // ゆるく比較すると値が 1 になる
$safe_values     = array( 1, 5, 7 );

if ( in_array( $untrusted_input, $safe_values, true ) ) {  // `true` は厳密な型チェックを有効にする
	echo '<p>有効なデータ';
} else {
	wp_die( '不正なデータ' );
}

switch()

$untrusted_input = '1 malicious string';  // ゆるく比較すると値が 1 になる

switch ( true ) {
	case 1 === $untrusted_input:  // switch() のゆるい比較に頼るのでなく自分で厳密に比較する
		echo '<p>有効なデータ';
		break;

	default:
		wp_die( '不正なデータ' );
}


ブラックリスト

既知の信頼できない値の有限な一覧にあるデータを拒否します。これがよい方法であることは、めったにありません。

書式の検出

データが正しい書式であるかテストします。正しい場合のみ受理します。

 if ( ! ctype_alnum( $data ) ) {
   wp_die( "無効な形式です。あなたのデータは※△□%&〒☆" );
 }
 
 if ( preg_match( "/[^0-9.-]/", $data ) ) {
   wp_die( "無効な形式です。浮動小数じゃない? おバカ!" );
 }

書式の訂正

ほとんどのデータを受理し、危険な部分を除去または変更します。

$trusted_integer = (int) $untrusted_integer;
$trusted_alpha = preg_replace( '/[^a-z]/i', "", $untrusted_alpha );
$trusted_slug = sanitize_title( $untrusted_slug );


変更履歴

  • 3.6: $wpdb->escape() の代わりに esc_sql()$wpdb->preapre() が推奨となりました。
  • 3.1: esc_textarea が導入されました。 (#15454)
  • 3.0: clean_url() の代わりに esc_url()esc_url_raw() が推奨となりました。 (#12309)
  • 2.8: 以下の関数が非推奨となりました。(WordPress Development Updates を参照)
    • sanitize_url() -> esc_url_raw()
    • wp_specialchars() -> esc_html() (他に esc_html__() および esc_html_e())
    • attribute_escape() -> esc_attr() (他に esc_attr__() および esc_attr_e())

外部資料

最新英語版: WordPress Codex » Data Validation最新版との差分