Wordpress变量$allowedposttags引发的一些问题
一般不会碰到这东西, 也就是禁止评论里出现一些注入代码等等. 但是更改主题的时候, 发现Options Framework这个框架保存设置的时候, 对textarea标签进行过滤. 导致没办法添加一些标签, po个文记录一下.
第一趴
发现问题
想在主题中添加一个”额外代码”的选项, 可以把统计代码推送代码放到页脚. 原主题(kratos)也是有这个功能的. 但是实际使用遇到一些问题, Options Framework框架再保存设置的时候, 使用了 wp_kses 函数处理内容. 导致一些不在变量 $allowedposttags 中的标签无法显示.
/** * Sanitization for textarea field * * @param $input string * @return string $output sanitized string */function of_sanitize_textarea($input){ global $allowedposttags; return wp_kses($input, $allowedposttags);}
add_filter('of_sanitize_textarea', 'of_sanitize_textarea');百度现在是没有自动推送了, 最近更换域名也是重新开始对这些搜索引擎进行推送连接. 360搜索目前还支持自动推送, 加上代码后会有个奇怪的问题. 这段代码原本是这样的.
<script>(function(){var src = "https://jspassport.ssl.qhimg.com/11.0.1.js?d182b3f28525f2db83acfaaf6e696dba";document.write('<script src="' + src + '" id="sozz"><\/script>');})();</script>保存之后第四行id属性以及script标签结尾被删除了.
document.write('<script src="' + src + '">');因为360这个推送代码id是有用的, 引入的第二个js文件调用这个id. 所以缺少了会报错, 并且标签尾没了浏览器会自动添加, 但是添加的很诡异, 会把他下面的所有内容全包进去.
提出方案
- 删除框架中对textarea标签的验证
- hook allowedtags 使其支持scrtip标签和其ID属性
- 更改js代码
第二趴
实际实施
第一种方法不可取, 虽然很简单, 直接return就行了. 但是毕竟这个框架这个函数不是只为这一个功能服务的. 而且这个验证还是挺有用的, 防止一些垃圾注入. 除非对自己的代码以及后期设置很有信心, 保证不会再代码安全上出现问题.
第二种方法就更危险了, 因为allowedtags也不是为了这个函数专门创建的. 还对评论进行处理, 如果hook处理不当直接导致评论者可以通过评论漏洞来攻击服务器. 就算是加了is_admin()的判断, 也无法保证其他管理员都需了结代码安全问题.
提供的代码仅供参考, 再次强调: 此代码有一定风险, 谨慎使用.
/* * 只在后台页面hook允许script标签 * 本意是可以让Options Framework设置保存验证允许保存带script标签的内容 * */if (is_admin()) { if (!function_exists('admin_allow_other_tag')) { function admin_allow_other_tag() { global $allowedposttags, $allowedtags; $allowedposttags["script"] = array('id' => true, 'src' => true); $allowedtags["script"] = true; } }add_action( 'init', 'admin_allow_other_tag' );}第三种方法是我能想到的最好的解决办法了, 代码本意不就是引入个js么. 换种写法不就好了.
(function(){let s = document.createElement('script');s.id='sozz';s.src="https://jspassport.ssl.qhimg.com/11.0.1.js?d182b3f28525f2db83acfaaf6e696dba"document.body.appendChild(s);})();本来是想使用第二种方法的, 但是改了之后id标签等还是会被删除, 后来看了一些xss的文章, 发现这个验证还是非常有用的. 也就没有继续深究到底是因为什么id标签被删除了. 如果有同学直到可以告诉我.
感触颇深, MD这人真得学会变通. 就这个问题, 翻源码调试花了1个多小时(php技术不行), 最后想起来改js不就完了.

辽公网安备21021302000353号