如本问题所述,我将该主题添加为新问题,以供社区讨论/表决有关插件/主题安全的最佳实践。
这是根据我当前用于审核主题的(正在进行的)设置/数据安全性检查清单上(插件的原理应与主题相同)。
如果要查看主题并带有安全且经过严格编码的主题设置页面,请查看以下主题:http://wordpress.org/extend/themes/coraline
#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()
添加顶级菜单。
评论
如果拥有适当特权的人不介意将其设置为社区Wiki?要以Wiki模式收到问题,国防部需要适当地标记问题,我已将其标记为国防部注意,这只是时间问题。.:)
珊瑚素有何特别之处? Imo仍然有进入的方法。我建议将anins A插入链接:wordpress.stackexchange.com/questions/13539/…
Coraline可能没有什么特别之处。这只是我们当前在审查主题时将主题开发人员指向的那个对象,因为这是Justin Tadlock给出的示例,他做了许多最初的特定于安全性的主题审查。我也提供Oenology作为一个很好的例子,但是我不想尝试拉皮条自己的主题。 :)