保存帖子时允许未登录用户使用未过滤的HTML

时间:2014-02-03 作者:Feel The Noise

我正在使用以下代码:

$var1 = $_GET["t1s2ninput"];
$var2 = $_GET["t1s2pinput"];
$new_post = array (
    \'post_title\'    => \'Title <dl class="variation"> <dt>Variation: </dt> <dd>\'. $var1 .\'</dd> </dl>\',
    \'post_author\'   => 5,
    \'post_content\'  => \'Lorem ipsum\',
    \'post_status\'   => \'publish\',
    \'post_type\'     => \'product\',
);

$post_id = wp_insert_post($new_post);

wp_set_post_terms( $post_id, 72, "product_cat");

$var3 = $var2 / 1;
update_post_meta( $post_id, \'_price\', $var3 );

global $woocommerce; 
$woocommerce->cart->add_to_cart($post_id, 1);
当我以管理员身份登录时,它可以完美地工作,但是在任何其他情况下(注销,其他用户…)这篇文章的标题没有发挥应有的作用HTML 标签(在本例中<dl class="variation"> 其他人)消失了。

我做错了什么?

非常感谢。

1 个回复
SO网友:kaiser

能力-针对客人

您的问题是,客户没有任何功能。当帖子得到处理时,他们需要通过某些检查。一个是unfiltered_html. 抄本:

允许用户在页面、帖子、注释和小部件中发布HTML标记甚至JavaScript代码。

Note: 为不受信任的用户启用此选项可能会导致他们发布恶意或格式错误的代码。

Note: 在WordPress Multisite中,只有超级管理员具有unfiltered_html 能力。

为了仍能将其输入数据库,您应该对其进行编码。以下示例首先修剪前导和尾随空格。然后将所有字符转换为其编码的等效字符,对单引号和双引号进行编码,并以适当的UTF-8返回(建议在PHP 5.4之前的版本中使用ISO-8859-1字符集)。如果您使用的是PHP 5.4+,那么您还可以添加 | ENT_HTML5 将其转换为HTML5。现在是important 部分:使用WP global for allowed tags and PHP去除所有不需要的标签strip_tags. 最后,我们解码所有HTML标记。现在,您的内容应该可以保存,包括HTML。

$content = trim( $new_post[\'post_title\'] );
$content = htmlentities( $content, ENT_QUOTES, "UTF-8" );
$content = strip_tags( $content, "<".join( "><", array_keys( $GLOBAL[\'allowedtags\'] ) ).">" );
$content = html_entity_decode( $content );
代码没有经过测试,我不能完全确定join 零件是这样工作的。strip_tags() 需要字符串和IIRCglobal $allowedtags 是一个数组,标记名不带前导/尾随括号作为键,属性作为值。如果这样的话,你将不得不对它进行一点修改(请提交一份[编辑]以防我在某个地方出错)。

安全内容

除此之外,您还插入了通过$_GET. 您应该使用esc_*() 函数,甚至更好的是,本机PHPfilter_var()it\'s cousins.

结束

相关推荐

order users with drag'n'drop?

有很多插件可以让你通过拖放来订购页面和/或帖子。是否有与订单用户类似的内容?如果没有,是否可以为此创建一个插件(即是否有足够的过滤器、操作等)?