安全是一个不断变化的领域,漏洞也会随时间演变。以下内容将讨论您应防范的常见漏洞类型,以及保护您的主题免受利用的技术。
漏洞类型
SQL 注入
当输入的值未经过适当清理时,就会发生 SQL 注入,导致输入数据中的任何 SQL 命令都可能被执行。为防止这种情况,WordPress API 非常广泛,提供了如 add_post_meta(); 这样的函数,而无需您通过 SQL 手动添加帖子元数据(INSERT INTO wp_postmeta…)。

xkcd 妈妈的利用
强化主题以防范 SQL 注入的第一条规则是:如果有 WordPress 函数可用,就使用它。
但有时您需要执行一些 API 中未涵盖的复杂查询。如果是这种情况,请始终使用 $wpdb 函数。这些函数是专门为保护您的数据库而构建的。
在执行 SQL 查询之前,必须对 SQL 查询中的所有数据进行 SQL 转义,以防止 SQL 注入攻击。用于 SQL 转义的最佳函数是 $wpdb->prepare(),它支持类似 sprintf() 和 vsprintf() 的语法。
$wpdb->get_var( $wpdb->prepare(
"SELECT something FROM table WHERE foo = %s and status = %d",
$name, // 一个未转义的字符串(函数会为您完成清理)
$status // 一个不受信任的整数(函数会为您完成清理)
) );跨站脚本 (XSS)
跨站脚本 (XSS) 是指恶意方将 JavaScript 注入到网页中。
通过转义输出、剥离不需要的数据来避免 XSS 漏洞。由于主题的主要职责是输出内容,因此主题应根据内容的类型,使用适当的函数 转义动态内容。
其中一个转义函数的示例是从用户资料中转义 URL。
<img src="<?php echo esc_url( $great_user_picture_url ); ?>" />包含 HTML 实体的内容可以进行清理,仅允许指定的 HTML 元素。
$allowed_html = array(
'a' => array(
'href' => array(),
'title' => array()
),
'br' => array(),
'em' => array(),
'strong' => array(),
);
echo wp_kses( $custom_content, $allowed_html );跨站请求伪造 (CSRF)
跨站请求伪造或 CSRF(读作 sea-surf)是指恶意方诱骗用户在已登录的 Web 应用程序中执行非预期的操作。例如,网络钓鱼邮件可能包含一个链接,指向会在 WordPress 后台删除用户账户的页面。
如果您的主题包含任何基于 HTML 或 HTTP 的表单提交,请使用 nonce 来确保用户确实打算执行该操作。
<form method="post">
<!-- 此处有一些输入 … -->
<?php wp_nonce_field( 'name_of_my_action', 'name_of_nonce_field' ); ?>
</form>保持更新
及时了解潜在的安全漏洞非常重要。以下资源提供了一个良好的起点: