净化:确保输入安全
净化是清理或过滤你的输入数据的过程。无论数据是来自用户还是API或网络服务,当你不知道会发生什么,或者你不想对数据进行严格的验证时,你最好使用净化处理。
对数据进行净化的最简单方法是使用WordPress的内置函数。
sanitize_*()
系列辅助函数提供了一种有效的方法来确保你最终获得安全的数据,你只需付出最小的努力:
- sanitize_email()
- sanitize_file_name()
- sanitize_html_class()
- sanitize_key()
- sanitize_meta()
- sanitize_mime_type()
- sanitize_option()
- sanitize_sql_orderby()
- sanitize_text_field()
- sanitize_title()
- sanitize_title_for_query()
- sanitize_title_with_dashes()
- sanitize_user()
- esc_url_raw()
- wp_filter_post_kses()
- wp_filter_nohtml_kses()
当你接受可能不安全的数据时,对其进行验证或净化是很重要的。
例子:简单的输入框
比方说,我们有一个名为标题的输入框。
<input id="title" type="text" name="title">
你可以使用sanitize_text_field()函数来净化:
$title = sanitize_text_field( $_POST['title'] ); update_post_meta( $post->ID, 'title', $title );
在幕后,sanitize_text_field()做了以下工作:
- 检查是否有无效的UTF-8
- 将单个小于号(<)转换为实体
- 剥离所有标签
- 移除换行符、制表符和多余的空格
- 剥离八进制
记住,依靠WordPress的API和它的辅助函数来协助保护你的主题。
转义:确保输出安全
每当你输出数据时,请确保正确地转义。
转义是通过剥离不需要的数据,如格式错误的HTML或脚本标签,防止这些数据被视为代码,从而保证输出的过程安全。
转义有助于在为终端用户渲染数据之前保护你的数据,并防止XSS(跨站脚本)攻击。
跨站脚本(XSS)是一种计算机安全漏洞,通常在网络应用中发现。XSS使攻击者能够将客户端脚本注入到其他用户浏览的网页中。攻击者可以利用跨站脚本漏洞绕过访问控制,如同源策略。
WordPress有一些辅助函数,你可以在大多数常见情况下使用。
esc_html() – 当要显示的数据被一个HTML元素包围时,请使用此函数。
<?php echo esc_html( $title ); ?>
esc_url() – 对所有的URL使用这个函数,包括HTML元素的src和href属性中的URL。
<img src="<?php echo esc_url( $great_user_picture_url ); ?>" />
esc_js() – 对内联的Javascript使用此函数。
<a href="#" onclick="<?php echo esc_js( $custom_js ); ?>">Click me</a>
esc_attr() – 对所有打印到HTML元素属性中的东西使用这个函数。
<ul class="<?php echo esc_attr( $stored_class ); ?>"> </ul>
esc_textarea() – 对文本进行编码,以便在textarea元素中使用。
<textarea><?php echo esc_textarea( $text ); ?></textarea>
输出转义应尽可能晚地发生。
通过本地化转义
与其使用echo来输出数据,不如使用WordPress的本地化函数,如_e() 或 __()
这些函数只是将一个本地化函数包裹在一个转义函数中:
esc_html_e( 'Hello World', 'text_domain' ); // 等同于 echo esc_html( __( 'Hello World', 'text_domain' ) );
这些辅助函数结合了本地化和转义功能:
自定义转义
在你需要以特定方式转义输出的情况下,函数wp_kses()会派上用场。例如,在有些情况下,你希望HTML元素或属性显示在你的输出中。
此函数确保输出中只出现指定的HTML元素、属性和属性值,并规范化HTML实体。
$allowed_html = [ 'a' => [ 'href' => [], 'title' => [], ], 'br' => [], 'em' => [], 'strong' => [], ]; echo wp_kses( $custom_content, $allowed_html );
wp_kses_post()是wp_kses的一个封装函数,其中$allowed_html
是文章内容使用的一组规则。
echo wp_kses_post( $post_content );
数据库转义
在执行SQL查询之前,必须对SQL查询中的所有数据进行SQL转义,以防止SQL注入攻击。WordPress提供了辅助类来协助转义SQL查询$wpdb
。
选择数据
转义SQL查询(本例中为$sql)可以使用其中一个方法:
- $wpdb->get_row($sql)
- $wpdb->get_var($sql)
- $wpdb->get_results($sql)
- $wpdb->get_col($sql)
- $wpdb->query($sql)
插入和更新数据