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:<a href="https:/www.solagirl.net">A link</a>
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:name@email.com
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…
wp_html_excerpt( $str, $count, $more = null )
$str = 'There are lots & <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 & 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