wake-up-neo.net

Bots, die Kommentare auf Seiten veröffentlichen

Ich frage mich, wie es einem Bot möglich ist, einen Kommentar auf einer Seite zu posten, auf der die Kommentarvorlage in der von der Seite verwendeten Vorlage nicht aufgerufen wird.

Der einzige Ort, an dem ich die Kommentar-Vorlage anrufe, sind einzelne Blog-Posts, aber die Bots scheinen sich nicht darum zu kümmern, dort Spam zu posten.

Hat jemand anderes dieses Problem? Danke im Voraus!

1
brandozz

Um einen neuen Kommentar hinzuzufügen, benötigen Sie nur ein paar Felder und eine POST-Methode.

In einem typischen Kommentarformular werden Anforderungen an http://www.example.com/wp-comments-post.php gesendet, wodurch die $_POST-Daten analysiert und an wp_handle_comment_submission gesendet werden. .

Eine POST-Methode unterscheidet sich von einer GET-Anforderung darin, dass Parameter normalerweise nicht visuell gesendet werden. Bei GET wird möglicherweise www.example.com?foo=bar angezeigt, bei einer POST-Methode werden die Parameter jedoch zusätzlich zur URL-Anforderung gesendet, sodass nur www.example.com angezeigt wird.

Außerdem ist zu beachten, dass die page/post ID normalerweise als Klasse im Hauptteil der Seite angezeigt wird. <body class="page page-id-1234" Um also einen Kommentar zu einer Seite zu senden, müssten Sie wirklich nur diese ID zusammen mit der wp-comments-post.php-URL angeben.

In diesem Beispiel wird POSTMAN verwendet, um die Anforderung für PHP zu erstellen:

<?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;
}

Und die gleiche Anfrage in 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);
});

Wie Sie sehen, werden alle Daten aus der URL entfernt und zusammen mit den Datenfeldern gesendet. Sie können auch feststellen, dass zum Senden der Kommentaranforderung kein WP Front-End erforderlich ist und dass jede Sprache von überall aus einen Kommentar senden kann. Genial, oder? :(

Davon abgesehen erhielt ich eine Antwort, als ich diese Methode auf der von Ihnen beschriebenen Seite ausprobierte:

<html>...

<p>Sorry, comments are closed for this item.</p>

...</html>

Das liegt daran, dass die einfache Überprüfung, ob die Seite Kommentare akzeptiert, an erster Stelle lautet:

if ( ! comments_open( $comment_post_ID ) ) {

Dann wirft und Fehler, wenn sie nicht geöffnet sind:

return new WP_Error( 'comment_closed', __( 'Sorry, comments are closed for this item.' ), 403 );

In Ihrem Fall könnte es also einen anderen Weg geben oder es könnte etwas anderes laufen, das einen neuen Kommentar auslöst :

$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 ) );
3
jgraup