Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem poboru danych z URL
Forum PHP.pl > Forum > PHP
Robsonkox
Witam, odswiezam skrypt pod zaaktualizowana wersje aplikacji facebooka, aktualnie v2.8, nie ma zbytnio istotnych zmian miedzy v2.3, na ktorym skrypt latal, zauwazylem, ze na 100% mam polaczenie z baza danych i aktualizacja danych w nim dziala. Problemem jest to, ze podczas dawania zezwolenia na korzystanie aplikacji z danych skrypt nie pobiera lub nie wprowadza danych do bazy danych.

Z tego pliku zauwazylem, ze przerywajac przeniesienie na prawidlowa strone po zatwierdzeniu mozliwosci poboru danych uzytkownika facebook'a wyswietla mi sie blad:

"You may be a victim of CSRF", blad ten jest zapisany w powyzszym pliku w adnotacji iz jest to drugi krok potwierdzania danych:

  1. function fb_connect_flow() {
  2.  
  3. $code = $_REQUEST['code'];
  4.  
  5. //Autentication step 1
  6. if(empty($code)) {
  7. $current_url = $this->currentPageURL();
  8. $_SESSION['ygp_fb_box']['salt'] = md5(uniqid(rand(), TRUE)); // CSRF protection
  9. $dialog_url = 'https://www.facebook.com/dialog/oauth?client_id='.$this->fb_app_id.'&redirect_uri='.urlencode($current_url).'&state='.$_SESSION['ygp_fb_box']['salt'].'&scope='.$this->fb_scope;
  10. echo '<script>window.location="'.$dialog_url.'";</script>';
  11. }
  12.  
  13. //Autentication step 2
  14. else {
  15. if($_SESSION['ygp_fb_box']['salt'] && ($_SESSION['ygp_fb_box']['salt'] === $_GET['state'])) {
  16. $current_url = $this->currentPageURL();
  17.  
  18. unset($_SESSION['ygp_fb_box']['salt']);
  19.  
  20. $token_url = 'https://graph.facebook.com/oauth/access_token?client_id='.$this->fb_app_id.'&redirect_uri='.urlencode($current_url).'&client_secret='.$this->fb_app_secret.'&code='.$_GET['code'];
  21. $data = $this->getDataFromURL($token_url);
  22. $data2 = json_decode($data, true);
  23.  
  24. if(is_array($data2) && $data2['error']['message']!='') {
  25. echo $data2['error']['message'].'<br>';
  26. echo '<a href="'.$current_url.'">Try again</a>';
  27. }
  28. else {
  29. parse_str($data);
  30. $signed_request['access_token'] = $access_token;
  31. if($expires==0 || $expires=='') $signed_request['expires'] = 0;
  32. else $signed_request['expires'] = time() + $expires;
  33.  
  34. $user_data = $this->getUserDataFromApi(array('token'=>$access_token));
  35.  
  36. $user_data['token'] = $signed_request['access_token'];
  37. $user_data['token_expires'] = $signed_request['expires'];
  38.  
  39. $_SESSION['ygp_fb_box']['user'] = $user_data;
  40. //print_r($_SESSION);
  41.  
  42. return 1;
  43. }
  44. }
  45. else {
  46. echo 'You may be a victim of CSRF.<br>';
  47. echo '<a href="'.$this->currentPageURL().'">Try again</a>';
  48. }
  49. }
  50. }


Hosting na ktorym stoi skrypt ma zainstalowane php 5.5, panel ktory wyswietla dane uzytkownika, ktory dal dostep zaktualizowane przez baze danych manualnie wyswietlaja sie bezblednie, wszystkie opcje dotyczace tego wpisu w baze danych da sie z postaci strony edytowac.

  1. //Facebook app settings
  2. //,publish_actions,email,user_birthday,manage_pages,
  3. $GLOBALS['fb_ypbox_path'] = $GLOBALS['app_folder'].'';
  4. $GLOBALS['fb_scope'] = 'publish_actions,email,public_profile';
  5. //$GLOBALS['fb_connect_redirect'] = '';
  6. $GLOBALS['fb_logout_redirect'] = 'konta/logowaniefb.php';
  7. $GLOBALS['fb_sdk_js_callback'] = '';
  8. $GLOBALS['fb_sdk_lang'] = '';

Powyzej sa ustawienia pliku, czyli dane gdzie ma przenosic i jakie dane zbierac od uzytkownika, ktore zapisane sa w pliku konfiguracyjnym

Ponizej plik odpowiedzialny za wybor i wprowadzanie tych informacji do bazy danych

  1. <?php
  2. include('../include/webzone.php');
  3.  
  4. $f1 = new Fb_ypbox();
  5. $result = $f1->fb_connect_flow();
  6.  
  7. //authentication successs
  8. if($result) {
  9.  
  10. $f1 = new Fb_ypbox();
  11. $user_data = $f1->getUserData();
  12.  
  13. if(count($user_data)>0) {
  14.  
  15. $long_lived = $f1->getLongLivedToken();
  16. $token = $long_lived['token'];
  17. $expires = $long_lived['expires'];
  18.  
  19. $users = get_users(array('fb_user_id'=>$user_data['id']));
  20.  
  21. if(count($users)>0) {
  22. $id = $users[0]['id'];
  23. $fb_email = $users[0]['fb_email'];
  24.  
  25. if($fb_email=='') $fb_email = $user_data['email'];
  26.  
  27. $m1 = new MySqlTable();
  28. $sql = "UPDATE ".$GLOBALS['db_table']['users']." SET fb_email='".$m1->escape($fb_email)."',
  29. fb_token='".$m1->escape($token)."', fb_token_expires='".$m1->escape($expires)."'
  30. WHERE id='".$m1->escape($id)."'";
  31. $m1->executeQuery($sql);
  32. }
  33. else {
  34. //Insert user data to the DB
  35. $m1 = new MySqlTable();
  36. $sql = "INSERT INTO ".$GLOBALS['db_table']['users']."
  37. (fb_id, fb_name, fb_email, fb_token, fb_token_expires, fb_birthday, created)
  38. VALUES ('".$m1->escape($user_data['id'])."', '".$m1->escape($user_data['name'])."', '".$m1->escape($user_data['email'])."',
  39. '".$m1->escape($token)."', '".$m1->escape($expires)."',
  40. '".$m1->escape($user_data['birthday'])."', '".date('Y-m-d H:i:s')."')
  41. ";
  42. $m1->executeQuery($sql);
  43.  
  44. //Get settings
  45. $result = get_settings();
  46. for($i=0; $i<count($result); $i++) {
  47. $settings[$result[$i]['meta_key']] = $result[$i]['meta_value'];
  48. }
  49.  
  50. //Autopost status
  51. if($settings['autopost_status']=='on') {
  52. $f1 = new Fb_ypbox();
  53. $settings['autopost_status_message'] = str_replace('{name}', $user_data['name'], $settings['autopost_status_message']);
  54. $result = $f1->updateFacebookStatus(array('fb_id'=>$fb_id, 'message'=>$settings['autopost_status_message'], 'link'=>$settings['autopost_status_link'], 'picture'=>$settings['autopost_status_picture']), $user_data['token']);
  55. }
  56.  
  57. //Autopost email
  58. if($settings['autopost_email']=='on') {
  59. if($user_data['email']!='') {
  60. $settings['autopost_email_message'] = str_replace('{name}', $user_data['name'], $settings['autopost_email_message']);
  61. sendMail($GLOBALS['email_from'], $user_data['email'], $settings['autopost_email_subject'], $settings['autopost_email_message']);
  62. }
  63. }
  64. }
  65. }
  66.  
  67. //redirect
  68. echo '<script>window.location="../";</script>';
  69. }
  70.  
  71. ?>


Wydaje mi sie, ze wszystko jest ok, ale mimo kilku prob dalej uzytkownik, ktory da zezwolenie na pobor danych z jego profilu nie jest zapisywany w bazie danych. Ciezko by bylo pisac podobny skrypt od nowa, dlatego tez prosze o interwencje i pomoc jakichs bardziej doswiadczonych uzytkownikow, chetnie dostarcze wszelkie inne w razie czego informacje lub pliki. Dziekuje i pozdrawiam oraz prosze o wyrozumialosc, gdyz jest to moj pierwszy post na tym forum i mam nadzieje, ze nie ostatni smile.gif
SmokAnalog
Cytat(Robsonkox @ 25.11.2016, 18:00:07 ) *
aktualnie v2.8, nie ma zbytnio istotnych zmian miedzy v2.3

To niestety nie jest prawda. Facebook wprowadza sporo zmian co wersję, a Twój skrypt przeskoczył aż o pięć wersji!

Pogooglaj sobie o tym błędzie, bo jest mnóstwo odpowiedzi w sieci. Nie ma tu co pomagać na szybko, po prostu śledź błędy i je naprawiaj. Przypuszczam, że to nie jedyna rzecz, którą będziesz musiał odświeżyć.
Robsonkox
Owszem bardziej chodzilo mi o dzialanie skryptu, gdyz funkcje ktore ma dzialaja w 95% a te 5% to akurat wlasnie te pobieranie danych lub wstawianie ich do bazy danych. A i uwierz mi nie napisalbym wogole gdyz szkoda mi ludzkiego czasu skoro moge zrobic to sam powiedzmy 2x dluzej. Szukalem ale nie znalazlem odpowiedzi porownujac adres, ktory wywoluje skrypt w celu zdobycia dostepow jest taki sam jaki udostepnia facebook dla aplikacji v2.8, baza danych ma polaczenie i wspolpracuje, no nie wiem w jakiej konkretniej frazie szukac zeby cokolwiek dalo mi wskazowke.
SmokAnalog
Wygooglaj swój błąd, czyli You may be a victim of CSRF.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.