在使用SET_TRANSPENT之前,我必须序列化/清理/转义数组数据吗?

时间:2018-07-21 作者:J.BizMai

一切都有问题。

对于在管理中显示警告/错误的通知系统,我使用了transient。

当我发布第一个插件时,我收到一封电子邮件,要求我清理/验证/转义数据库中插入的数据,以便。。。

我正在做一个函数来包装set_transient() 但我不确定在这种情况下是否有必要。Wordpress应该这样做。

secure_set_transient

function secure_set_transient( string $transient_name, $value ) {
    $f_transient_name = maybe_serialize( esc_attr( sanitize_key( $transient_name ) ) );
    $f_value = ( !is_scalar( $value ) ) ? maybe_serialize( $value ) : esc_attr( sanitize_text_field( $value ) );
    return set_transient(  $f_transient_name, $f_value );
}
是否需要使用esc_attr(), sanitize_key()sanitize_text_field()?

是否序列化非标量值?

如果我不序列化数组值,一切都会正常。当我使用maybe_serialize(), 作为数组的数据已序列化,但在使用get_transient(). 当我检查wordpress内核时,我可以看到它从未序列化,而是在函数的顶部set_transient(), 上面写着:@param mixed $value Transient value. Must be serializable if non-scalar.我有点困惑。我该怎么办?

1 个回复
SO网友:Lucas Bustamante

tl;dr

  • Should I serialize the data? 不,只要一切都可以序列化,就可以为您完成
  • Should I sanitize/escape the data? 部分。数据将自动转义以防止SQL注入攻击,但您应该对其进行清理和验证,以确保data consistency.

说明

如果没有对象缓存,瞬态将数据存储在数据库中$wpdb->update(), 它通过使用PDO prepared statements.

如果对象缓存已就位,它只会将其保存在对象缓存类中WP_Object_Cache::set(), 不进行任何消毒。我不认为这是一个问题,因为对象缓存不像SQL那样遭受任何类型的注入。

它只能是security issue 如果您在没有正确转义的情况下提取并输出此数据,那么您可能需要小心。

您不需要序列化该值,只需确保如果它是一个对象,那么它是可序列化的(通过实现Serializable 接口),如果它是一个数组,那么这些值也是可序列化的。所有标量类型都是可即时序列化的,例如string、int、float等。

这就是@param mixed $value Transient value. Must be serializable if non-scalar. 你在问题中引用的意思是。

值得一提的是,对于存储在对象缓存中的瞬态,对象缓存有责任序列化值,但我不担心这一点,因为这是任何对象缓存存储的基本特性。默认情况下,Memcached会对其进行序列化,而Redis则依赖于该插件,但无论哪种方式,您都可以考虑使用对象缓存来序列化您的值。

结束

相关推荐

Ajax call to transients

如果我对Wordpress瞬态进行ajax调用,瞬态值是从服务器上的内存中获取的,还是调用数据库?我没有使用任何缓存插件。我的应用程序正在获取标记列表。前端将根据用户类型显示匹配的标记。我假设页面加载时,所有瞬态都会加载。因此,在进行ajax调用时,会从内存中提取瞬态。对