web-dev-qa-db-fra.com

WP Cron ne sauvegarde pas <iframe> ou <objet> dans le corps du message

J'utilise wp_cron pour saisir automatiquement les publications d'un site Web distant et les enregistrer dans ma base de données wp.

AVIS! J'exécute mon code à partir de mon plugin, pas à partir de mon modèle functions.php ou ailleurs. J'ai ma propre validation du contenu capturé pour empêcher le code malveillant, etc., donc désactiver la validation de la sécurité dans wordpress n'est pas un problème dans mon cas, mais soyez prudent si vous ne possédez pas votre propre validation du contenu capturé. Toujours valider les valeurs saisies si possible!

J'ai dans mon plugin un bouton pour saisir les messages manuellement en cliquant sur ce bouton et cela fonctionne parfaitement. Tout est stocké comme je le souhaite dans ma base de données. Pas de problème ici.

mais alors j'ai une fonction wp_cron qui s'exécute à des fins de test toutes les deux minutes (si quelqu'un clique sur ma page, bien sûr;) et voici un problème.

Notez que le code est identique, juste au lieu de get_user_id() je le règle manuellement à 1. c'est probablement le seul changement entre ces deux codes.

Et le problème, c’est que tout est stocké comme prévu, y compris l’heure, le titre, le slug (il est même saisi et téléchargé et définit correctement l’image présentée pour le message), les balises, les catégories et une taxonomie supplémentaire. Donc ça va.

La seule chose qui manque est le corps du texte (contenu) de la publication.

Lorsque téléchargé à partir de l'administrateur manuellement. C'est quelque chose comme:

<iframe width="650" scrolling="no" height="450" frameborder="0" src="http://example.com/embedframe/3843634"></iframe>

ou

<object height="450" width="650" ><param name="movie" ... bla bla bla ... shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" height="450" width="650" /></object> 

Donc, c'est parce qu'il est filtré et rayé, je veux dire object et iframe non connecté en tant qu'administrateur?

Si oui, comment puis-je le désactiver dans mon plugin?

Ou s'agit-il d'autre chose?

Je pense vraiment que c'est uniquement quelque chose qui pose un problème de sécurité WP, car le code fonctionne lorsqu'il est exécuté manuellement à partir d'admin. Et le code de la fonction est identique et toutes les variables sont transmises comme prévu. Juste le contenu n'est pas enregistré.

EDIT:

C'est définitivement quelque chose avec le WP security . Lorsque je règle manuellement la variable de contenu de ma fonction auto-cron sur "Test de l'enregistrement automatique". est sauvegardé normalement. Mais quand je le règle sur <iframe>something</iframe> ou <object>blablabal</object>, ce n'est pas.

Comment désactiver cette "vérification" afin que je puisse enregistrer mon code avec cron?

Une idée?

2
Derfder

Au lieu de supprimer manuellement les filtres de sécurité de ce type, vous devez simplement définir le bon utilisateur pour que ces processus s'exécutent.

Lorsque vous êtes connecté et que vous exécutez un processus manuellement, vous êtes connecté et, par conséquent, vos informations d'identification sont utilisées et vos autorisations utilisées. Je parie que vous êtes un administrateur du site. Vous avez la permission de poster unfiltered_html, ce qui signifie que vous pouvez poster des iframes, des objets et tout ce que vous voulez.

Lorsque votre travail cron est exécuté, il ne dispose pas de vos informations d'identification. Donc, il n'obtient pas les mêmes autorisations. Ainsi, les filtres de sécurité sont activés et des choses comme les iframes et autres sont bloquées.

Pour résoudre ce problème, vous devez modifier votre processus afin de ne pas désactiver les filtres, mais d’exécuter en tant que vous . Recherchez donc votre numéro d’identifiant utilisateur dans la base de données et, juste avant le processus d’importation, ajoutez le code suivant:

wp_set_current_user( 123 );

Où "123" correspond à votre numéro d'identification d'utilisateur. Alors le code sera maintenant "vous" et peut faire les choses comme vous les feriez. Ces filtres ne prendront pas effet car les autorisations sont correctes pour l'utilisateur actuel.

Remarque: Ce n'est pas plus sûr, BTW. Vous autorisez toujours un site Web distant à insérer des éléments potentiellement dangereux dans le vôtre. Donc, vous leur faites confiance de ne pas vous faire foutre ici. Gardez cela à l'esprit. Cette méthode est simplement plus simple que de manipuler manuellement des filtres.

2
Otto

ATTENTION !!!

Faites toujours la validation des données que vous sauvegardez dans la base de données! Cette réponse ci-dessous suppose que vous validez le contenu de votre message dans la fonction personnalisée que vous avez déclenchée via cron!

Je trouve la solution à ce problème de décapage des tags iframe et object.

AVIS! Mettez ceci uniquement dans le code de fonction de votre plugin qui est exécuté via wp cron. Ne le mettez pas dans votre function.php dans votre template ou ailleurs.

// before saving post
remove_filter('content_save_pre', 'wp_filter_post_kses');
remove_filter('content_filtered_save_pre', 'wp_filter_post_kses');

// save code here

// after saving post
add_filter('content_save_pre', 'wp_filter_post_kses');
add_filter('content_filtered_save_pre', 'wp_filter_post_kses');

IMPORTANT! En utilisant le préfixe content_, nous limitons le processus remove filter -> save our data -> add_filter au contenu et non aux commetns, extraits, etc.

1
Derfder

Après avoir tout essayé, cela a fonctionné pour moi:

global $allowedposttags;
$allowedposttags['div'] = array('align' => array (), 'class' => array (), 'id' => array (), 'dir' => array (), 'lang' => array(), 'style' => array (), 'xml:lang' => array() );
$allowedposttags['iframe'] = array('src' => array () );

https://wordpress.org/support/topic/wp_update_post-strips-css-id-attribute?replies=7

0
atwellpub

Utilisez des shortcodes, par exemple, créez un shortcode iframe, vous pourrez alors:

[iframe]example.com[/iframe]

Voici le code pour implémenter un tel shortcode:

add_shortcode('iframe', array('iframe_shortcode', 'shortcode'));
class iframe_shortcode {
    function shortcode($atts, $content=null) {
          extract(shortcode_atts(array(
               'url'      => '',
               'scrolling'      => 'no',
               'width'      => '100%',
               'height'      => '500',
               'frameborder'      => '0',
               'marginheight'      => '0',
          ), $atts));
          if (empty($url)) return '<!-- Iframe: You did not enter a valid URL -->';
     return '<iframe src="'.$url.'" title="" width="'.$width.'" height="'.$height.'" scrolling="'.$scrolling.'" frameborder="'.$frameborder.'" marginheight="'.$marginheight.'"><a href="'.$url.'" target="_blank">'.$url.'</a></iframe>';
    }
}

Usage:

[iframe url="http://wpsnipp.com" width="100" height="100" scrolling="yes" frameborder="1" marginheight="2"]

La source:

http://wpsnipp.com/index.php/functions-php/iframe-shortcode-for-posts-and-pages/

Si vous avez besoin d'insérer des incorporations d'objet, alors quelque chose s'est mal passé. Utilisez OEmbed ou concevez un shortcode

0
Tom J Nowell