数据验证是根据预定的模式分析数据的过程,并得出明确的结果:有效或无效。
通常,这适用于来自外部的数据,如用户输入和通过API调用网络服务的数据。
数据验证的简单例子:
- 检查必填字段是否有留空
- 检查输入的电话号码是否仅包含数字和标点符号
- 检查输入的邮政编码是否有效
- 检查数量字段是否大于0
应尽早进行数据验证,这意味着在执行任何操作之前验证数据。
验证可以通过在前端使用JavaScript和在后端使用PHP来执行。
验证数据
至少有三种方法:内置PHP函数、核心WordPress函数和你编写的自定义函数。
内置PHP函数
使用许多内置PHP函数可以进行基本验证,包括:
isset()
和empty()
用于检查变量是否存在且不为空mb_strlen()
或strlen()
用于检查字符串是否具有预期的字符数preg_match()
,strpos()
用于检查某些字符串在其他字符串中的出现情况count()
用于检查数组中的项目数in_array()
用于检查数组中是否存在某些内容
核心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 }