Languages: English • Validation 日本語 Русский • (Add your language)
Ненадежные данные поступают из многих источников (пользователи, сторонние сайты, ваша собственная база данных!, ...) и все они нуждаются в проверке как на ввод, так и на вывод.
Метод валидации данных зависит от типа данных, а также от того, в каком контексте они используются. Далее мы рассмотрим несколько типичных задач, а также то, как необходимо валидировать данные.
Совет: Рекомендуется делать валидацию как можно позже, идеально - непосредственно перед выводом, вместо того, чтобы сделать это в самом начале. Таким образом, вы будете уверены, что данные валидны, и не будет необходимости помнить, делалась уже валидация, или нет.
Note that many types of XML documents (as opposed to HTML documents) understand only a few named character references: apos, amp, gt, lt, quot
. When outputting text to such an XML document, be sure to filter any text containing illegal named entities through WordPress's ent2ncr( $text )
function.
wp_kses( (string) $fragment, (array) $allowed_html, (array) $protocols = null )
wp_kses()
.wp_kses_post( (string) $fragment )
for tags that are allowed in posts/pages or wp_kses_data( (string) $fragment )
for the small list of tags allowed in comments.wp_rel_nofollow( (string) $html )
wp_kses_allowed_html( (string) $context )
esc_html( $text )
(начиная с 2.8)esc_attr
.esc_html__
(начиная с 2.8)esc_html_e
(начиная с 2.8)esc_textarea
(начиная с 3.1)sanitize_text_field
(since 2.9.0)esc_attr( $text )
(начиная с 2.8)esc_attr__()
esc_attr_e()
esc_js( $text )
(начиная с 2.8)esc_url( $url, (array) $protocols = null )
(начиная с 2.8)esc_url
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 http, https, ftp, ftps, mailto, news, irc, gopher, nntp, feed, and telnet), eliminates invalid characters, and removes dangerous characters. Replaces clean_url()
which was deprecated in 3.0.esc_url_raw( $url, (array) $protocols = null )
(since 2.8)clean_url
function by setting $context
to db
.urlencode( $scalar )
urlencode_deep( $array )
$wpdb->insert( $table, (array) $data )
$data
должна быть не экранирована (функция выполнит это за вас). Keys как columns, Values как values.$wpdb->update( $table, (array) $data, (array) $where )
$data
должна быть не экранирована. Keys как columns, Values как values. $where
должна быть не экранирована. Multiple WHERE
conditions are AND
ed together.$wpdb->update( 'my_table', array( 'status' => $untrusted_status, 'title' => $untrusted_title ), array( 'id' => 123 ) );
$wpdb->prepare( $format, (scalar) $value1, (scalar) $value2, ... )
$format
это sprintf()-подобный формат строки. Он понимает только %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 )
addslashes(). $wpdb->prepare
как правило, предпочтительнее, так как он исправляет несколько типичных ошибок форматирования.$wpdb->escape_by_ref( &$text )
like_escape( $string )
$string
для использования в LIKE выражениях SQL запросов. Будет по прежнему нуждаться в SQL экранировании (с одной из перечисленных функций).validate_file( (string) $filename, (array) $allowed_files = "" )
$filename
represents a valid relative path. After validating, you must treat $filename
as a relative path (i.e. you must prepend it with an absolute path), since something like /etc/hosts will validate with this function. Returns an integer greater than zero if the given path contains .., ./, or :, or is not in the $allowed_files
whitelist. Be careful making boolean interpretations of the result, since false (0) indicates the filename has passed validation, whereas true (> 0) indicates failure.Header splitting attacks are annoying since they are dependent on the HTTP client. WordPress has little need to include user generated content in HTTP headers, but when it does, WordPress typically uses whitelisting for most of its HTTP headers.
WordPress does use user generated content in HTTP Location headers, and provides sanitation for those.
wp_redirect($location, $status = 302)
wp_safe_redirect($location, $status = 302)
Many of the functions above in #Output_Sanitation are useful for input validation. In addition, WordPress uses the following functions.
sanitize_title( $title )
sanitize_user( $username, $strict = false )
$strict
when creating a new user (though you should use the API for that).balanceTags( $html )
or force_balance_tags( $html )
tag_escape( $html_tag_name )
sanitize_html_class( $class, $fallback )
is_email( $email_address )
array_map( 'absint', $array )
Some other functions that may be useful to sanitise data input:
There are several different philosophies about how validation should be done. Each is appropriate for different scenarios.
Accept data only from a finite list of known and trusted values.
$possible_values = array( 'a', 1, 'good' ); if ( !in_array( $untrusted, $possible_values ) ) die( "Don't do that!" );
// Be careful here with fancy breaks and default actions. switch ( $untrusted ) { case 'a' : ... break; ... default : die( "You hoser!" ); }
Reject data from finite list of known untrusted values. This is very rarely a good idea.
Test to see if the data is of the correct format. Only accept it if it is.
if ( !ctype_alnum( $data ) ) die( "Your data is teh suX0R" ); if ( preg_match( "/[^0-9.-]/", $data ) ) die( "Float on somewhere else, jerky" );
Accept most any data, but remove or alter the dangerous pieces.
$trusted_integer = (int) $untrusted_integer; $trusted_alpha = preg_replace( '/[^a-z]/i', "", $untrusted_alpha ); $trusted_slug = sanitize_title( $untrusted_slug );
esc_textarea
. (#15454)clean_url()
in favor of esc_url()
and esc_url_raw()
. (#12309)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()
)