wordpress核心代码的安全性通常已经由wordpress团队解决掉了,但我们开发自己的主题或插件时,还需要注意安全性。我们有5大基本原则:
- 确保输入数据的安全性:过滤一些容易引起安全隐患的字符
- 数据验证:过滤掉非法输入
- 保护输出数据安全性:对输出的数据做格式化转化
- 阻止不受信任的请求
- 检查用户的权限
我们来看看常见的安全攻击:
SQL注入
表单输入时,我们需要对数据做过滤,比如下面一个错误的示例
function maybe_process_form() {
if (!isset($_POST['wp_learn_form'])){
return;
}
$name = $_POST['name'];
$email = $_POST['email'];
global $wpdb;
$table_name = $wpdb->prefix . 'form_submissions';
$sql = "INSERT INTO $table_name (name, email) VALUES ('$name', '$email')";
$result = $wpdb->query($sql);
if ( 0 < $result ) {
wp_redirect( WPLEARN_SUCCESS_PAGE_SLUG );
die();
}
wp_redirect( WPLEARN_ERROR_PAGE_SLUG );
die();
}
上面这个例子直接使用insert语句,同时对表单字段的数据未做过滤,所以就很容易SQL注入攻击,我们可以修改成下面代码
function maybe_process_form() {
if (!isset($_POST['wp_learn_form'])){
return;
}
$name = sanitize_text_field($_POST['name']);
$email = sanitize_email($_POST['email']);
global $wpdb;
$table_name = $wpdb->prefix . 'form_submissions';
$rows = $wpdb->insert(
$table_name,
array(
'name' => $name,
'email' => $email,
)
);
if ( 0 < $rows ) {
wp_redirect( WPLEARN_SUCCESS_PAGE_SLUG );
die();
}
wp_redirect( WPLEARN_ERROR_PAGE_SLUG );
die();
}
跨站脚本攻击(XSS)
跨站脚本攻击 (XSS)全称是Cross Site Scripting,它是指恶意方将JavaScript注入网页,以发起多种不同的攻击或恶意活动。我们可以通过转义输出、去除不需要的数据来避免XSS漏洞。动态内容在显示之前都应该被转义。比如下面的代码就会发生XSS:
<div id="wp_learn_form" class="<?php echo $atts['class'] ?>">
正确的代码如下:
<div id="wp_learn_form" class="<?php echo esc_attr( $atts['class'] ) ?>">
跨站请求伪造攻击(CSRF)
CSRF是指恶意方诱骗用户在他们经过身份验证的Web应用程序中执行不需要的操作,是一种挟制用户在当前已登录的网站上执行非本意的操作的攻击方法。在做WordPress开发时,使用WordPress的随机数(Nonce)是防止CSRF的必要条件。
Nonce是只能使用一次的随机数字,它用来验证请求的来源是否合法。
在表单中,使用下面函数添加随机数
<?php
wp_nonce_field( 'nonce_action', 'nonce_field' );
?>
其中nonce_action用来标识nonce,nonce_field是加到form表单中的字段名。然后在表单的提交函数中,我们验证随机数,比如:
if ( ! isset( $_POST['nonce_field'] ) || ! wp_verify_nonce( $_POST['nonce_field'], 'nonce_action' ) ) {
wp_redirect( WPLEARN_ERROR_PAGE_SLUG );
die();
}
未授权的访问
所有的资源都应该按访问权限进行验证。通常情况下先检查CSRF,再检查访问权限。
安全跳转
使用wp_safe_redirect做跳转,wp_safe_redirect会检查跳转的地址是否是合法的。