WordPress插件和主题的安全最佳实践是什么? 时间:2011-03-30 作者:Chip Bennett As suggested in this question, 我将此主题作为一个新问题添加进来,供社区讨论/投票关于插件/主题安全的最佳实践。这是基于我当前(正在进行的工作)设置/用于审查主题的数据安全检查表的开始检查表(插件的原则应与主题的原则相同)。如果要签出具有安全且可靠编码的主题设置页面的主题,请签出此主题:http://wordpress.org/extend/themes/coraline 13 个回复 SO网友:Chip Bennett 使用nonce(不使用设置API时)插件和主题应明确提供设置页面nonce检查,如果不使用设置API:WordPress Nonces (Codex)WordPress Nonces (Mark Jaquith)Improving security in WordPress plugins using Nonces (Vladimir Prelovac)5 tips for using AJAX in WordPress > 3. Use nonces and check for permission (Gary Cao) SO网友:Chip Bennett 清理、验证和转义数据Sanitize anything that could get in and out of (!) the database both front end and back end!插件和主题应执行适当的数据验证:Validate 和sanitize 将数据输入数据库之前的所有不受信任的数据Escape 将所有不受信任的数据输出到设置窗体字段之前Escape 将所有不受信任的数据输出到主题模板文件之前Data Validation (Codex)插件和主题应使用esc_attr() 对于文本输入和esc_html() 或esc_textarea() 用于文本区域。WordPress API还提供esc_url(), esc_url_raw(), esc_js() 和wp_filter_kses().Bad example:<?php $url = \'javascript:pwnd()\'; ?> <a href="<?php echo $url; ?>">anchor</a> Good example:<a href="<?php echo esc_url($url); ?>">anchor</a> 以下是Mark Jaquith的精彩视频,介绍了转义函数的用法:Theme & Plugin Security SO网友:Chip Bennett 只有小心地使用$\\u GET/$\\u POST/$\\u REQUEST,如果没有更好的API,插件和主题应该使用设置API来获取和保存表单输入数据,而不是依赖$_POST 和$_REQUEST 直接获取数据。 SO网友:Matteo Riva 使用$wpdb->prepare通过构建自定义查询时$wpdb 对象,始终使用$wpdb->prepare 使用值填充占位符,而不是使用与SQL代码混合的数据编写查询,如mysql_* 家庭功能错误地教会了每个人。 SO网友:fuxia 小心使用可能用于运行恶意代码的PHP函数对于任何编写PHP的人来说,这都是一本不错的读物:Exploitable PHP functions 在StackOverflow上。使用Theme Modification API主题应使用set_theme_mod() 和相关功能not 一个自创的名字方案one 根据我的经验,阵列和更容易处理。此外,它还为插件提供了标准化的过滤器,这有利于互操作性。已启用避免register_globals不要依赖register_globals = on. 我上一位客户购买的专业主题正是这样做的。我可以在5分钟内破解任何使用此主题的网站…ThimbThumb也这样做了(现在仍然这样做?)。不要创建具有不必要的广泛访问权限的文件,不要创建具有太多自由访问权限的文件。如果可用,请使用SSL将您在推特/脸书/任何内容上的共享链接指向HTTPS URI(如果可用)。读者的安全也很重要。 SO网友:Chip Bennett 将数据保存在单个数组中插件和主题应将选项保存在单个数组中,而不是为设置页面创建多个选项。使用设置API可以处理这个问题。 SO网友:Chip Bennett 在添加和输出设置页面时,检查是否有适当的功能插件应使用适当的功能(例如。manage_options) 添加设置页面的功能。主题应使用edit_theme_options 根据相应的功能添加设置页面。Roles and Capabilities (Codex) SO网友:Chip Bennett 使用最新的教程和信息;主题应故意实现选项和设置页面,并not 依赖于过时的复制和粘贴网站教程,这些教程不包括适当的数据安全性,例如下面列出的那些。什么的示例not to do:How to create an options page for your wordpress theme (1stwebdesigner.com)Create an awesome WordPress theme options page part 1 (wpshout.com) SO网友:Chip Bennett 使用设置API(Use Settings API)插件和主题应使用设置API(Settings API),该API更易于使用,更安全,并能处理设置页面的大量繁重工作:Settings API (Codex)有关使用设置API的良好教程,请参阅:Incorporating the Settings API in WordPress Themes (Chip Bennett)Handling Plugins Options in WordPress with register_setting() (Ozh Richard)WordPress Settings API Tutorial (Otto) SO网友:Chip Bennett 前缀函数和变量名称插件应使用插件slug为所有选项、自定义函数、自定义变量和自定义常量添加前缀。主题应在所有选项、自定义函数、自定义变量和自定义常量前面加上主题slug。 SO网友:Chip Bennett 对于复选框和选择选项,插件和主题应使用checked() 和selected() 输出功能checked="checked" 和selected="selected", 分别地 SO网友:mfields 使用wp_safe_redirect() 而不是在指向同一域上的页面时直接调用php的header()函数。 SO网友:Chip Bennett 将设置页面添加到管理菜单的相应部分,插件应使用add_options_page() 函数将插件设置页面添加到Settings 菜单,而不是使用add_menu_page() 添加顶级菜单。主题应使用add_theme_page() 函数将主题设置页面添加到Appearance 菜单,而不是使用add_menu_page() 添加顶级菜单。 结束 文章导航