安全是一种不断变化的景观,随着时间的流逝,脆弱性会不断发展。以下是您应该保护的常见漏洞的讨论,以及保护主题免受剥削的技术。
漏洞的类型
SQL注入
当未正确消毒的值允许输入数据中的任何SQL命令进行可能执行时,就会发生SQL注入。为了防止这种情况,WordPress API是广泛的,提供了类似的功能add_post_meta();
而不是您需要通过SQL手动添加元元(INSERT INTO wp_postmeta…
)。
XKCD 妈妈的漏洞
将主题与SQL注入更强化的第一个规则是:当有WordPress功能时,请使用它。
但是有时您需要进行复杂的查询,这些查询尚未在API中考虑到。如果是这种情况,请始终使用 $wpdb
功能。这些是专门为保护您的数据库而构建的。
SQL查询中的所有数据必须在执行SQL查询之前进行SQL驱散以防止SQL注入攻击。用于SQL-Escaping的最佳功能是$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(发音为See-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>
保持最新
重要的是要保持潜在的安全漏洞。以下资源提供了一个很好的起点: