首页 / 主题开发手册 / 主题安全 / 数据净化/转义

数据净化/转义

净化:确保输入安全

净化是清理或过滤你的输入数据的过程。无论数据是来自用户还是API或网络服务,当你不知道会发生什么,或者你不想对数据进行严格的验证时,你最好使用净化处理。

对数据进行净化的最简单方法是使用WordPress的内置函数。

sanitize_*()系列辅助函数提供了一种有效的方法来确保你最终获得安全的数据,你只需付出最小的努力:

当你接受可能不安全的数据时,对其进行验证或净化是很重要的。

 

例子:简单的输入框

比方说,我们有一个名为标题的输入框。

<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)可以使用其中一个方法:

 

插入和更新数据

 

Like语句