当将任何代码发布到世界时,无论它仅存在于您的站点还是数十万个站点上,都应力求使其尽可能安全。负责任的编码意味着要警惕主题可能被利用的所有方式。

关于 Common APIs Handbook 中 Security chapter 的安全学习的主要来源。本文应被视为您在那里所学内容的补充,而不是关于安全本身的全面指南。

下面您将找到一些需要考虑的常见漏洞列表,但请使用 Resources 部分获取如何保护主题的更全面概述。

常见漏洞

安全是一个不断变化的领域,漏洞也会随时间演变。以下是您应该保护的常见漏洞概述以及防止主题被利用的技术。

跨站脚本(XSS)

跨站脚本(XSS) 发生在一方恶意将 JavaScript 注入网页时。

为避免 XSS 漏洞,任何输出都应进行转义。由于输出内容是主题的主要职责,您应始终使用适当的函数根据数据类型 escape dynamic content(转义动态内容)。

此示例展示了如何转义图像 URL 以避免 XSS 漏洞:

<img src="<?php echo esc_url( $great_user_picture_url ); ?>" />

包含 HTML 实体的内容可以清理以仅允许指定的 HTML 元素:

$allowed_html = array(
	'a' => array(
		'href' => array()
	),
	'br'     => array(),
	'em'     => array(),
	'strong' => array()
);

echo wp_kses( $custom_content, $allowed_html );

SQL 注入

当输入的值未正确清理时,数据中的任何 SQL 命令都可能被执行,从而发生 SQL 注入。为防止这种情况,WordPress API 非常广泛。例如,它提供像 add_post_meta() 这样的函数,这样您就不需要手动通过 SQL 插入元数据。

加固主题以抵御 SQL 注入的第一条规则是:如果有 WordPress 函数,请使用它。

虽然在主题中很少这样做,但有时您需要执行 API 未涵盖的复杂查询。如果是这种情况,始终使用 $wpdb functions($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, // an unescaped string (function will do the sanitization for you)
	$status // an untrusted integer (function will do the sanitization for you)
) );

跨站请求伪造(CSRF)

跨站请求伪造或 CSRF(发音为 sea-surf)是指一方恶意诱使用户在他们已认证的 Web 应用程序中执行不需要的操作。例如,钓鱼电子邮件可能包含指向 WordPress admin 中将删除用户账户的页面的链接。

这种情况在插件中更为常见。但如果您的主题包含任何基于 HTML 或 HTTP 的表单提交,请使用 nonce(一次性令牌)来保证用户打算执行操作:

<form method="post">
	<!-- some inputs here ... -->
	<?php wp_nonce_field( 'name_of_my_action', 'name_of_nonce_field' ); ?>
</form>

资源

使用以下资源深入探索如何保护您的主题、插件以及您在 WordPress 上构建的任何其他内容:

保持更新

保持对潜在安全漏洞的关注非常重要。以下资源提供了良好的起点: