问题描述

我正在努力了解数据清理 (而非数据验证),以帮助我为 WordPress 编写安全的主题。我搜索了互联网,试图找出详细说明最佳实践的主题开发者的综合指南。有几个资源我遇到包括 codex 页面的数据验证,虽然没有对我有用。 codex 页面列出了可用的消毒功能,它们的用途以及它们的作用,但是没有解释为什么你会使用一个或另一个使用特定的消毒功能的情况。这篇文章的目的是要求每个人都提供不良/未经授权的代码示例,以及如何使用 re-written 进行适当的消毒。这可以是消除邮政标题或 post thumnails src 或更精细的代码来处理 $_POST 数据的 Ajax 请求的消息的一般代码。

另外,我想知道是否添加/更新数据库的 WordPress 功能 (例如下面的代码块中提到的) 是否会自动为您处理消毒工作?如果是,那么当您采取其他措施来清理发送到这些 WordPress 功能的数据时,是否有例外?

add_user_meta
update_user_meta
add_post_meta
update_post_meta
//just to name a few

另外,在 PHP 中回显 HTML 时,需要做不同的消毒处理,而不是 PHP 内联 HTML?为了更清楚我在问什么,这里是代码:

<?php echo '<div class="some-div ' . $another_class . '" data-id="' . $id . '" >' . $text . '</div>'; ?>

<div class="some-div <?php echo $another_class; ?>" data-id="<?php echo $id; ?>"><?php echo $text; ?></div>

上述声明都是一样的。但是他们需要不同的方式呢?

最佳解决方案

这个 codex page 很好地解释了我的想法。

最重要和最常用的功能可能是 esc_attr 。举个例子:

<a href="<?php%20print%20$author_url;%20?>" title="<?php print $author_name; ?>">
  <?php print $author_name; ?>
</a>

如果 $author_name 包含"字符,您的属性关闭,如果该字符后跟 onclick="do_something();"它可能会更糟糕:)

print esc_attr($author_name)确保这样的字符被编码,并且浏览器不做它不应该做的事情。

有一种情况,你不需要它:当你期待一个数字,在这种情况下,你可以投入输入数据为整数,例如:

print (int)$_POST['some_number'];


您列出的 meta *函数已经在保护数据库存储的输入消毒,所以你不需要担心。

当您自己进行 DB 查询时,需要使用 wpdb->prepare()方法。以下是一个例子:

$sql = $wpdb->prepare('
    UPDATE wp_posts SET post_title = %s WHERE ID = %d',
      $_POST['title'], $_POST['id']);

$wpdb->query($sql);

%s%d 关键字将被您的消毒 $ _POST 值所取代。

在 WP.org 信息库中的许多插件中看到的一个非常常见的错误是将已准备好的查询传递给它 (并且准备不充分),如:

$wpdb->prepare('UPDATE wp_posts SET post_title = ''.$_POST['title'].' WHERE ...

不要这样做:)

Also, does sanitization needs to be done differently when echoing HTML in PHP as against PHP inline of HTML?

Both the above statements achieve the same thing. But do they need to be santized differently?

没有。

次佳解决方案

马克·贾基斯 (Mark Jaquith) 的这部录像让我清楚了。 http://wordpress.tv/2011/01/29/mark-jaquith-theme-plugin-security/

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。