数据验证

数据验证是根据预定义模式(或多个模式)分析数据的过程,最终结果是:有效或无效。

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

数据验证的简单示例:

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

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

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

 

验证数据

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

 

内置PHP函数

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

 

核心WordPress功能

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

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

查看WordPress代码参考以获取更多类似的函数。
搜索具有以下名称的函数:*_exists()*_validate(),和is_*()。并非所有这些都是验证函数,但许多都很有用。

 

自定义PHP和JavaScript函数

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

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

 

示例1

假设您有一个用户提交了U.S.邮政编码input字段。

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

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

我们的input字段上的maxlength属性仅由浏览器强制执行,因此您仍然需要在服务器上验证输入的长度。如果不这样做,攻击者可能会更改maxlength值。

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

首先,您需要编写一个函数来验证U.S.邮政编码:

/**
 * Validate a US zip code.
 *
 * @param string $zip_code   RAW zip code to check.
 *
 * @return bool              true if valid, false otherwise.
 */
function wporg_is_valid_us_zip_code( $zip_code ) {
	// Scenario 1: empty.
	if ( empty( $zip_code ) ) {
		return false;
	}

	// Scenario 2: more than 10 characters.
	if ( 10 < strlen( trim( $zip_code ) ) ) {
		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'] ) && wporg_is_valid_us_zip_code( $_POST['wporg_zip_code'] ) ) {
	// your action
}

 

示例2

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

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

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

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

$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.
}