2009-04-08 17 views
13

Estoy trabajando en un proyecto para un cliente que necesita un inicio de sesión automático desde un enlace.PHP, cURL publicar para iniciar sesión en WordPress

estoy usando una página de apretón de manos para hacer esto con el siguiente código:

$username = "admin"; 
$password = "blog"; 
$url = "http://wordpressblogURL/"; 
$cookie = "cookie.txt"; 

$postdata = "log=" . $username . "&pwd=" . $password . "&wp-submit=Log%20In&redirect_to=" . $url . "blog/wordpress/wp-admin/&testcookie=1"; 
$ch = curl_init(); 
curl_setopt ($ch, CURLOPT_URL, $url . "blog/wordpress/wp-login.php"); 

curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6"); 
curl_setopt ($ch, CURLOPT_TIMEOUT, 60); 
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 0); 
curl_setopt ($ch, CURLOPT_COOKIEJAR, $cookie); 
curl_setopt ($ch, CURLOPT_REFERER, $url . "blog/wordpress/wp-login.php"); 

curl_setopt ($ch, CURLOPT_POSTFIELDS, $postdata); 
curl_setopt ($ch, CURLOPT_POST, 1); 
$result = curl_exec ($ch); 
curl_close($ch); 
echo $result; 

exit; 

Esto funciona bien. Me registra en grande.

El problema es que creo que WordPress saca las llaves de la URL.

Para completar, mi página de saludo (que me registra) está en el directorio "blog" y mi aplicación WordPress está en el directorio "wordpress" que se encuentra dentro del directorio "blog". La URL en el navegador dice ..blog/handshake.php. Sin embargo, tiene la sección Admin de WordPress en la ventana del navegador. Los enlaces de WordPress Admin ahora no funcionan correctamente, porque la URL está en el directorio ../blog cuando debe estar en el directorio ..blog/wordpress/wp-admin.

¿Hay alguna manera en cURL de que la URL en el navegador refleje la página real?

¿Debo usar FSockOPen?

Respuesta

11

Kalium tiene este derecho: las rutas en la interfaz de WordPress son relativas, lo que hace que la interfaz de administración no funcione correctamente cuando se accede de esta manera.

Su enfoque es preocupante de varias maneras, por lo que me gustaría hacer algunas recomendaciones rápidas.

En primer lugar, trataría de encontrar una forma de eliminar las variables $username y $password que no están codificadas. Piense en lo fácil que es romper esto: si la contraseña se actualiza a través de la interfaz de administración, por ejemplo, el valor codificado en su código ya no será correcto y su "inicio de sesión automático" fallará. Además, si alguien de alguna manera comprende el sitio y obtiene acceso a handshake.php, bueno, ahora tienen el nombre de usuario y la contraseña para tu blog.

Parece que su instalación de WordPress descansa en el mismo servidor que el script de handshake que ha escrito, dado que la ruta a /blog es relativa (en su código de muestra). En consecuencia, sugiero tratar de imitar la sesión que validan en el inicio de sesión de sus aplicaciones principales. He hecho esto varias veces en el pasado, simplemente no puedo recordar los detalles. Por lo tanto, por ejemplo, su secuencia de comandos de inicio de sesión no solo configuraría sus credenciales de inicio de sesión, sino que también configuraría las claves de sesión requeridas para la autenticación de WordPress.

Este proceso implicará excavar mucho del código de WordPress, ¡pero esa es la belleza del código abierto! En lugar de usar cURL y valores de codificación, intente simplemente integrar el mecanismo de autenticación de WordPress en el mecanismo de inicio de sesión de su aplicación. Comenzaría mirando la fuente para wp-login.php y yendo desde allí.

Si todo lo demás falla y está decidido a no intentar engranar su mecanismo de autenticación de sesión con el de WordPress, entonces podría solucionar su problema inmediatamente (sin reparar los aspectos más preocupantes de su enfoque) con estos cambios. código:

En primer lugar, añadir el siguiente curl_opt:

curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie); // Enables session support 

A continuación, agregar este después de cerrar el manejador cURL:

curl_close($ch); 
// Instead of echoing the result, redirect to the administration interface, now that the valid, authenticated session has been established 
header('location: blog/wordpress/wp-admin/'); 
die(); 

Por lo tanto, en esta solución menos que ideal, utilizaría cURL para autenticar al usuario y, en lugar de intentar secuestrar la interfaz de administración en esa página actual, redirigirlos a la interfaz de administración habitual.

Espero que esto ayude! Avíseme si necesita más ayuda/la solución no está clara.

1

Compruebe la fuente HTML. Parece que los enlaces de WP pueden ser relativos. Sin embargo, en lugar de hacer este proceso aún más complicado de lo que ya es, le sugiero que realice el inicio de sesión, entregue al usuario las cookies que sean necesarias y redirijalas.

De lo contrario, está codificando un proxy, pieza por pieza.

+0

Buena idea, pero eso supone que el script de inicio de sesión y la instalación de wordpress están en el mismo dominio; de lo contrario, no hay forma de configurar la cookie. – Eli

+0

Si tiene suficiente acceso, configure un subdominio del dominio wordpress y úselo para establecer cookies según sea necesario. Es algo así como un truco, pero aún mejor que crear un proxy de manera fragmentada. – Kalium

1

Si su secuencia de comandos no realiza todas las funciones que necesita en una sola ejecución, es posible que necesite analizar los valores de la cookie, almacenarlos en un archivo y luego volver a enviarlos en la próxima ejecución. Mira la opción CURLOPT_COOKIEFILE.

0

Utilice la clase Zend Framework's Cookies para gestionarlos por usted. Lo he usado en el pasado para rastrear secciones seguras de un sitio web usando cURL.

Cuestiones relacionadas