WordPress 用户、数据及访问安全性检查和处理

security-of-user-data-and-access

网站的安全性管理非常重要,这是保证网站能够正常和稳定运行的必要环节,也是确保数据有效性的关键环节。在一个提供用户管理的网站里,往往使用基于角色的安全管理机制,不同的角色具有不同的使用权限,通过为用户分配角色来使用与其相对应的网站功能。比如,网站管理员具有最高的权限,作者具有创建文章的权限,读者具有阅读文章的权限。第二个关键的安全方面的因素就是数据的有效性,当输入和输出数据的时候,需要进行校验来保证数据的有效性。再就是为了避免网站功能的访问被劫持,也需要做安全方面的检查。

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();
}

发表评论

邮箱地址不会被公开。 必填项已用*标注