Отправить пароль формы WordPress программно - PullRequest
3 голосов
/ 12 апреля 2010

Как я могу позволить пользователю получить доступ к защищенной странице WordPress с помощью URL-адреса, который отправит пароль в приведенной ниже форме?

Я хочу, чтобы пользователь мог получить доступ к защищенной паролем странице WordPress без необходимости вводить пароль, поэтому при переходе на страницу пароль передается POST-URL при загрузке страницы.

Это не предназначено для обеспечения безопасности в любом отношении; Мне нужно жестко закодировать пароль в URL и PHP. Это просто для простоты для пользователя.

Редактировать 19.04.10: В соответствии с приведенными ниже ответами можно напрямую установить cookie-файл, чтобы пользователям не приходилось вводить пароль. Впускать поисковых роботов лучше всего, обнаружив пользовательский агент и перенаправив, так как боты не будут иметь дело с куки.

Это форма (код ядра WordPress):

<form action="http://mydomain.com/wp-pass.php" method="post">

Password: <input name="post_password" type="password" size="20" />

<input type="submit" name="Submit" value="Submit" /></form>

Это wp-pass.php (код ядра WordPress):

<?php
require( dirname(__FILE__) . '/wp-load.php');

if ( get_magic_quotes_gpc() )
    $_POST['post_password'] = stripslashes($_POST['post_password']);

setcookie('wp-postpass_' . COOKIEHASH, $_POST['post_password'], time() + 864000, COOKIEPATH);

wp_safe_redirect(wp_get_referer());
?>

Ответы [ 6 ]

4 голосов
/ 14 апреля 2010

Вместо того, чтобы продолжать добавлять в предыдущем ответе, я попытаюсь объяснить проблему немного здесь.

Способ работы WordPress:

  1. Исходная страница имеет форму, которая отправляется на wp-pass.php.
  2. wp-pass.php принимает при условии пароль, помещает его в файл cookie и перенаправляет пользователя обратно исходная страница.
  3. Исходная страница проверяет куки и если пароль правильный, то покажет страницу.

Проблема в том, что поисковые системы не принимают куки. Итак, у вас есть два варианта:

  1. Измените код, используемый Wordpress для содержимого с паролем, на такой, который также принимает $_GET переменные.
  2. Используйте cURL для отправки куки, используя заголовки, которые могут использовать поисковые системы отдельной страницы.

Я бы хотел остановиться на последнем ответе, если хотите, но мне интересно; если вы собираетесь предоставить поисковым системам доступ к пародированному контенту, у кого-то будет доступ. Почему бы просто не удалить пароль?

1 голос
/ 20 апреля 2010

В вашем комментарии в этот ответ :

На самом деле, теперь я думаю, что хочу поиск двигатели для индексации страницы, но потом non-googlebot трафик с этого поиска ссылка перенаправляется на вводная страница, а не пароль защищенная страница. Я мог бы использовать PHP для выберите трафик googlebot, чтобы увидеть страница (и индексировать ее), но не Googlebot трафик может получить http перенаправление вступительная страница, где содержание пользователь переключается на ajax после того, как они видят вступление?

Остерегайтесь этой практики. Поисковые системы могут интерпретировать это как Cloaking .

Cloaking - поисковая система в черной шляпе техника оптимизации (SEO), в которой содержание, представленное для поиска паук двигателя отличается от этого представлены в браузере пользователя.

Я не говорю, что они автоматически узнают, что вы делаете это, возможно, они никогда этого не сделают. Но интересно знать риски.

Я бы хотел знать ваши намерения относительно этой практики, чтобы узнать, есть ли другие альтернативы, которые соответствуют вашим потребностям.

1 голос
/ 12 апреля 2010

Если вы хотите сделать это без редактирования ядра WP, вы можете использовать cURL для имитации переменных POST следующим образом:

$ch = curl_init("http://mydomain.com/wp-pass.php");
curl_setopt($ch, CURLOPT_POSTFIELDS,  "post_password=mypassword&Submit=Submit");  
curl_setopt($ch, CURLOPT_HEADER, 0);  
curl_setopt($ch, CURLOPT_POST, 1);  
curl_exec($ch);  
curl_close($ch);
1 голос
/ 12 апреля 2010

Измените $ _POST на $ _REQUEST везде в wp-pass.php.

Этот код просматривает только переменные POST, а не переменные GET в URL. Глобал REQUEST содержит переменные POST и GET, что вам и нужно.

Возможно, есть лучший способ, но я не знаю WordPress.

EDIT

Проблема в том, что параметры находятся в массиве GET, а не в массиве POST. Так что использование обычной ссылки с параметрами не сработает. Вы можете использовать форму со скрытым полем. При желании вы можете оформить кнопку отправки, чтобы она выглядела как ссылка.

<form action="http://mydomain.com/wp-pass.php" method="post">
<input name="post_password" type="hidden" value="totally insecure password here" />
<input type="submit" name="Submit" value="Click here to enter your account" />
</form>
0 голосов
/ 16 апреля 2010

Сначала я не знаю, как поисковые системы реагируют на javascript, но может ли что-то подобное работать?

Звоните mydomain.com/wp-pass.php?post_password=mypassword&Submit=Submit

Добавьте эти 2 функции js:

function gup( name ){  
 name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");  
 var regexS = "[\\?&]"+name+"=([^&#]*)";  var regex = new RegExp( regexS );  
 var results = regex.exec( window.location.href );  
 if( results == null )    
  return "";  
 else    
  return results[1];
}

function setPassword()
{

 var password = gup('post_password');
 var passField = document.getElementByName('post_password');
 var buttonSubmit = document.getElementByName('Submit');

 if(password != "")
 {
  passField.value = password;
  buttonSubmit.Click();
 }

}

Добавить к тегу body, OnLoad="setPassword();"

Я не знаю, как роботы реагируют на это ...

0 голосов
/ 14 апреля 2010

Я думаю, что предыдущие ответы более запутанны, чем они должны быть.

Если все могут прочитать страницу, не защищайте ее паролем. Это, безусловно, самое изящное решение. Для чего нужен пароль, если каждый и его собака могут прочитать страницу?

Если вы действительно чувствуете необходимость сделать ссылку, которая использует POST, вот способ сделать это:

(Извините, если этот фон избыточен, но, похоже, из вашего вопроса стоит упомянуть: HTTP поддерживает различные методы для URL; POST включен, GET - другой. Когда вы обычно выбираете URL, как в случае с элемент, вы используете метод GET.)

Я согласен с тем, что изменение основных файлов для замены $ _POST на $ _REQUEST не требуется. То, что вы хотите, это элемент ссылки, который использует метод POST. Для этого создайте простую форму, например, так:

<form action="your url" method="POST">
    <input type="hidden" value="my_password" name="password"/>
    <input type="submit" value="Submit" name="submit">
</form>

Вы можете добавить style = "border: 0; background: transparent;" и так далее ко второму входу, чтобы он выглядел как обычная ссылка, если хотите. Это немного громоздко, но отлично работает, когда вам нужно отправить ссылку, используя метод POST.

PS. Использование Wireshark для проверки POST-переменных - большая трата времени. Установите расширение Firebug FF и используйте сетевую панель. Это значительно ускорит разработку подобных вещей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...