PHP, WordPress에 로그인하기 위한 cURL 게시
링크 클릭으로 자동 로그인이 필요한 클라이언트의 프로젝트를 진행하고 있습니다.
핸드쉐이크 페이지를 사용하여 다음 코드를 사용하고 있습니다.
$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;
이거 잘 돼.로그인이 잘 됩니다.
문제는 제가 WordPress 키를 URL에서 제외했다고 믿는다는 것입니다.
구체적으로 말하면, 핸드쉐이크 페이지(로그인)는 「블로그」디렉토리에 있고, 워드프레스 애플리케이션은 「블로그」디렉토리에 있습니다.브라우저의 URL에는 다음과 같습니다...blog/handshake.php
단, 브라우저 창에 WordPress의 Admin 섹션이 있습니다.WordPress Admin 링크가 정상적으로 기능하지 않게 된 이유는 URL이../blog
디렉토리(디렉토리)가 필요한 경우..blog/wordpress/wp-admin
디렉토리로 이동합니다.
브라우저의 URL이 실제 페이지를 반영하도록 cURL에 방법이 있나요?
대신 FSockOPen을 사용해야 하나요?
Kalium은 이 점을 잘 알고 있습니다.WordPress 인터페이스의 패스는 상대적입니다.이렇게 하면 관리 인터페이스가 정상적으로 동작하지 않습니다.
당신의 접근방식은 몇 가지 점에서 염려가 되기 때문에 몇 가지 간단한 추천을 하고 싶습니다.
먼저, 이 장치를 제거할 수 있는 방법을 찾겠습니다.$username
그리고.$password
변수가 하드 코딩되지 않도록 합니다.예를 들어 관리 인터페이스를 통해 패스워드를 갱신하면 코드 내의 하드 코드 값이 올바르지 않게 되어 「자동 로그인」이 실패합니다.게다가 누군가가 사이트를 구성하고 접속할 수 있는 경우handshake.php
블로그의 사용자 이름과 패스워드를 취득했습니다.
WordPress 설치는 작성한 핸드쉐이크 스크립트와 동일한 서버에 있는 것처럼 보입니다./blog
는 (샘플 코드에서) 상대적입니다.따라서 부모 어플리케이션 로그인 시 검증 대상 세션을 모방하는 것이 좋습니다.과거에 몇 번인가 해 본 적이 있는데, 자세한 것은 기억나지 않습니다.예를 들어 로그인 스크립트는 로그인 자격 정보뿐만 아니라 WordPress 인증에 필요한 세션 키도 설정합니다.
이 과정에는 WordPress의 많은 코드를 파헤치는 것이 포함되지만, 그것이 오픈 소스의 장점입니다!cURL 및 하드 코딩 값을 사용하는 대신 WordPress의 인증 메커니즘을 응용 프로그램의 로그인 메커니즘에 간단히 통합해 보십시오.먼저, 그 출처를 조사하겠습니다.wp-login.php
리고고거거거거거
다른 모든 것이 실패하여 세션 인증 메커니즘을 WordPress의 인증 메커니즘과 메쉬하지 않기로 결정하면 다음과 같은 코드 변경으로 문제를 즉시 해결할 수 있습니다.
먼저 다음 curl_opt를 추가합니다.
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie); // Enables session support
그런 다음 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();
따라서 이 그다지 이상적인 솔루션에서는 cURL을 사용하여 사용자를 인증하고 관리 인터페이스를 현재 페이지로 하이잭하는 것이 아니라 일반 관리 인터페이스로 수정합니다.
도움이 됐으면 좋겠네요!도움이 더 필요한 경우/해결 방법이 확실하지 않은 경우 알려 주십시오.
다음은 나에게 효과가 있었던 코드입니다.
중요한 변경 사항은 게시 문자열에서 "testcookie"라는 매개 변수를 삭제했다는 것입니다.
주의: 아래 코드에 "mywordpress" 대신 웹 사이트를 추가하고 사용자 이름과 비밀번호를 입력합니다.
$curl = curl_init();
//---------------- generic cURL settings start ----------------
$header = array(
"Referer: https://mywordpress/wp-login.php",
"Origin: https://mywordpress",
"Content-Type: application/x-www-form-urlencoded",
"Cache-Control: no-cache",
"Pragma: no-cache",
"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.5 Safari/605.1.15"
);
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.5 Safari/605.1.15');
curl_setopt($curl, CURLOPT_AUTOREFERER, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curl, CURLOPT_COOKIESESSION, true);
curl_setopt($curl, CURLOPT_COOKIEFILE, 'cookies.txt');
curl_setopt($curl, CURLOPT_COOKIEJAR, 'cookies.txt');
//---------------- generic cURL settings end ----------------
$url = 'https://mywordpress/wp-login.php';
curl_setopt($curl, CURLOPT_URL, $url);
$post = 'log=username&pwd=password&wp-submit=Log+In&redirect_to=https%3A%2F% mywordpress%2Fwp-admin%2F';
curl_setopt($curl, CURLOPT_POST, TRUE);
curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
$output = curl_exec($curl);
curl_close ($curl);
echo ($output)
HTML 소스를 확인합니다.WP의 연계는 상대적인 것 같습니다.그러나 이 프로세스를 기존보다 더 복잡하게 만드는 것이 아니라 로그인을 수행하여 필요한 쿠키를 사용자에게 전달하고 리디렉션할 것을 권장합니다.
그렇지 않으면 프록시를 코드화하는 거야, 하나하나.
스크립트가 한 번의 실행으로 필요한 모든 기능을 수행하지 않는 경우 쿠키 값을 해석하여 파일에 저장한 후 다음 실행 시 다시 전송해야 할 수 있습니다.CURLOPT_COOKIFILE 옵션을 확인합니다.
Zend Framework의 쿠키 클래스를 사용하여 쿠키를 관리합니다.과거 cURL을 사용하여 웹 사이트의 보안 섹션을 크롤링할 때 사용한 적이 있습니다.
언급URL : https://stackoverflow.com/questions/728274/php-curl-post-to-login-to-wordpress
'source' 카테고리의 다른 글
AngularJS에서 XML 서비스를 처리하는 방법 (0) | 2023.03.05 |
---|---|
react에서 함수를 트리거하기 전에 setState가 완료될 때까지 어떻게 기다려야 합니까? (0) | 2023.03.05 |
flutter에 있는 json의 객체 목록을 역직렬화하는 방법 (0) | 2023.02.28 |
React는 라벨 요소의 'for' 속성을 무시합니다. (0) | 2023.02.28 |
Angular JS : 공장 출하시 $http 서비스 (0) | 2023.02.28 |