安全是一个不断变化的领域,漏洞会随着时间的推移而演变。下面讨论了您应该防范的常见漏洞,以及保护主题免受攻击的技术。
漏洞种类
SQL注入
它是什么:
SQL注入发生在输入的值未被正确清理,允许输入的数据中存在某些SQL命令被成功执行。为了防止这种情况,WordPress的API非常广泛,提供了像add_post_meta()
这样的函数,而不需要你通过SQL手动添加post meta(INSERT INTO wp_postmeta…
)。
xkcd Exploits of a Mom
针对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, // an unescaped string (function will do the sanitization for you) $status // an untrusted integer (function will do the sanitization for you) ) );
跨站脚本(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"> <!-- some inputs here ... --> <?php wp_nonce_field( 'name_of_my_action', 'name_of_nonce_field' ); ?> </form>
保持警惕
保持对潜在安全漏洞的了解是很重要的。以下资源提供了一个良好的起点。