数据清理:代码示例的最佳实践

时间:2012-04-11 作者:John

我试图理解数据清理(而不是数据验证),以帮助我为WordPress编写安全主题。我在互联网上搜索过,试图为主题开发人员找到一个全面的指南,详细介绍最佳实践。我遇到了一些资源,包括名为“数据验证”的codex页面,但没有一个对我有用。codex页面列出了可用的消毒功能、它们的用法以及它们的作用,但没有解释为什么要使用其中一种,或者在什么情况下要使用特定的消毒功能。这篇文章的目的是要求大家提供错误/未初始化代码的示例,以及如何重新编写以进行适当的清理。这可能是清理帖子标题或帖子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与在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>
上述两种说法都达到了同样的目的。但他们是否需要以不同的方式进行圣诞庆祝?

2 个回复
最合适的回答,由SO网友:onetrickpony 整理而成

codex page 我想这解释得很好。

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

<a href="<?php print $author_url; ?>" 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*函数已经负责清理数据库存储的输入,因此您无需担心这一点。

这个wpdb->prepare() 方法需要在您自己执行DB查询时使用。下面是一个示例:

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

$wpdb->query($sql);
The%s%d 关键字将替换为经过清理的$\\u POST值。

我在WP中的许多插件中看到了一个非常常见的错误。组织存储库将向其传递一个已准备好的查询(但准备得不好),如:

$wpdb->prepare(\'UPDATE wp_posts SET post_title = \\\'\'.$_POST[\'title\'].\' WHERE ...
不要这样做:)

此外,在PHP中回显HTML与在HTML的PHP内联中回显HTML时,是否需要进行不同的清理?

上述两种说法都达到了同样的目的。但他们是否需要以不同的方式进行圣诞庆祝?

SO网友:byronyasgur

马克·贾奎斯的这段视频为我澄清了一切。http://wordpress.tv/2011/01/29/mark-jaquith-theme-plugin-security/

结束

相关推荐

Admin Theme customization

我遵循wordpress codex网站上关于通过插件创建管理主题的说明。我激活了插件,但我的样式表没有包含在<head>.. 这是我的代码:add_action( \'admin_init\', \'kd_plugin_admin_init\' ); add_action( \'admin_menu\', \'kd_plugin_admin_menu\' ); function kd_plugin_admin_init() { /* Register