常见漏洞

安全是一个不断变化的领域,漏洞会随着时间的推移而演变。下面讨论了您应该防范的常见漏洞,以及保护主题免受攻击的技术。

漏洞种类

 

SQL注入

它是什么:
SQL注入发生在输入的值未被正确清理,允许输入的数据中存在某些SQL命令被成功执行。为了防止这种情况,WordPress的API非常广泛,提供了像add_post_meta()这样的函数,而不需要你通过SQL手动添加post meta(INSERT INTO wp_postmeta…)。

exploits_of_a_mom

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>

 

保持警惕

保持对潜在安全漏洞的了解是很重要的。以下资源提供了一个良好的起点。