一切都有问题。
对于在管理中显示警告/错误的通知系统,我使用了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.
我有点困惑。我该怎么办?
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则依赖于该插件,但无论哪种方式,您都可以考虑使用对象缓存来序列化您的值。