安全是任何网站都不能忽视的问题,要避免出现不可靠数据代码就显得尤其重要,符合安全规范的代码确保了网站的正常运行和数据安全,为此,WordPress内置了大量处理函数,这些都是值得我们注意的。
转码方式
说到安全过滤,转码是最常用的必不可少的方式之一,在WordPress中转码需要注意以下几点:
esc_html()
代替wp_specialchars()
和htmlspecialchars()
esc_url()
代替clean_url()
esc_attr()
代替attribute_escape()
如:<?php echo esc_html(get_the_title());?>
类型数据
对于不同类型的数据过滤规则也不同,为此WordPress内置了大量处理函数,在编码的过程中我们应当使用这些函数处理对应数据确保不会出现歧义或导致安全隐患。以下是常用处理函数:
- 使用
esc_url()
过滤链接,如:<?php echo esc_url($url);?>
- 使用
esc_attr()
过滤属性文本,如:<input type="text" name="fname" value="<?php echo esc_attr( $fname ); ?>">
- 使用
sanitize_email()
过滤邮箱地址,如:<?php echo sanitize_email(' admin@example.com! '); //~经过过滤最终输出的是 admin@example.com ?>
- 使用
sanitize_file_name()
过滤文件名,如:<?php echo sanitize_file_name($file);?>
- 使用
sanitize_html_class()
过滤 CSS 类名,如:<div class="<?php echo sanitize_html_class($classes);?>">
- 使用
sanitize_key()
过滤 key (大写会转小写,符号只保留破折号和下划线) - 使用
sanitize_meta()
过滤元数据,主要是用于保存之前的处理 - 使用
sanitize_mime_type()
过滤 MIME 类型 - 使用
sanitize_option()
过滤常规设置,如:<?php sanitize_option( 'admin_email', $new_email ); ?>
- 使用
sanitize_sql_orderby()
过滤 MySQL 语句中的 OrderBy 部分 - 使用
sanitize_post_field()
过滤文章字段,如:<?php echo sanitize_post_field( 'post_title', $post->post_title, $post->ID, 'display' );?>
- 使用
sanitize_text_field()
过滤即将保存到数据库的文本字段,会检查 UTF-8 编码,将 < 转为实体并删除所有标签、换行符、制表符和额外的空格等。 - 使用
sanitize_title()
过滤标题 - 使用
sanitize_title_for_query()
过滤使用在数据库查询的标题 - 使用
sanitize_title_with_dashes()
过滤标题(会有破折号代替空格) - 使用
sanitize_user()
过滤用户名
注:自动闭合标签可使用 balanceTags()
函数
身份验证
相信看过 wp-config.php 文件的童鞋都会发现在里面有8行不规则的独一无二的字符串,这些字符串既用作登录Cookie加密,也用于普通用户的身份验证,没错,这个就是 WordPress Nonces 。
WordPress Nonces 会为每个独立访客生成一个独一无二的字符串,而且只是24小时有效(有效期可以更改),通过使用 Nonces 可以防止类似 CSRF 攻击等不良企图的非人为操作。
以下几个场景是最常用到 Nonces 的:
- 通过使用链接传入参数操作时(如:删除文章)
- 通过表单提交数据时(如:常规设置)
- 通过AJAX获取或操作数据时(如:加载评论)
一般情况下,我们使用 wp_create_nonce()
函数创建 Nonce 验证码,如:
<?php $nonce = wp_create_nonce( 'my-nonce' ); ?>
使用 wp_verify_nonce()
函数验证 Nonce 是否有效,如:
<?php if(!wp_verify_nonce($nonce, 'my-nonce' )) die('验证失败');?>
但对于某些常用场景,WordPress内置一些函数方便我们以最简单的代码实现,如给链接添加 Nonce 时可以使用 wp_nonce_url()
函数,如:
$complete_url = wp_nonce_url( $bare_url, 'trash-post_'.$post->ID );
给表单添加 Nonce 时可以使用 wp_nonce_field()
函数,如:
<?php wp_nonce_field('trash-post_'.$post->ID ); ?>
除了最基本的用法之外,我们还可以通过这个检查请求来源(包括 AJAX 请求),如:
<?php check_admin_referer( 'delete-comment_'.$comment_id, 'my_nonce' );?>
AJAX:<?php check_ajax_referer( 'my-special-string', 'security' );?>
拓展阅读
以上所讲的仅仅是从编码的层面来排查可能会导致安全隐患以及值得注意的地方,在日常使用中,要保证WordPress的正常使用和数据安全,我们至少还需要注意以下几点:
- 服务器安全:服务器系统及软件的更新和网络防火墙
- 权限控制:WordPress推荐目录权限 755 或 750 ,文件权限 644 或 640 (例外:wp-config.php 应设为 600,以防其它用户读取),不应给任何目录设置 777 权限,上传目录也不行。
- WordPress版本:及时更新WordPress版本,尤其是安全更新
- 主题和插件:知道和了解主题插件的来源以及其可靠性
- 账户安全:管理员账户名和密码应该尽量复杂及个性化,不应使用admin之类常见词语
- 定时备份:防止发生不可挽救的情况最有效的方法就是未雨绸缪定时备份
WordPress是最流行的建站系统,所以也是木马机器人后台扫描及暴力破解的重要对象,要解决这个问题请参考:WordPress添加注册和登录用户名黑名单。