WP笔记

WordPress数据的验证、清理和转义

WordPress数据的验证、清理和转义,英文为Validating, sanitizing, and escaping。指对任何进入WordPress的数据都要验证和清理,对任何输出到网页的数据都要转义,是WordPress安全的重要保障。本文简单介绍用于WordPress数据安全的函数。

下面是函数的简单介绍,如果你想了解更多内容,请移步WordPress Code Reference

目录

验证输入 / Validation

验证用户提交的数据和你需要的数据是否一致。

is_email( $email )

is_serialized( $data, $strict = true )

判断$data是否为序列化的数据,如果$data不是字符串类型,直接返回false。

is_serialized_string( $data )

is_serialized()的区别是,$data里保存的数据必须是字符串类型,如果是序列化的数组,就会返回false。

wp_is_numeric_array( $data )

判断$data是否是key为数字的序列化数组。

清理输入

数据清理就是将字符串中的非法字符删掉。用户提交的数据,或者从数据库读取的数据都需要清理。

sanitize是清理消毒的意思,下划线后面的信息告诉我们,这个函数适合清理什么对象。比如sanitize_file_name()用来清理文件名,sanitize_text_field()可以清理用户通过input text提交的数据。

sanitize_file_name( $filename )

$sanfilename = sanitize_file_name('文件名["filename"_01$%<>].txt');
echo $sanfilename;
// Output:文件名filename_01.txt

sanitize_user( $username, $strict = false )

$strict为true时只允许[0-9-_.@]。

$sanuser = sanitize_user( '用户名{}  !@#.-myname123*' );
echo $sanuser;
// Output:用户名{} !@#.-myname123*

$sanuser = sanitize_user( '用户名{}  !@#.-myname123*', true );
echo $sanuser;
// Output:@.-myname123

sanitize_title( $title, $fallback_title = ”, $context = ‘save’ )

将字符串转换成可以用在URL里的slug。

$santitle = sanitize_title('Àtitle标题_slug_[]!@()*.html?a=1');
echo $santitle;
// Output:atitle%e6%a0%87%e9%a2%98_slug_-htmla1

sanitize_title_with_dashes( $title, $raw_title = ”, $context = ‘display’ )

注意,sanitize_title()将字符 À 变成了普通的字母a。

$santitle = sanitize_title_with_dashes('Àtitle标题_slug_[]!@()*.html?a=1');
echo $santitle;
// Output:%c3%a0title%e6%a0%87%e9%a2%98_slug_-htmla1

sanitize_title_for_query( $title )

相当于 sanitize_title( $title, '', 'query' )

sanitize_key( $key )

只允许小写字母、下划线_和短破折号-。

$key = sanitize_key( 'A string key!');
echo $key;
// Output: astringkey

sanitize_html_class( $class, $fallback = ” )

$sanclass  = sanitize_html_class('column_1 col-md-5"<script>"');
echo $sanclass;
// Output:column_1col-md-5script

sanitize_email( $email )

$sanemail  = sanitize_email('邮件名称 emailname@gmail.com?');
echo $sanemail;
// Output:emailname@gmail.com

sanitize_text_field( $str )

  • Checks for invalid UTF-8,
  • Converts single < characters to entities
  • Strips all tags
  • Removes line breaks, tabs, and extra whitespace
  • Strips octets
$santextfield  = sanitize_text_field('<h1>title</h1><style>h1{color:black}</style>');
echo $santextfield;
// Output:title

sanitize_textarea_field( $str )

$santextfield  = sanitize_textarea_field('<h1>title</h1><style>h1{color:black}</style>');
echo $santextfield;
// Output:title

sanitize_hex_color( $color )

$color必须是一个有效的颜色,以#开头,否则该函数返回空值。

$sancolor  = sanitize_hex_color('#aaa');
echo $sancolor;
// Output:#aaa

sanitize_user_field( $field, $value, $user_id, $context )

根据上下文净化用户字段,例如:

$user_input = '中文"useremail@email.com<>';
echo sanitize_user_field( 'user_email', $user_input,1,'display');
//返回值: useremail@email.com

如果字符串不含有有效的email地址,则返回空字符串。

转义输出

将一些特殊字符转换成html实体,防止输出数据里包含非法的js等,扰乱网站功能。跟sanitize的函数相同,下划线后面的信息代表使用场景。转义函数应该尽量在数据输出时使用。

esc_html( $text )

$html = esc_html( '<a href="https:/www.solagirl.net">A link</a>' );
echo $html;
// Output:&lt;a href=&quot;https:/www.solagirl.net&quot;&gt;A link&lt;/a&gt;

esc_attr( $text )

注意,当输出的内容为url时,应使用esc_url()

<?php $fname = ( isset( $_POST['fname'] ) ) ? $_POST['fname'] : ''; ?>
<input type="text" name="fname" value="<?php echo esc_attr( $fname ); ?>">

esc_textarea( $text )

esc_xml( $text )

esc_url( $url, $protocols = null, $_context = ‘display’ )

<a href="<?php echo esc_url( home_url( '/' ) ); ?>">Home</a>

esc_url_raw( $url, $protocols = null )

相当于esc_url( $url, $protocols, 'db' )

esc_js( $text )

<input type="text" value="<?php echo esc_attr( $instance['input_text'] ); ?>" id="subbox" 
onfocus="if ( this.value == '<?php echo esc_js( $instance['input_text'] ); ?>') { this.value = ''; }" 
onblur="if ( this.value == '' ) { this.value = '<?php echo esc_js( $instance['input_text'] ); ?>'; }" name="email" />

wp_kses( $string, $allowed_html, $allowed_protocols = array() )

该函数在过滤字符串时,会保留$allowed_html定义的html标签,如果你输出的内容允许包含html内容,就用这个函数。你可以直接使用wp_kses_post()来保留所有post里允许出现的标签。

格式化

一些WordPress内建的函数可以方便的格式化数据。

wpautop( $pee, $br = true )

将一个换行符转换成br($br=true),将两个换行符编程p标签。

zeroise( $number, $threshold )

添加前导零。

$number = zeroise('111', 5);
echo $number;
// Output:00111

wp_slash( $value )

递归在需要转义的字符前添加反斜杠”\“,$value可以是简单的字符串,也可以是数组。

$add_slashes = wp_slash(array(
    'John' => "Hi I'm John"
));
print_r($add_slashes);
// Output:Array ( [John] => Hi I\'m John )

wp_unslash( $value )

与wp_slash()执行相反的操作,也是递归执行。

trailingslashit( $string )

在字符串结尾添加斜杠”/”。

echo trailingslashit( 'https://www.solagirl.net');
// Output:https://www.solagirl.net/

untrailingslashit( $string )

与trailingslashit()执行相反的操作。

urlencode_deep( $value )

递归执行urlencode,$value可以是array、object或scalar,scalar变量指字符串、整数、浮点数或布尔值。

print_r( urlencode_deep(array(
    'param_1' => 'hello world'
)) );
// Output:Array ( [param_1] => hello+world )

rawurlencode_deep( $value )

递归执行rawurlencode,rawurlencode与urlencode的一个显著区别是对空格的编码不同,前者使用%20,后者使用+。

urldecode_deep( $value )

antispambot( $email_address, $hex_encoding = 0 )

将email地址字符串转换为html’实体,防止spam。

var_dump(antispambot( 'name@email.com' ));
// Output:&#110;a&#109;&#101;&#64;ema&#105;l&#46;c&#111;&#109;

make_clickable( $text )

将字符串的URL转换成可点击的链接。

echo make_clickable( 'https://www.solagirl.net' );
// Output:<a href="https://www.solagirl.net" rel="nofollow">https://www.solagirl.net</a>

wp_make_link_relative( $link )

echo wp_make_link_relative( 'https://www.solagirl.net/mypath' );
// Output:/mypath

wp_rel_nofollow( $text )

echo wp_rel_nofollow( '<a href="https://www.solagirl.net">solagirl.net</a>' );
// Output:<a href="https://www.solagirl.net" rel="nofollow">solagirl.net</a>

wp_rel_ugc( $text )

echo wp_rel_ugc( '<a href="https://www.solagirl.net">solagirl.net</a>' );
// Output:<a href="https://www.solagirl.net" rel="nofollow" ugc"="">solagirl.net</a>

wp_targeted_link_rel( $text )

向具有target属性的a标签添加rel="noopener"属性。

echo wp_targeted_link_rel( '<a href="https://www.solagirl.net" target="_blank">solagirl.net</a>' );
// Output:<a href="https://www.solagirl.net" target="_blank" rel="noopener">solagirl.net</a>

wp_trim_words( $text, $num_words = 55, $more = null )

只有站点语言设为中文时,才能正确count words。

echo wp_trim_words( 'I love WordPress', 2 );
// Output:I love&hellip;

wp_html_excerpt( $str, $count, $more = null )

$str = 'There are lots &amp; <strong>lots</strong> of usages for this function. I know you can think of some! (lots more text here)';
echo wp_html_excerpt( $str, 50 );
// Output:'There are lots &amp; lots of usages for this funct'

$str = '<h1>中文字符串</h1>';
echo wp_html_excerpt( $str, 2 );
// Output:中文

htmlentities2( $myHTML )

将特殊字符转换成html实体,保留已经转换的实体。

links_add_target( $content, $target = ‘_blank’, $tags = array( ‘a’ ) )

echo links_add_target( '<a href="https://www.solagirl.net">solagirl.net</a>');
// Output:<a href="https://www.solagirl.net" target="_blank">solagirl.net</a>

normalize_whitespace( $str )

echo normalize_whitespace( '  text with extra     whitespace  ');
// Output:text with extra whitespace

wp_strip_all_tags( $string, $remove_breaks = false )

echo wp_strip_all_tags( '<script>var a = 1</script><h2>post title</h2>' );
// Output:post title

echo strip_tags( '<script>var a = 1</script><h2>post title</h2>' );
// Output:var a = 1post title