当将任何代码发布到世界时,无论它仅存在于您的站点还是数十万个站点上,都应力求使其尽可能安全。负责任的编码意味着要警惕主题可能被利用的所有方式。
关于 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 上构建的任何其他内容:
- Common APIs Handbook: Security
- Make Themes: A Guide To Writing Secure Themes:
保持更新
保持对潜在安全漏洞的关注非常重要。以下资源提供了良好的起点: