不受信任的数据来自许多来源(用户、第三方网站,甚至您自己的数据库!),所有数据在使用前都需要进行检查。请记住:即使管理员也是用户,用户也难免会故意或无意地输入错误数据。保护用户免受自身数据侵害是您的责任。
净化输入是指保护/清理/过滤输入数据的过程。验证优于净化,因为验证更具体。但当无法做到“更具体”时,净化是次优选择。
假设我们有一个名为的输入字段title:
<input id="title" type="text" name="title">
这里我们无法使用验证,因为文本字段太过通用:它可以是任何内容。因此,我们使用以下sanitize_text_field()函数来清理输入数据:
$title = sanitize_text_field( $_POST['title'] );
update_post_meta( $post->ID, 'title', $title );
在幕后sanitize_text_field()执行以下操作:
检查无效的 UTF-8
将单个小于字符 (<) 转换为实体
删除所有标签
删除换行符、制表符和多余的空格
条带八位字节
消毒功能
有许多功能可以帮助您清理数据。
在 Web 开发领域,尤其是在 WordPress 中,过滤输入就像保持你的数字家园整洁有序。过滤输入意味着在将用户提供的数据用于你的网站或数据库之前,对其进行清理以确保其安全。这种做法对于预防 SQL 注入和跨站点脚本 (XSS) 攻击等安全漏洞至关重要。让我们来探索如何在 WordPress 中有效地过滤输入。
输入净化是指将所有用户输入视为不可信且可能有害的输入。通过净化输入,您可以确保网站中使用的或存储在数据库中的任何数据都是安全的,并且不包含恶意代码。
WordPress 提供了几个清理文本输入的功能:
sanitize_text_field():
此函数非常适合纯文本输入。它会去除标签和换行符。
$cleaned_text = sanitize_text_field($_POST['text_input']);
sanitize_textarea_field()
:类似于sanitize_text_field()
,但保留换行符,使其适合文本区域。
$cleaned_textarea = sanitize_textarea_field($_POST['textarea_input']);
要清理电子邮件地址,请使用sanitize_email()
:
$cleaned_email = sanitize_email($_POST['email_input']);
此功能可确保电子邮件地址格式正确且干净。
对于 URL,用于esc_url_raw()
数据库存储或esc_url()
在 HTML 属性中回显 URL。
$cleaned_url = esc_url_raw($_POST['url_input']);
对于整数和浮点数,分别使用intval()
和:floatval()
$cleaned_integer = intval($_POST['integer_input']);$cleaned_float = floatval($_POST['float_input']);
如果您需要允许某些 HTML 标签(例如在富文本编辑器中),请使用它们wp_kses_post()
来发布内容或wp_kses()
在更具体的情况下定义允许的标签和属性。
$allowed_html = array( 'a' => array( 'href' => array(), 'title' => array() ), 'br' => array(), 'em' => array(), 'strong' => array(), ); $cleaned_html = wp_kses($_POST['html_input'], $allowed_html);
虽然转义并非数据清理的直接组成部分,但在将数据输出到浏览器之前对其进行转义也是另一项重要的安全措施。请根据显示数据的上下文,使用esc_html()
、esc_attr()
、esc_url()
和esc_js()
。
除了清理输入之外,还可以使用随机数(“一次性使用的数字”)来验证提交的数据是有意的并且来自您的网站。
wp_nonce_field('my_form_action', 'my_form_nonce');
处理表单时验证随机数提升Wordpress安全:
if (!isset($_POST['my_form_nonce']) || !wp_verify_nonce($_POST['my_form_nonce'], 'my_form_action')) { // Handle the invalid nonce case }
在 WordPress 中,过滤输入不仅是最佳实践,更是网站安全性和完整性的关键组成部分。通过使用 WordPress 的内置功能清理和验证用户输入,您可以显著降低安全漏洞的风险,并确保您的网站始终安全可靠。
我目前正在开发我的第一个 WordPress 插件。几天前,我把它提交给了 WordPress 审核。很遗憾,这个插件(目前)还没有发布,因为我还需要解决一些安全问题。更具体地说,就是数据必须经过清理、转义和验证。
不幸的是,我在开发过程中完全忘记了这一点。现在我已经通过文档熟悉了上述原则,我想我已经理解了它们,但我仍然不确定如何在某些地方实际应用它们。
1. 突出显示活动菜单项
为了突出显示活动菜单项,我编写了一个小辅助函数:
protected function get_current_site() { $page = $_GET['page']; return $page; }
该函数在标题中使用:
<li <?php if($this->get_current_site() == 'myplugin-settings') { echo 'class="active"'; } ?>><a href="?page=myplugin-settings">Settings</a></li>
我如何在这里应用这三个原则(Sanitized、Escaped 和 Validated)?
2. 通过 AJAX 切换状态
为了更改插件的状态,我通过 AJAX 使用了一个小函数。这里 $_POST["active"] 的值要么是 0,要么是 1:
$this->loader->add_action('wp_ajax_toggle_myplugin', $this, 'toggle_myplugin'); public function toggle_myplugin() { $active = $_POST["active"]; $status = update_option('myplugin_status', $active); echo $status; wp_die(); }
我如何在这里应用这三个原则(Sanitized、Escaped 和 Validated)?
3. 模板的动态渲染
我使用 GET 变量在插件的特定页面上输出不同的模板:
public function render_template() { if(isset($_GET['action'])) { $action = $_GET['action']; switch($action) { case("edit"): include MYPLUGIN_ROOT_PATH . 'includes/admin/templates/template1.php'; break; case("add"): include MYPLUGIN_ROOT_PATH . 'includes/admin/templates/template2.php'; break; default: include MYPLUGIN_ROOT_PATH . 'includes/admin/templates/template3.php'; } }}
我如何检查action变量?
4. 检查隐藏输入字段的值
我使用隐藏的输入字段来传递隐藏值(在我的情况下是 ID):
<input type="hidden" name="id" value="<?php echo $id; ?>"> public function actions() { if($_SERVER['REQUEST_METHOD'] == 'POST') { $action = $_POST["action"]; switch($action) { case "edit": $id = $_POST["id"];
$name = $_POST["name"]; [...] break; case "add": $name = $_POST["name"]; [...] break; } }
提前谢谢大家!这是我的第一个插件。