如本问题所述,我将该主题添加为新问题,以供社区讨论/表决有关插件/主题安全的最佳实践。

这是根据我当前用于审核主题的(正在进行的)设置/数据安全性检查清单上(插件的原理应与主题相同)。

如果要查看主题并带有安全且经过严格编码的主题设置页面,请查看以下主题:http://wordpress.org/extend/themes/coraline

评论

如果拥有适当特权的人不介意将其设置为社区Wiki?

要以Wiki模式收到问题,国防部需要适当地标记问题,我已将其标记为国防部注意,这只是时间问题。.:)

珊瑚素有何特别之处? Imo仍然有进入的方法。我建议将anins A插入链接:wordpress.stackexchange.com/questions/13539/…

Coraline可能没有什么特别之处。这只是我们当前在审查主题时将主题开发人员指向的那个对象,因为这是Justin Tadlock给出的示例,他做了许多最初的特定于安全性的主题审查。我也提供Oenology作为一个很好的例子,但是我不想尝试拉皮条自己的主题。 :)

#1 楼

使用随机数(当不使用Settings API时)

插件和主题应该明确提供“设置”页面随机数检查,如果不使用Settings API:


WordPress随机数(Codex)
WordPress随机数(Mark Jaquith)
使用随机数(Vladimir Prelovac)改善WordPress插件的安全性
在WordPress中使用AJAX的5条提示> 3.使用随机数并检查权限(Gary曹)


#2 楼

对数据进行消毒,验证和转义

对可能进出数据库(!)的所有数据进行前端和后端的消毒!

插件和主题应该执行正确的数据验证:



在将数据输入数据库之前验证和清除所有不可信数据
进入数据库

先将所有不可信数据转义至输出设置表单
字段

转义所有不受信任的数据,然后再输出到主题模板中。
文件



数据验证(Codex)



插件和主题应将esc_attr()用于文本输入,将esc_html()esc_textarea()用于文本区域。

WordPress API也提供esc_url()esc_url_raw() ,错误的示例:

<?php $url = 'javascript:pwnd()'; ?>
<a href="<?php echo $url; ?>">anchor</a>


很好的示例:

<a href="<?php echo esc_url($url); ?>">anchor</a>


这里是Mark Jaquith的精彩视频,解释了转义功能的用法:


主题和插件安全rity


评论


在进场时进行消毒,在进场时进行逃生.. :)

– t31os
2011年3月30日22:04

#3 楼

仅小心使用$ _GET / $ _POST / $ _REQUEST,并且在没有更好的API时使用

插件和主题应该使用Settings API来获取和保存表单输入数据,而不是直接依赖$_POST$_REQUEST数据。

评论


始终将$ _POST,$ _ REQUEST和$ _GET视为不安全。对这些数组中的值进行清理和白名单,然后将它们放入您自己的变量中。切勿清理来自用户的值并将其放回$ _POST。

– Goldenapples
2011-3-30在22:49

始终检查是否在适当的数组中设置了需要使用的密钥。 isset()是您的朋友:)

–mfields
2011年4月18日在8:32

#4 楼

使用$wpdb->prepare


通过$wpdb对象构建自定义查询时,请始终使用$wpdb->prepare来用值填充占位符,而不要使用混合了SQL代码的数据来编写查询,因为mysql_*系列函数错误教会了所有人。

评论


$ wpdb-> prepare与准备好的语句不同。

– hakre
11年8月17日在12:01

#5 楼

请注意可能用于运行恶意代码的PHP函数

对于编写PHP的任何人来说都是不错的读物:StackOverflow上的可利用PHP函数。

使用主题修改API


主题应使用set_theme_mod()和相关功能,而不是自行发明的名称方案。
theme_mod API是设置API的专用层;它可以保证唯一的名称,将所有选项组合成一个数组,并且根据我的经验,它更容易处理。另外,它为插件提供了标准化的过滤器-有利于互操作性。

避免启用register_globals


不要依赖register_globals = on。我的上一个客户购买的Pro Theme正是做到了这一点。我可以在5分钟之内破解使用该主题的任何网站……
ThimbThumb也这样做(现在还可以吗?)。

不要创建具有不必要的广泛访问权限的文件

请勿创建访问权限过于宽松的文件。

在可用的地方使用SSL

将您的Share指向Twitter / Facebook /指向HTTPS URI的所有链接(如果可用)。读者的安全性也很重要。

评论


您能否详细说明一下set_theme_mod(),以及如何将其与Settings API的用法结合起来?

–芯片Bennett
2011-3-30在22:27

@Chip Bennett我已在回答中添加了一些信息。

– fuxia♦
2011-03-30 22:42

您能否以较小的更具体的答案细分此迷你列表?较小规模的社区Wiki更易于管理。 TIA

–稀有
2011年3月31日15:23

芯片:Theme mod系统与Settings API集成得不太好。我很快就会写一篇帖子,说明如何正确地做。

–奥托
2011年4月1日在22:17

#6 楼

将数据保存在单个数组中

插件和主题应该将选项保存在单个数组中,而不是为设置页面创建多个选项。使用设置API可以解决此问题。

#7 楼

添加和输出设置页面时,请检查适当的功能

插件应使用适当的功能(例如manage_options)来添加设置页面的功能。

主题应使用edit_theme_options作为添加设置页面的适当功能。


角色和功能(Codex)


评论


小但重要的注意事项:尽管您不能在设置API中使用edit_theme_options,但是选项提交被硬编码为需要manage_options才能提交更新。相关的Trac票可以在这里找到。

– t31os
2011年3月30日在21:35

是的,但是1)仅会影响编辑者,而不会影响管理员; 2)希望可以通过链接的Trac票证尽快解决。

–芯片Bennett
2011-03-30 21:56

总是有可能给自定义角色或常规角色赋予edit_theme_options上限,我想指出这一点可能很方便,即处于当前状态的设置API仅可用于具有manage_options功能的角色。

– t31os
11 Mar 30 '11 at 22:01

#8 楼

使用最新的教程和信息

插件和主题都应故意实现“选项”和“设置”页面,并且不要依赖过时且不包含适当数据安全性的复制粘贴网站教程,例如下面列出的内容。

不做什么的示例:


如何为您的wordpress主题创建选项页面(1stwebdesigner.com)
创建一个很棒的WordPress主题选项页面第1部分(wpshout.com)


评论


我在其中添加了一些强调的文字以指示链接是不做的示例,因为很容易浏览信息并单击链接而无需阅读前面的段落。当我在那里的时候,答案也变得更漂亮了;;)

– t31os
2011年3月30日在21:27

这可能需要一些解释,这些示例教程使用的是错误的和/或旧的方式。

–稀有
2011年3月31日20:24

#9 楼

使用设置API

插件和主题应使用设置API,该API易于使用,更安全,并且可以处理很多设置页面的辛苦工作:


Settings API(Codex)

有关使用Settings API的良好教程,请参见:


将Settings API集成到WordPress主题中( Chip Bennett)
使用register_setting()(Ozh Richard)处理WordPress中的插件选项
WordPress设置API教程(Otto)


评论


关于设置API和主题选项,请参阅我对此答案的评论。

– t31os
2011年3月30日21:36

#10 楼

对于复选框和选择选项,插件和主题应使用checked()selected()函数分别输出checked="checked"selected="selected"

评论


除非我缺少某些东西,否则这并不是真正的安全性。仍然非常方便,并且很好用。 :)

–稀有
2011年3月31日在20:39

好吧,也许也许不是。我已经看到了很多用于完成同一件事的自定义代码。更多的代码细面条=带来更多引入安全风险的机会。 :)

–芯片Bennett
2011年3月31日20:49在

Bennet-从几天前寄给toscho的邮件中-我想我可以为我们两个人说-最简单的功能比这些功能更容易阅读和理解。我没有失望,但也没有对此表示赞同。恕我直言,这不应该成为核心,因为它不会增加任何价值。

– kaiser
2011年4月1日,下午3:29

我很好奇你们想出的东西比选中($ theme_options ['whatever_option'])或选中('some_value'== $ theme_options ['whatever_option'])容易。我不知道它比这更简洁吗?

–芯片Bennett
2011年4月1日在12:55

#11 楼

前缀函数和变量名称

插件应在所有选项,自定义函数,自定义变量和自定义常量之前加上plugin-slug。

主题应在所有选项,自定义函数,自定义变量和带有主题的自定义常量。

评论


我会将其扩展到所有类名称以及自定义对象(如post_types和分类法)的名称。

–mfields
2011年4月18日在8:29

#12 楼

指向同一域上的页面时,请使用wp_safe_redirect()而不是直接调用php header()函数。

#13 楼

将设置页面添加到管理菜单的相应部分

插件应使用add_options_page()函数将插件设置页面添加到Settings菜单,而不是使用add_menu_page()添加顶级菜单。

主题应该使用add_theme_page()函数将主题设置页面添加到Appearance菜单,而不是使用add_menu_page()添加顶级菜单。