• 赤色のリンクは、まだ日本語Codexに存在しないページ・画像です。英語版と併せてご覧ください。(詳細

このWikiはいつでも誰でも編集できます

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

提供: WordPress Codex 日本語版
移動先: 案内検索
(2.8: 非推奨となった関数、新規関数 (変更履歴参照)、未翻訳(冒頭の NeedTrans の注釈も参照))
({{原文|Data Validation|129255}}<!-- 15:06, 24 March 2013 N4nn331355 版 --> 日本語版に説明の無い関数あり)
4行目: 4行目:
 
== 出力の無害化 ==
 
== 出力の無害化 ==
 
データの無害化 (サニタイズ) する方法は、データの種類およびそれが使われる文脈 (コンテキスト) に依存します。WordPress における共通の処理と、どのように無害化すべきかを以下に示します。
 
データの無害化 (サニタイズ) する方法は、データの種類およびそれが使われる文脈 (コンテキスト) に依存します。WordPress における共通の処理と、どのように無害化すべきかを以下に示します。
 +
 +
ヒント : 出力の検証は、可能な限り遅く行います。出力から離れた場所で検証するのではなく、出力する時に検証するのが理想です。こうすることで、データが適切に検証/エスケープされていることが確信でき、変数が既に検証されているか覚えておく必要はありません。
  
 
=== 整数値 ===
 
=== 整数値 ===
; <code>intval( $int )</code> または <code>(int) $int</code>
+
; <tt>intval( $int )</tt> または <tt>(int) $int</tt>
: 整数値を想定するならば、キャストします。
+
: 整数値を想定するならば、キャストします。
; <code>absint( $int )</code>  
+
; <tt>absint( $int )</tt>  
: 結果が非負であると保証されます
+
: 結果が非負であると保証されます。
  
 
=== HTML/XML ===
 
=== HTML/XML ===
15行目: 17行目:
 
Note that many types of XML documents (as opposed to HTML documents) understand only a few named character references: <code>apos, amp, gt, lt, quot</code>.  When outputting text to such an XML document, be sure to filter any text containing illegal named entities through WordPress's <code>ent2ncr( $text )</code> function.
 
Note that many types of XML documents (as opposed to HTML documents) understand only a few named character references: <code>apos, amp, gt, lt, quot</code>.  When outputting text to such an XML document, be sure to filter any text containing illegal named entities through WordPress's <code>ent2ncr( $text )</code> function.
 
-->
 
-->
(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( $text )</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> 関数を通してフィルターしてください。
 +
 
  
 
==== HTML/XML の断片 ====
 
==== HTML/XML の断片 ====
 
; <code>[[関数リファレンス/wp_kses|wp_kses]]( (string) $fragment, (array) $allowed_html, (array) $protocols = null )</code>
 
; <code>[[関数リファレンス/wp_kses|wp_kses]]( (string) $fragment, (array) $allowed_html, (array) $protocols = null )</code>
: KSES は悪意あるスクリプトを除去します。すべての信頼できない HTML (投稿文、コメント文など) は <code>wp_kses()</code> を通すべきです。使い方やデフォルト値などは <code>wp-includes/kses.php</code> を見てください。
+
: KSES は悪意あるスクリプトを除去します。すべての信頼できない HTML (投稿文、コメント文など) は <code>wp_kses()</code> を通すべきです。使い方やデフォルト値などは <code>wp-includes/kses.php</code> を見てください。
; <code>wp_rel_nofollow( (string) $html )</code>
+
:
: あらゆる <nowiki><a></nowiki> リンクに "rel='nofollow'" 属性をつけます。
+
: 許可する 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> を使用できます。
 
+
; <code>[[関数リファレンス/wp_rel_nofollow|wp_rel_nofollow]]( (string) $html )</code>
==== テキスト節 ====
+
: あらゆる <nowiki><a></nowiki> リンクに "rel='nofollow'" 属性をつけます。
 +
:
 +
; <code>[[関数リファレンス/wp_kses_allowed_html|wp_kses_allowed_html]]( (string) $context )</code>
 
<!--
 
<!--
; <code>esc_html( $text )</code> (since 2.8)
+
: Provides an array of allowed HTML tags for a given context. Allowed values are post | strip | data | entities or the name of a field filter such :       as pre_user_description.
: Encodes <tt>< > & " '</tt> (less than, greater than, ampersand, double quote, single quote). Very similar to <code>esc_attr</code>.
+
; <code>esc_html__</code> (since 2.8)
+
: Translates and encodes
+
; <code>esc_html_e</code> (since 2.8)
+
: Translates, encodes, and echos
+
; <code>wp_specialchars( $string, $quote_style = ENT_NOQUOTES, $charset = false, $double_encode = false )</code> (deprecated since 2.8)
+
: Encodes <tt>< > &</tt> (less than, greater than, ampersand).  Will never double encode entities. Since 2.8, if called with exactly 1 argument, it will encode quote characters as well (via <code>esc_html</code>), as extra protection for older plugins.
+
; <code>htmlspecialchars( $text, ENT_NOQUOTES )</code>
+
: Encodes <tt>< > &</tt>.  Will double encode html entities if run twice.
+
 
-->
 
-->
; <code>esc_html( $text )</code> (since 2.8)
+
: 所定のコンテキストで許可される HTML タグの配列を提供します。post | strip | data | entities あるいはpre_user_description のようなフィールドフィルター
: Encodes <tt>< > & " '</tt> (less than, greater than, ampersand, double quote, single quote). Very similar to <code>esc_attr</code>.
+
 
; <code>esc_html__</code> (since 2.8)
+
==== テキスト節 ====
: Translates and encodes
+
; <code>[[関数リファレンス/esc_html|esc_html]]( $text )</code> (since 2.8)
; <code>esc_html_e</code> (since 2.8)
+
: <tt>< > & " '</tt> (小ナリ、大ナリ、アンド、ダブルクォート、シングルクォート)をエンコードします。<code>esc_attr</code> に良く似ています。
: Translates, encodes, and echos
+
; <code>[[関数リファレンス/esc_html_2|esc_html__]]</code> (since 2.8)
; <code>wp_specialchars( $string, $quote_style = ENT_NOQUOTES, $charset = false, $double_encode = false )</code> (deprecated since 2.8)
+
: 翻訳、エンコードします。
: <tt><、>、&</tt> をエンコードします (less than, greater than, ampersand)。これらを二重にエンコードすることはありません。(訳注: 数値実体参照を使うため、古い携帯電話ではエンコード結果が認識されないことがあります) Since 2.8, if called with exactly 1 argument, it will encode quote characters as well (via <code>esc_html</code>), as extra protection for older plugins.
+
; <code>[[関数リファレンス/esc_html_e|esc_html_e]]</code> (since 2.8)
; <code>htmlspecialchars( $text, ENT_NOQUOTES )</code>
+
: 翻訳、エンコード、出力します。
: <tt><、>、&</tt> をエンコードします。2回実行すると、二重にエンコードされます。
+
; <code>[[関数リファレンス/esc_textarea|esc_textarea]]</code> (since 3.1)
 +
: テキストエリアの要素をエンコードします。
 +
; <code>[[関数リファレンス/sanitize_text_field|sanitize_text_field]]</code> (since 2.9.0)
 +
: ユーザーからの入力又はデータベースからの入力を無害化します。
  
 
==== 属性値 ====
 
==== 属性値 ====
<!--
+
; <code>[[関数リファレンス/esc_attr|esc_attr]]( $text )</code> (since 2.8)
; <code>esc_attr</code> (since 2.8)
+
; <code>[[関数リファレンス/esc_attr_2|esc_attr__]]()</code>
; <code>attribute_escape( $text )</code> (deprecated since 2.8)
+
: 翻訳、エンコードします。
: Encodes <tt>< > & " '</tt> (less than, greater than, ampersand, double quote, single quote).  Will never double encode entities. '''See clean_url() in [[#URLs]]'''
+
; <code>[[関数リファレンス/esc_attr_e|esc_attr_e]]()</code>
; <code>esc_attr__</code>
+
: 翻訳、エンコード、出力します。
: Translates and encodes
+
; <code>esc_attr_e</code>
+
: Translates, encodes, and echos
+
; <code>htmlspecialchars( $text, ENT_QUOTES )</code>
+
: Encodes <tt>< > & " '</tt>.  Will double encode html entities if run twice. '''See clean_url() in [[#URLs]]'''
+
-->
+
; <code>esc_attr</code> (since 2.8)
+
; <code>attribute_escape( $text )</code> (deprecated since 2.8)
+
: <tt>< > &  " '</tt> をエンコードします(less than, greater than, ampersand, double quote, single quote)。これらを二重にエンコードすることはありません。'''[[#URL|URL]] の場合は clean_url() を使ってください''' (訳注: 数値実体参照を使うため、古い携帯電話ではエンコード結果が認識されないことがあります)
+
; <code>esc_attr__</code>
+
: Translates and encodes
+
; <code>esc_attr_e</code>
+
: Translates, encodes, and echos
+
; <code>htmlspecialchars( $text, ENT_QUOTES )</code>
+
: <tt>< > & " '</tt> をエンコードします。2回実行すると、二重にエンコードされます。'''[[#URL|URL]] の場合は clean_url() を使ってください'''
+
  
 
==== JavaScript ====
 
==== JavaScript ====
<!--
+
; <code>[[関数リファレンス/esc_js|esc_js]]( $text )</code> (since 2.8)
; <code>esc_js</code> (since 2.8)
+
; <code>js_escape( $text )</code> (deprecated since 2.8)
+
: Escapes <tt>'</tt>, encodes <tt>"</tt>, and fixes line endings.
+
-->
+
; <code>esc_js</code> (since 2.8)
+
; <code>js_escape( $text )</code> (deprecated since 2.8)
+
: <tt>'</tt> をエスケープし、<tt>"</tt> をエンコードします。行末を修正します。
+
  
 
=== URL ===
 
=== URL ===
<!--
+
; <code>[[関数リファレンス/esc_url|esc_url]]( $url, (array) $protocols = null )</code> (since 2.8)
; <code>esc_url</code> (since 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> の代わりに使います。
; <code>clean_url( $url, (array) $protocols = null, $context = 'display' )</code>
+
: この関数は文字を HTML 実体にエンコードします。(X)HTML あるいは XML 書類を生成するときはこの関数を使ってください。アンド (<tt>&</tt>) とシングルクォートは (<tt>'</tt>) 数値実体参照 (<tt>&#038, &#039</tt>) にエンコードします。
: Always use <code>clean_url</code> when sanitizing URLs (in text nodes, attribute nodes or anywhere else).  Rejects URLs that do not have one of the provided whitelisted protocols (defaulting to <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>, and <tt>telnet</tt>), eliminates invalid characters, and removes dangerous characters. <code>$context</code> should be one of the following.
+
; <code>[[関数リファレンス/esc_url_raw|esc_url_raw]]( $url, (array) $protocols = null )</code> (since 2.8)
:; <code>display</code> : For output in an (X)HTML or XML document. Encodes ampersands (<tt>&</tt>) and single quotes (<tt>'</tt>) as numeric entity references (<tt>&#038, &#039</tt>).
+
: URL をデータベースに格納するための関数です。この関数は文字を HTML 実体にエンコードしません。URL をエンコードしない形で保存したいときはこの関数を使ってください。 この機能は古い関数 <code>clean_url</code> 関数の <code>$context</code> <code>db</code> に設定するのと同等です。
:; <code>url</code> : strips invalid URL characters only.
+
; <code>[[関数リファレンス/urlencode|urlencode]]( $scalar )</code>
:; <code>db</code> : use if you're about to insert into the database.
+
: URL をエンコードします。(例えば、クエリパラメータで使用する、など)
; <code>esc_url_raw</code> (since 2.8)
+
; <code>[[関数リファレンス/urlencode_deep|urlencode_deep]]( $array )</code>
: For inserting an URL in the database (just like <code>$context = "db"</code>, above)
+
: 配列の全要素を URL エンコードします。
; <code>urlencode( $scalar )</code>
+
: Encodes for use in URL (as a query parameter, for example)
+
; <code>urlencode_deep( $array )</code>
+
: urlencodes all array elements.
+
-->
+
; <code>esc_url</code> (since 2.8)
+
; <code>clean_url( $url, (array) $protocols = null, $context = 'display' )</code>
+
: URL を無害化するときは、常に <code>clean_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 は拒否し、不正な文字を排除し、危険な文字を除去します。<code>$context</code> は以下のいずれかです。
+
:; <code>display</code> : For output in an (X)HTML or XML document. Encodes ampersands (<tt>&</tt>) and single quotes (<tt>'</tt>) as numeric entity references (<tt>&#038, &#039</tt>).
+
:; <code>url</code> : strips invalid URL characters only.
+
:; <code>db</code> : データベースに挿入するとき使います。
+
; <code>esc_url_raw</code> (since 2.8)
+
: For inserting an URL in the database (just like <code>$context = "db"</code>, above)
+
; <code>urlencode( $scalar )</code>
+
: URL 用にエンコードします (例えば、クエリ文字列に使う場合)
+
; <code>urlencode_deep( $array )</code>
+
: すべての配列要素に urlencode を適用します。
+
  
 
=== データベース ===
 
=== データベース ===
; <code>$wpdb->insert( $table, (array) $data )</code>
+
; <code>[[Class Reference/wpdb#INSERT rows|$wpdb->insert]]( $table, (array) $data )</code>
: <code>$data</code> は未エスケープとしてください (この関数がエスケープしてくれます)。配列キーがカラム、配列値がデータベース値になります。
+
: <code>$data</code> は未エスケープとしてください (この関数がエスケープしてくれます)。配列キーがカラム、配列値がデータベース値になります。
; <code>$wpdb->update( $table, (array) $data, (array) $where )</code>
+
; <code>[[Class Reference/wpdb#UPDATE rows|$wpdb->update]]( $table, (array) $data, (array) $where )</code>
: <code>$data</code> は未エスケープとしてください。配列キーがカラム、配列値がデータベース値になります。<code>$where</code> は未エスケープとしてください。複数の <code>WHERE</code> 節は <code>AND</code> で連結されます。
+
: <code>$data</code> は未エスケープとしてください。配列キーがカラム、配列値がデータベース値になります。<code>$where</code> は未エスケープとしてください。複数の <code>WHERE</code> 節は <code>AND</code> で連結されます。
 
  $wpdb->update(
 
  $wpdb->update(
 
   'my_table',
 
   'my_table',
117行目: 77行目:
 
   array( 'id' => 123 )
 
   array( 'id' => 123 )
 
  );
 
  );
; <code>$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>$format</code> は [http://php.net/sprintf sprintf()] 形式に似た文字列です。<code>%s</code> と <code>%d</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",
124行目: 84行目:
 
   $status // 信頼できない整数値 (関数が無害化します)
 
   $status // 信頼できない整数値 (関数が無害化します)
 
  ) );
 
  ) );
; <code>esc_sql( $text )</code> (since 2.8)
+
; <code>[[関数リファレンス/esc_sql|esc_sql]]( $sql )</code>
 +
:      <code>$wpdb->escape()</code> のエイリアス。
 
; <code>$wpdb->escape( $text )</code>
 
; <code>$wpdb->escape( $text )</code>
: SQL クエリ用に、1つの文字列をエスケープします。<code>addslashes()</code> の見せかけです。
+
: SQL クエリ用に、1つの文字列をエスケープします。<code>addslashes()</code> の見せかけです。<code>$wpdb->prepare</code> が好ましいです。なぜなら、いくつかのフォーマットエラーを修正するからです。
 
; <code>$wpdb->escape_by_ref( &$text )</code>
 
; <code>$wpdb->escape_by_ref( &$text )</code>
: 返り値はありません。
+
: 返り値はありません。パラメータが参照で渡されるので、テキストが直接変更され、返り値を割り当てる必要がありません。
; <code>like_escape( $string )</code>
+
; <code>[[関数リファレンス/like_escape|like_escape]]( $string )</code>
: SQL クエリの LIKE 式用に <code>$string</code> を無害化します。さらに SQL エスケープする必要があります (上記のいずれかの関数を使う)。
+
: SQL クエリの LIKE 式用に <code>$string</code> を無害化します。さらに SQL エスケープする必要があります (上記のいずれかの関数を使う)。
  
 
=== ファイルシステム ===
 
=== ファイルシステム ===
; <code>validate_file( (string) $filename, (array) $allowed_files = "" )</code>
+
; <code>[[関数リファレンス/validate_file|validate_file]]( (string) $filename, (array) $allowed_files = "" )</code>
<!--
+
: ディレクトリートラバーサル攻撃を防止する、あるいはファイル名がホワイトリストにあるか確認します。<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) は検証されなかったことを示します。
: Used to prevent directory traversal attacks, or to test a filename against a whitelist. Returns <tt>0</tt> if <code>$filename</code> represents a valid relative path. After validating, you <em>must</em> treat <code>$filename</code> as a relative path (i.e. you must prepend it with an absolute path), since something like <tt>/etc/hosts</tt> will validate with this function. Returns an integer greater than zero if the given path contains <tt>..</tt>, <tt>./</tt>, or <tt>:</tt>, or is not in the <code>$allowed_files</code> whitelist. Be careful making boolean interpretations of the result, since <tt>false</tt> (0) indicates the filename has passed validation, whereas <tt>true</tt> (> 0) indicates failure.
+
-->
+
: <!-- Used to -->ディレクトリートラバーサル攻撃を防止します, or test a filename against a whitelist. <code>$filename</code> が正当な相対パスを示すならば <code>0</code> を返します。検証後、<code>$filename</code> を相対パスとして'''扱わなければなりません (MUST)''' (例えば、ABSPATH の後に繋げる等)。なぜなら、<code>/etc/hosts</code> はこの関数で正当と判定されるからです。 Returns an integer greater than zero if the given path contains <tt>..</tt>, <tt>./</tt>, or <tt>:</tt>, or is not in the <code>$allowed_files</code> whitelist. Be careful making boolean interpretations of the result, since <tt>false</tt> (0) indicates the filename has passed validation, whereas <tt>true</tt> (> 0) indicates failure.
+
  
 
=== HTTP ヘッダ ===
 
=== HTTP ヘッダ ===
145行目: 103行目:
 
WordPress は、HTTP のロケーションヘッダにユーザーが生成した内容を使えますが、以下のように無害化できます。
 
WordPress は、HTTP のロケーションヘッダにユーザーが生成した内容を使えますが、以下のように無害化できます。
  
; <code>wp_redirect($location, $status = 302)</code>
+
; <code>[[関数リファレンス/wp_redirect|wp_redirect]]($location, $status = 302)</code>
: あらゆる URL に対する安全なリダイレクト方法です。結果の HTTP ロケーションヘッダが妥当であることを保証します。
+
: あらゆる URL に対する安全なリダイレクト方法です。結果の HTTP ロケーションヘッダが妥当であることを保証します。
; <code>wp_safe_redirect($location, $status = 302)</code>
+
; <code>[[関数リファレンス/wp_safe_redirect|wp_safe_redirect]]($location, $status = 302)</code>
: さらに安全です。ホワイトリストにあるドメインしかリダイレクトしません。
+
: さらに安全です。ホワイトリストにあるドメインしかリダイレクトしません。
  
 
== 入力の検証 ==
 
== 入力の検証 ==
156行目: 114行目:
  
 
=== スラッグ ===
 
=== スラッグ ===
; <code>sanitize_title( $title )</code>
+
; <code>[[関数リファレンス/sanitize_title|sanitize_title]]( $title )</code>
 
: 投稿スラッグなどに使われています。
 
: 投稿スラッグなどに使われています。
; <code>sanitize_user( $username, $strict = false )</code>
+
; <code>[[関数リファレンス/sanitize_user|sanitize_user]]( $username, $strict = false )</code>
 
: 新規ユーザーを作成するときは <code>$strict</code> を使ってください (API でユーザー追加するとき)。
 
: 新規ユーザーを作成するときは <code>$strict</code> を使ってください (API でユーザー追加するとき)。
  
 
=== HTML ===
 
=== HTML ===
; <code>balanceTags( $html )</code> または <code>force_balance_tags( $html )</code>
+
; <code>[[関数リファレンス/balanceTags|balanceTags]]( $html )</code> or <code>[[関数リファレンス/force_balance_tags|force_balance_tags]]( $html )</code>
 
: 正当な XML 出力になるよう、HTML タグの開き/閉じの釣り合いを取ります。
 
: 正当な XML 出力になるよう、HTML タグの開き/閉じの釣り合いを取ります。
; <code>tag_escape( $html_tag_name )</code>
+
; <code>[[関数リファレンス/tag_escape|tag_escape]]( $html_tag_name )</code>
 
: HTML タグ名を無害化します (関数名と違って、エスケープは何もしません)。
 
: HTML タグ名を無害化します (関数名と違って、エスケープは何もしません)。
 +
; <code>[[関数リファレンス/sanitize_html_class|sanitize_html_class]]( $class, $fallback )</code>
 +
: HTML クラス名を無害化し、妥当な文字列のみを含むことを保証します。A-Z,a-z,0-9,'-' に限定します。結果が空文字列になる場合は、第二引数で与えられた代替文字列を返します。
  
 
=== Email ===
 
=== Email ===
; <code>is_email( $email_address )</code>
+
; <code>[[関数リファレンス/is_email|is_email]]( $email_address )</code>
: 真偽値を返します
+
: 妥当でない場合は false を返し、妥当な場合は $email_address を返します。
  
 
=== 配列 ===
 
=== 配列 ===
 
; <code>array_map( 'absint', $array )</code>
 
; <code>array_map( 'absint', $array )</code>
: 配列要素がすべて非負であることを保証します。あなたのデータに合うようにコールバック関数を入れ替えてください。
+
: 配列要素がすべて非負であることを保証します。あなたのデータに合うようにコールバック関数 <tt>'absint'</tt> を入れ替えてください。<tt>array_map()</tt> は PHP コアの関数で、配列の要素に任意のコールバック関数を実行します。この例ではコールバック関数は <tt>absint()</tt> です。
 +
 
 +
=== その他 ===
 +
その他の、データの無害化に役立つ関数です。
 +
 
 +
* [[関数リファレンス/sanitize_email|sanitize_email()]]
 +
* [[関数リファレンス/sanitize_file_name|sanitize_file_name()]]
 +
* [[関数リファレンス/sanitize_html_class|sanitize_html_class()]]
 +
* [[関数リファレンス/sanitize_key|sanitize_key()]]
 +
* [[関数リファレンス/sanitize_mime_type|sanitize_mime_type()]]
 +
* [[関数リファレンス/sanitize_option|sanitize_option()]]
 +
* [[関数リファレンス/sanitize_sql_orderby|sanitize_sql_orderby()]]
 +
* [[関数リファレンス/sanitize_text_field|sanitize_text_field()]]
 +
* [[関数リファレンス/sanitize_title_for_query|sanitize_title_for_query()]]
 +
* [[関数リファレンス/sanitize_title_with_dashes|sanitize_title_with_dashes()]]
 +
* [[関数リファレンス/sanitize_user|sanitize_user()]]
 +
* [[関数リファレンス/sanitize_meta|sanitize_meta()]]
 +
* [[関数リファレンス/sanitize_term|sanitize_term()]]
 +
* [[関数リファレンス/sanitize_term_field|sanitize_term_field()]]
  
 
== 検証の哲学 ==
 
== 検証の哲学 ==
184行目: 162行目:
 
  if ( !in_array( $untrusted, $possible_values ) )
 
  if ( !in_array( $untrusted, $possible_values ) )
 
   die( "やっちゃダメ!" );
 
   die( "やっちゃダメ!" );
+
 
  // ここで break 文と default アクションに着目
+
  // Be careful here with fancy breaks and default actions.
 
  switch ( $untrusted ) {
 
  switch ( $untrusted ) {
 
  case 'a' :
 
  case 'a' :
200行目: 178行目:
 
=== 書式で検出 ===
 
=== 書式で検出 ===
 
データが正しい書式であるかテストします。正しい場合のみ受理します。
 
データが正しい書式であるかテストします。正しい場合のみ受理します。
 
 
  if ( !ctype_alnum( $data ) )
 
  if ( !ctype_alnum( $data ) )
 
   die( "あなたのデータは※△□%&〒☆" );
 
   die( "あなたのデータは※△□%&〒☆" );
212行目: 189行目:
 
  $trusted_slug = sanitize_title( $untrusted_slug );
 
  $trusted_slug = sanitize_title( $untrusted_slug );
  
{{原文|Data Validation|82973}}<!-- 01:24, 13 February 2010 Bigsquaredot 版 -->
+
{{原文|Data Validation|129255}}<!-- 15:06, 24 March 2013 N4nn331355 版 -->
  
 
== 変更履歴 ==
 
== 変更履歴 ==
* [[Version 2.8|2.8]] : 次の関数が'''非推奨'''(廃止予定)となりました。右側の関数を使ってください([http://wpdevel.wordpress.com/tag/escaping/ WordPress Development Updates] より)。
+
* [[Version 3.1|3.1]]: Introduced <code>[[Function_Reference/esc_textarea|esc_textarea]]</code>. ([http://core.trac.wordpress.org/ticket/15454 #15454])
** <code>clean_url()</code> <code>esc_url()</code>
+
* [[Version 3.0|3.0]]: Deprecated <code>[[#URLs|clean_url()]]</code> in favor of <code>esc_url()</code> and <code>esc_url_raw()</code>. ([http://core.trac.wordpress.org/ticket/12309 #12309])
** <code>sanitize_url()</code> <code>esc_url_raw()</code>
+
* [[Version 2.8|2.8]]: Deprecated the following functions. (via [http://wpdevel.wordpress.com/tag/escaping/ WordPress Development Updates])
** <code>wp_specialchars()</code> <code>esc_html()</code> (also: <code>esc_html__()</code> and <code>esc_html_e()</code>)
+
** <code>sanitize_url()</code> -> <code>esc_url_raw()</code>
** <code>attribute_escape()</code> <code>esc_attr()</code> (also: <code>esc_attr__()</code> and <code>esc_attr_e()</code>)
+
** <code>wp_specialchars()</code> -> <code>esc_html()</code> (also: <code>esc_html__()</code> and <code>esc_html_e()</code>)
 +
** <code>attribute_escape()</code> -> <code>esc_attr()</code> (also: <code>esc_attr__()</code> and <code>esc_attr_e()</code>)
  
[http://comox.textdrive.com/pipermail/wp-hackers/2009-May/026242.html wp_specialchars() vs attribute_escape() ( now esc_attr() ) and quote entity-encoding] も参照のこと。
+
== 外部資料 ==
 +
* [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://groups.google.com/group/wp-hackers/browse_thread/thread/8f1466febb168935?pli=1 wp_specialchars() vs attribute_escape() ( now esc_attr() ) and quote entity-encoding].
  
{{DEFAULTSORT:てえたけんしよう}}
 
[[Category:上級トピック]]
 
[[Category:WordPress の開発]]
 
[[Category:セキュリティ]]<!-- 試験的カテゴリ -->
 
[[Category:wp2.8]]
 
  
[[en:Data Validation]]
+
[[Category:セキュリティ]]
 +
[[Category:WordPress の開発]]

2013年6月12日 (水) 15:34時点における版

このページ「データ検証」は一部未翻訳です。和訳や日本語情報を加筆してくださる協力者を求めています
変更点が入り組んでいて最新の英文に置き換えにくかった節には、その節の英文全てをコメントアウトで入れてあります。できれば通しで見直してみてください。

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

出力の無害化

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

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

整数値

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

HTML/XML

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


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 ) を使用できます。
wp_rel_nofollow( (string) $html )
あらゆる <a> リンクに "rel='nofollow'" 属性をつけます。
wp_kses_allowed_html( (string) $context )
所定のコンテキストで許可される HTML タグの配列を提供します。post | strip | data | entities あるいはpre_user_description のようなフィールドフィルター

テキスト節

esc_html( $text ) (since 2.8)
< > & " ' (小ナリ、大ナリ、アンド、ダブルクォート、シングルクォート)をエンコードします。esc_attr に良く似ています。
esc_html__ (since 2.8)
翻訳、エンコードします。
esc_html_e (since 2.8)
翻訳、エンコード、出力します。
esc_textarea (since 3.1)
テキストエリアの要素をエンコードします。
sanitize_text_field (since 2.9.0)
ユーザーからの入力又はデータベースからの入力を無害化します。

属性値

esc_attr( $text ) (since 2.8)
esc_attr__()
翻訳、エンコードします。
esc_attr_e()
翻訳、エンコード、出力します。

JavaScript

esc_js( $text ) (since 2.8)

URL

esc_url( $url, (array) $protocols = null ) (since 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 ) (since 2.8)
URL をデータベースに格納するための関数です。この関数は文字を HTML 実体にエンコードしません。URL をエンコードしない形で保存したいときはこの関数を使ってください。 この機能は古い関数 clean_url 関数の $contextdb に設定するのと同等です。
urlencode( $scalar )
URL をエンコードします。(例えば、クエリパラメータで使用する、など)
urlencode_deep( $array )
配列の全要素を 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 のみ理解します。どちらもクォート文字で囲む必要はありません。
$wpdb->get_var( $wpdb->prepare(
  "SELECT something FROM table WHERE foo = %s and status = %d",
  $name, // 未エスケープの文字列 (関数が無害化します)
  $status // 信頼できない整数値 (関数が無害化します)
) );
esc_sql( $sql )
$wpdb->escape() のエイリアス。
$wpdb->escape( $text )
SQL クエリ用に、1つの文字列をエスケープします。addslashes() の見せかけです。$wpdb->prepare が好ましいです。なぜなら、いくつかのフォーマットエラーを修正するからです。
$wpdb->escape_by_ref( &$text )
返り値はありません。パラメータが参照で渡されるので、テキストが直接変更され、返り値を割り当てる必要がありません。
like_escape( $string )
SQL クエリの LIKE 式用に $string を無害化します。さらに SQL エスケープする必要があります (上記のいずれかの関数を使う)。

ファイルシステム

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

HTTP ヘッダ

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

WordPress は、HTTP のロケーションヘッダにユーザーが生成した内容を使えますが、以下のように無害化できます。

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

入力の検証

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

スラッグ

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

HTML

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

Email

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

配列

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

その他

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

検証の哲学

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

ホワイトリスト

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

$possible_values = array( 'a', 1, 'good' );
if ( !in_array( $untrusted, $possible_values ) )
  die( "やっちゃダメ!" );
// Be careful here with fancy breaks and default actions.
switch ( $untrusted ) {
case 'a' :
  ...
  break;
...
default :
  die( "ろくでなし!" );
}

ブラックリスト

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

書式で検出

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

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

書式で訂正

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

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

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

変更履歴

  • 3.1: Introduced esc_textarea. (#15454)
  • 3.0: Deprecated clean_url() in favor of esc_url() and esc_url_raw(). (#12309)
  • 2.8: Deprecated the following functions. (via WordPress Development Updates)
    • sanitize_url() -> esc_url_raw()
    • wp_specialchars() -> esc_html() (also: esc_html__() and esc_html_e())
    • attribute_escape() -> esc_attr() (also: esc_attr__() and esc_attr_e())

外部資料