Je me demande comment il est possible pour un bot de publier un commentaire sur une page sans appeler le modèle de commentaires dans le modèle utilisé par la page.
Le seul endroit où j'appelle le modèle de commentaires est celui des blogs, mais les robots ne semblent pas se soucier de poster du spam.
Est-ce que quelqu'un d'autre a ce problème? Merci d'avance!
Pour ajouter un nouveau commentaire, vous n'avez besoin que de quelques champs et d'une méthode POST
.
Dans un formulaire de commentaire typique, les demandes sont soumises à http://www.example.com/
wp-comments-post.php
qui analyse les données $_POST
et les envoie à wp_handle_comment_submission
.
Une méthode POST
varie d'une requête GET
en ce sens que les paramètres sont généralement envoyés de manière non visuelle. Avec GET
, vous pouvez voir www.example.com?foo=bar
, mais dans une méthode POST
, les paramètres sont envoyés en plus de la demande d'URL afin que vous ne voyiez que www.example.com
.
Une autre chose à noter est que l'ID page
/post
peut généralement être vu comme une classe dans la section de corps de la page. <body class="page page-id-1234"
donc pour soumettre un commentaire sur une page, vous n’auriez vraiment besoin que de cet identifiant associé à l’URL wp-comments-post.php
.
Voici un exemple utilisant POSTMAN
pour construire la requête PHP:
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://www.vistex.com/wp-comments-post.php",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"email-notes\"\r\n\r\nemail-notes-here\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"comment_post_ID\"\r\n\r\n134\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"author\"\r\n\r\n4\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"email\"\r\n\r\[email protected]\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"url\"\r\n\r\nhttp://wordpress.stackexchange.com/questions/221084/bots-posting-comments-on-pages\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"comment\"\r\n\r\nspam_from_stackexchange_brandozzzzzzz - http://wordpress.stackexchange.com/users/64789/brandozz - http://wordpress.stackexchange.com/questions/221084/bots-posting-comments-on-pages\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"comment_parent\"\r\n\r\n134\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"_wp_unfiltered_html_comment\"\r\n\r\n_wp_unfiltered_html_comment\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => array(
"cache-control: no-cache",
"content-type: multipart/form-data; boundary=---011000010111000001101001",
"postman-token: c34ed3e0-fcc4-2b4b-75bf-d864135cddde"
),
));
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
Et la même demande dans jQuery:
var form = new FormData();
form.append("email-notes", "email-notes-here");
form.append("comment_post_ID", "134");
form.append("author", "4");
form.append("email", "[email protected]");
form.append("url", "http://wordpress.stackexchange.com/questions/221084/bots-posting-comments-on-pages");
form.append("comment", "spam_from_stackexchange_brandozzzzzzz - http://wordpress.stackexchange.com/users/64789/brandozz - http://wordpress.stackexchange.com/questions/221084/bots-posting-comments-on-pages");
form.append("comment_parent", "134");
form.append("_wp_unfiltered_html_comment", "_wp_unfiltered_html_comment");
var settings = {
"async": true,
"crossDomain": true,
"url": "https://www.vistex.com/wp-comments-post.php",
"method": "POST",
"headers": {
"cache-control": "no-cache",
"postman-token": "a66dc74a-685e-719c-75be-9c81ab69bf5e"
},
"processData": false,
"contentType": false,
"mimeType": "multipart/form-data",
"data": form
}
$.ajax(settings).done(function (response) {
console.log(response);
});
Comme vous pouvez le constater, toutes les données sont supprimées de l'URL et envoyées avec les champs de données. Vous pouvez également voir qu'un WP front-end n'est pas requis pour envoyer la demande de commentaire et que toute langue peut soumettre un commentaire depuis n'importe où. Génial non? :(
Cela étant dit, lorsque j'ai essayé cette méthode sur la page que vous avez décrite, j'ai reçu une réponse:
<html>...
<p>Sorry, comments are closed for this item.</p>
...</html>
C'est parce qu'il suffit de vérifier si la page accepte les commentaires en premier lieu:
if ( ! comments_open( $comment_post_ID ) ) {
Puis jette et erreur si elles ne sont pas ouvertes:
return new WP_Error( 'comment_closed', __( 'Sorry, comments are closed for this item.' ), 403 );
Donc, dans votre cas, il peut y avoir un autre moyen ou une autre chose en cours d'exécution qui déclenche un nouveau commentaire :
$commentdata = compact(
'comment_post_ID',
'comment_author',
'comment_author_email',
'comment_author_url',
'comment_content',
'comment_type',
'comment_parent',
'user_ID'
);
$comment_id = wp_new_comment( wp_slash( $commentdata ) );