WordPress 用户、数据及访问安全性检查和处理
网站的安全性管理非常重要,这是保证网站能够正常和稳定运行的必要环节,也是确保数据有效性的关键环节。在一个提供用户管理的网站里,往往使用基于角色的安全管理机制,不同的角色具有不同的使用权限,通过为用户分配角色来使用与其相对应的网站功能。比如,网站管理员具有最高的权限,作者具有创建文章的权限,读者具有阅读文章的权限。第二个关键的安全方面的因素就是数据的有效性,当输入和输出数据的时候,需要进行校验来保证数据的有效性。再就是为了避免网站功能的访问被劫持,也需要做安全方面的检查。
WordPress 使用基于角色的用户安全管理机制,因此是否一个用户具有某个功能的操作权限,需要判断用户的角色是否具有相对应的权限(能力 capability),可以使用如下的代码:
if (current_user_can('edit_others_posts')) {
/* 具有编辑文章的权限 */
}
if ( ! current_user_can( 'manage_options' ) ) {
return; // 没有管理员的权限
}
给角色分配权限可以使用如下的代码:
function assign_role_caps()
{
// 获取角色对象
$role = get_role('Author');
// 增加权限
$role->add_cap('edit_others_posts', true);
}
add_action('init', 'assign_role_caps', 11);
创建新的角色可以使用如下的代码:
function add_new_role()
{
add_role(
'new_role',
'New Role',
[
'read' => true,
'edit_posts' => true,
'upload_files' => true,
]
);
}
add_action('init', 'add_new_role');
WordPress 另一个重要的安全机制就是数据校验和整理,包括用户输入数据的处理以及显示输出数据的处理。
1、用户输入数据处理
包括数据校验和整理,用户输入的数据在提交到后台数据库前往往需要根据该数据的类型、特征等情况做数据处理从而保证数据的有效性。比如,输入的数据是否为空,数据长度否符合要求,邮政编码是否符合规范;对数字、文本、身份证、口令、邮件地址等数据进行整理。举例如下:
<?php
function is_phone_number($phone_number)
{
// 判断是否为空
if (empty($phone_number)) {
return false;
}
// 判断号码长度
if (strlen(trim($phone_number)) != 11 ) {
return false;
}
// 判断是否为数字
if (!is_numeric($phone_number) {
return false;
}
return true;
}
/* 根据用户输入的电话号码判断其有效性并执行相应的操作 */
if (isset($_POST['phone_number']) && is_phone_number($_POST['phone_number'])) {
// 号码有效所执行的代码
}
2、显示输出数据处理
包括输出内容符合 Html 语法规范以及语言本地化处理。代码举例如下:
esc_html_e( 'Hello World', 'text_domain' );
<a html="<?php echo esc_url( $url ); ?>" >Url</a>
<input type="text" value="<?php echo esc_attr($value);?>">
WordPress 第三个重要的安全机制就是用户访问防劫持,就是避免使用非正常浏览的方式调用网站的功能,WordPress 通过随机码校验的机制来保证访问的一致性。我们在这篇文章中已经使用了该安全机制,代码如下:
function plugin_enqueue_scripts() {
if(is_single()) {
wp_enqueue_script( 'pvs-kflyo', plugins_url( '/js/kflyo-pvs-ajax.js', __FILE__ ) , array('jquery') );
wp_localize_script( 'pvs-kflyo', 'pvs_ajax', array(
'ajax_url' => admin_url( 'admin-ajax.php' ),
'pvs_nonce' => wp_create_nonce('pvs-nonce'), //创建随机码
'post_id' => get_the_ID()
));
}
}
function pvs_ajax_process() {
check_ajax_referer( 'pvs-nonce', 'nonce' ); // 校验随机码
$post_id = $_POST['post_id'];
if ($post_id) {
wpa_track_post_views($post_id);
}
wp_die();
}