正如该问题中所建议的那样,我将该主题添加为一个新问题,以供社区讨论/投票有关插件/主题安全的最佳实践。
这是一个初始检查表,基于我当前用于审阅主题的(正在进行的)设置/数据安全检查表(插件的原理应与主题相同)。
如果要使用安全且经过严格编码的主题设置页面检出主题,请检出此主题:http :
//wordpress.org/extend/themes/coraline
正如该问题中所建议的那样,我将该主题添加为一个新问题,以供社区讨论/投票有关插件/主题安全的最佳实践。
这是一个初始检查表,基于我当前用于审阅主题的(正在进行的)设置/数据安全检查表(插件的原理应与主题相同)。
如果要使用安全且经过严格编码的主题设置页面检出主题,请检出此主题:http :
//wordpress.org/extend/themes/coraline
Answers:
如果不使用Settings API,则插件和主题应明确提供“设置”页面的随机数检查:
清理可能会从前端和后端进出数据库的所有内容!
插件和主题应该执行正确的数据验证:
在主题模板文件中输出之前,请转义所有不受信任的数据。
插件和主题esc_attr()
应用于文本输入esc_html()
或esc_textarea()
文本区域。
也可从WordPress API是esc_url()
,esc_url_raw()
,esc_js()
和wp_filter_kses()
。
错误的例子:
<?php $url = 'javascript:pwnd()'; ?>
<a href="<?php echo $url; ?>">anchor</a>
好例子:
<a href="<?php echo esc_url($url); ?>">anchor</a>
这是Mark Jaquith的精彩视频,解释了转义功能的用法:
插件和主题应该使用Settings API来获取和保存表单输入数据,而不是直接依赖$_POST
和$_REQUEST
数据。
$wpdb->prepare
通过$wpdb
对象构建自定义查询时,请始终使用$wpdb->prepare
值来填充占位符,而不是使用混合了SQL代码的数据编写查询,因为mysql_*
族函数错误地教会了每个人。
$wpdb->prepare
是不一样的预处理语句。
对于任何编写PHP的人来说都是不错的读物:StackOverflow上的可利用PHP函数。
主题应使用set_theme_mod()
及其相关功能,而不是自行发明的名称方案。
theme_mod API是设置API的专用层;它可以保证唯一的名称,将所有选项组合成一个数组,并且-根据我的经验-更容易处理。此外,它还为插件提供了标准化的过滤器,这对互操作性很有帮助。
register_globals
不要依靠register_globals = on
。一个专业主题这我上次买的客户不正是这一点。我可以在5分钟之内破解使用该主题的任何网站……
ThimbThumb也是这样做的(现在还可以吗?)。
不要创建过于自由的访问权限的文件。
将您在Twitter / Facebook / Anything上的共享指向HTTPS URI(如果可用)。读者的安全也很重要。
set_theme_mod()
,特别是如何将其与Settings API的用法结合使用?
插件和主题应该将选项保存在单个数组中,而不是为设置页面创建多个选项。使用设置API可以解决此问题。
插件应使用适当的功能(例如manage_options
)来添加设置页面的功能。
主题应该edit_theme_options
用作添加设置页面的适当功能。
edit_theme_options
上限,我认为指出这一点的方便之处在于,处于当前状态的设置API仅可用于具有该manage_options
功能的角色。
插件和主题应该有意实现“选项”和“设置”页面,而不应依赖已过时且不包括适当数据安全性的复制粘贴网站教程,例如下面列出的那些。
不做什么的例子:
如何为您的wordpress主题创建选项页面(1stwebdesigner.com)
创建一个很棒的WordPress主题选项页面第1部分(wpshout.com)
插件和主题应该使用设置API,该API更易于使用,更安全,并且可以处理设置页面的许多繁琐工作:
有关使用Settings API的良好教程,请参见:
对于复选框和选择选项,插件和主题应该分别使用checked()
和selected()
函数来输出checked="checked"
和selected="selected"
。
checked( $theme_options['whatever_option'] )
或容易checked( 'some_value' == $theme_options['whatever_option'] )
。我不知道它比这更简洁吗?
插件应在所有选项,自定义函数,自定义变量和自定义常量之前加上plugin-slug。
主题应在所有选项,自定义函数,自定义变量和自定义常量之前加上theme-slug。
指向同一域上的页面时,请使用wp_safe_redirect()而不是直接调用php的header()函数。
插件应该使用该add_options_page()
功能将“插件设置页面”添加到Settings
菜单中,而不是add_menu_page()
用于添加顶级菜单。
主题应使用该add_theme_page()
功能将“主题设置”页面添加到Appearance
菜单,而不是add_menu_page()
用于添加顶级菜单。