2015-08-15 5 views
0

Я пытаюсь войти на сайт с помощью curl, однако я не могу заставить его работать.
Это код, который я использую.логин с curl php

Сначала я получаю токен csrf с сайта, чтобы убедиться, что он соответствует.
Но результат, который я получаю, всегда является формой входа в систему.

$url="http://www.example.com/accounts/login"; 
$postinfo = 'csrfmiddlewaretoken='.$key.'&[email protected]&password=mypassword'; 

$cookie = "cookies.txt"; 

$ch = curl_init(); 
curl_setopt ($ch, CURLOPT_URL, $url); 
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, 1); 
curl_setopt ($ch, CURLOPT_POSTFIELDS, $postinfo); 
curl_setopt ($ch, CURLOPT_COOKIEJAR, $cookie); 
curl_setopt ($ch, CURLOPT_COOKIEFILE, $cookie); 
curl_setopt ($ch, CURLOPT_POST, 1); 
$result = curl_exec($ch); 

return $result; 

Кто-нибудь знает, почему я не могу войти?

Поля формы верны, а также при попытке входа в систему файл cookies.txt изменился.

+0

Добавьте сообщение об ошибках в начало вашего файла (ов) сразу после открытия PHP-тега , например '

+0

@ Fred-ii- Я не вижу никаких ошибок, но просто чтобы сообщить вам, что я использую laravel 5 – Szenis

+0

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

ответ

1

Наиболее вероятные причины:

  1. Вы Реинициализация завитка после получения маркеров CRSF, поэтому он становится недействительным для последующего запроса, потому что это совершенно другая сессия, насколько сайт.

  2. Ваш $postinfo является строкой, так что вам нужно urlencode() значения вручную (CURLOPT_POSTFIELD S также принимают ассоциативные массивы, в этом случае вам не нужно делать это).

+0

Я уже пробовал с urlencode, а также с массивом, но это ничего не изменило. Однако я делаю 2 запросов на завивки, может быть, это проблема? Если да, то как я могу получить токен csrf? – Szenis

+0

Вам нужно либо «urlencode()« токен, имя пользователя и пароль, либо использовать массив. То, как это происходит (с '@', который явно не просочился) не будет летать. Количество запросов не имеет значения, если вы не вызываете 'curl_init()' между ними. И не забудьте установить 'COOKIEFILE' и' COOKIEJAR' перед первым GET, чтобы завиток получал куки сессии и повторно отправлял их с последующим POST. – lafor

+0

Да, это действительно был токен csrf. – Szenis

1

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

Убедитесь, что файл cookie.txt доступен для записи. Поместите Cookies.txt в отдельной папке, где-то за пределами WWW корня и изменить значение $ печенья с абсолютным путем:

$cookie = "/path/to/writable/folder/cookies.txt"; 

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

Посмотрите, что URL-адрес обычной формы входа в систему человека, например. http://www.example.com/accounts/loginform.html - или URL, используемый для получения маркера и добавить, что в качестве реферера:

curl_setopt($ch, CURLOPT_REFERER, 'http://www.example.com/accounts/loginform.html'); 
curl_setopt($ch, CURLOPT_AUTOREFERER, true); 

установить некоторые опции, которые делают вас появляются еще более человек:

curl_setopt($ch, CURLINFO_HEADER_OUT, 1); 
curl_setopt($ch, CURLOPT_ENCODING, "gzip,deflate,sdch"); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
     'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 
     'Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3', 
     'Accept-Language:en-US,en;q=0.5', 
     'Origin: http://www.example.com', 
     'Cache-Control:no-cache', 
     'Connection:keep-alive', 
     'Pragma:no-cache', 
     'Expect:' 
    )); 

выше массива Пример заголовка работал в моем частный случай. В вашем случае могут быть другие заголовки, отправленные при входе в систему. Попробуйте войти в систему один раз с помощью браузера, а в инструментах разработчика браузера проверьте заголовки запросов, которые отправляются вместе и копируют/вставляют их. Также дважды отметьте, что размещено для скрытых значений (в моем случае необходимо добавить «& __VIEWSTATE = somereallylongIIScode» в строку CURLOPT_POSTFIELDS).

+0

Спасибо за вашу помощь, правильный URL был немного другим, но я думал, что это не '' '' 'http: // www.example.com/accounts/loginform'''', а' '' ''http : // www.example.com/accounts/loginform/'' '' Никогда бы не подумал, что это будет частью проблемы. – Szenis

+0

Отличный, счастливый, что вы его заработали .. Мне нужно было выше, чтобы заставить мое работать :-) –

Смежные вопросы