数据验证

数据验证是根据预定的模式分析数据的过程,并得出明确的结果:有效或无效。

通常,这适用于来自外部的数据,如用户输入和通过API调用网络服务的数据。

数据验证的简单例子:

  • 检查必填字段是否有留空
  • 检查输入的电话号码是否仅包含数字和标点符号
  • 检查输入的邮政编码是否有效
  • 检查数量字段是否大于0

应尽早进行数据验证,这意味着在执行任何操作之前验证数据。

验证可以通过在前端使用JavaScript和在后端使用PHP来执行。

验证数据

至少有三种方法:内置PHP函数、核心WordPress函数和你编写的自定义函数。

 

内置PHP函数

使用许多内置PHP函数可以进行基本验证,包括:

 

核心WordPress函数

WordPress提供了许多有用的函数来帮助验证不同类型的数据。以下是几个示例:

  • is_email() 将验证电子邮件地址是否有效。
  • term_exists() 检查标签、类别或其他分类法项目是否存在。
  • username_exists() 检查用户名是否存在。
  • validate_file() 将验证输入的文件路径是否为真实路径(但不验证文件是否存在)。

查看条件标签列表以了解更多类似的函数。
搜索名称如下的函数:*_exists()*_validate()is_*()。 并非所有这些都是验证函数,但许多都很有用。

 

自定义PHP和JavaScript函数

你可以编写自己的PHP和JavaScript函数,并将其包含在插件中。编写验证函数时,你要把它命名为一个问题(例子:is_phone, is_available, is_us_zipcode)

根据数据是否有效,函数应返回布尔值,为true或false。这将允许使用该函数作为条件。

 

例子 1

假设你有一个用户提交的美国邮政编码输入字段:

<input id="wporg_zip_code" type="text" maxlength="10" name="wporg_zip_code">

文本字段允许最多10个字符的输入,对可使用的字符类型没有限制。用户可以输入诸如1234567890之类的有效内容,或者输入诸如eval()之类的无效内容(和恶意内容)。

输入字段上的maxlength属性仅由浏览器强制执行,因此你仍然需要在服务器上验证输入的长度。否则,攻击者可能会更改maxlength值。

通过使用验证,我们可以确保只接受有效的邮政编码。

首先,你需要编写一个函数来验证美国邮政编码:

<?php function is_us_zip_code($zip_code) {
    // scenario 1: empty
    if (empty($zip_code)) { return false; }

    // scenario 2: more than 10 characters
    if (strlen(trim($zip_code)) > 10) {
        return false;
    }

    // scenario 3: incorrect format
    if (!preg_match('/^\d{5}(\-?\d{4})?$/', $zip_code)) {
        return false;
    }

    // passed successfully
    return true;
}

处理表单时,您的代码应检查wporg_zip_code字段,并根据结果执行操作:

if ( isset( $_POST['wporg_zip_code'] ) && is_us_zip_code( $_POST['wporg_zip_code'] ) ) {
    // your action
}

 

例子 2

假设你要在数据库中查询一些文章,并希望用户能够对查询结果进行排序。

这个例子的代码通过内置的PHP函数in_array将输入的排序键(存储在"orderby"输入参数中)与允许的排序键数组进行比较,检查其有效性。这可以防止用户传入恶意数据并有可能破坏网站。

在用数组检查输入的排序键之前,该键被传递到WordPress的内置函数sanitize_key。除其他外,这个函数确保键是小写的(in_array执行区分大小写的搜索)。

将“true”传递到in_array的第三个参数中可以进行严格的类型检查,这会告诉函数不仅要比较值,还要比较值类型。这允许代码确定传入的排序键是字符串,而不是其他数据类型。

<?php
$allowed_keys = ['author', 'post_author', 'date', 'post_date'];

$orderby = sanitize_key( $_POST['orderby'] );

if ( in_array( $orderby, $allowed_keys, true ) ) {
    // modify the query to sort by the orderby key
}