web-dev-qa-db-ja.com

ページにコメントを投稿するボット

ページが利用しているテンプレート内のcommentsテンプレートへの呼び出しがない場合、どのようにしてボットがページにコメントを投稿することができるのでしょうか。

私がコメントテンプレートと呼んでいる唯一の場所は単一のブログ投稿にありますが、ボットはそこにスパムを投稿しても構わないようです。

他に誰かがこの問題を抱えていますか?前もって感謝します!

1
brandozz

新しいコメントを追加するには、ほんの少しのフィールドとPOSTメソッドが必要です。

典型的なコメントフォームでは、リクエストはhttp://www.example.com/wp-comments-post.php に送信され、$_POSTデータを解析して wp_handle_comment_submissionに送ります。 .

POSTメソッドはGETリクエストとは異なり、通常、paramsは非視覚的な方法で送信されます。 GETではwww.example.com?foo=barが表示されることがありますが、POSTメソッドではURL要求に加えてparamsが送信されるため、視覚的にはwww.example.comのみが表示されます。

もう1つ注意すべきことは、page/post IDは通常、ページの本体セクションでクラスとして見なすことができるということです。 <body class="page page-id-1234"なので、ページにコメントを投稿するには、そのIDとwp-comments-post.phpのURLが必要です。

PHPのリクエストを構築するために POSTMAN を使った例です:

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

そして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);
});

ご覧のとおり、すべてのデータがURLから削除され、データフィールドと共に送信されます。また、WPフロントエンドはコメント要求を送信するために必要ではなく、どの言語でもどこからでもコメントを送信できることがわかります。素晴らしいね。 :(

そうは言っても、私があなたが説明したページでこの方法を試したとき、私は返答を得ました:

<html>...

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

...</html>

それは、ページ が最初にコメント を受け入れるかどうかを確認するための単純なチェックだからです。

if ( ! comments_open( $comment_post_ID ) ) {

それからそれらが開いていないならば、投げて、エラーを起こします:

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

だから、あなたのケースでは、 新しいコメント を引き起こす何か他の方法が実行されているかもしれません:

$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