Michael2318 jest na Pecetowiczu
Aby wyświetlić pełny profil i nawiązać kontakt z Michael2318, zaloguj się lub utwórz konto.
Michael2318
Użytkownik-
Postów
187 -
Dołączył
-
Ostatnia wizyta
Informacje
-
Imię
Michael
- Miejscowość
Dane kontaktowe
Ostatnie wizyty
2 034 wyświetleń profilu
-
User 11
-
Chanan
-
Kamil Stępień
-
Lord
-
H4CK3R
Biogram
Zainteresowania
Siłownia / Informatyka (HTML, CSS, PHP, MySQL) / Język Angielski
Osiągnięcia Michael2318
-
[PRZEMO] Facebook Connect - Logowanie na forum za pomocą Facebooka
Michael2318 odpowiedział(a) na Michael2318 temat w phpBB2 modified by Przemo
No nie zwykły bo buttony udostępnia już facebook razem z API, które powoduje odpowiednie przekierowania na facebook w celu autoryzacji itp. https://developers.facebook.com/docs/plugins/login-button?locale=pl_PL -
[PRZEMO] Facebook Connect - Logowanie na forum za pomocą Facebooka
Michael2318 opublikował(a) temat w phpBB2 modified by Przemo
Cześć! Planuję napisać (a w sumie już częściowo napisałem) logowanie za pomocą facebooka (Facebook Connect - Wikipedia) pod skrypt Przema. Nigdy jednak nie korzystałem z tego rozwiązania i chciałbym prosić tutejszych użytkowników o jakieś sugestie, jak mod mniej więcej powinien działać, jakie opcje powinien posiadać. To co mam teraz - button "Zaloguj przez Facebook" znajduje się pod formularzem do logowania na forum, po jego kliknięciu następuje: a) logowanie do forum, jeśli skrypt wykryje, że ID usera z Facebooka znajduje się już w bazie i jest przypisane do jakiegoś usera (wtedy na konto tego usera skrypt zaloguje gościa), b) logowanie na forum, jeśli skrypt nie znajdzie przypisanego ID z FB do żadnego usera w bazie, natomiast znajdzie usera, który jest zarejestrowany na podany adres e-mail z facebooka. Wtedy automatycznie zostanie też zaktualizowane ID z FB dla tego usera, tak aby przy ponownym logowaniu user został zalogowany w taki sposób jak opisano w podpunkcie powyższym, c) zarejestrowanie usera na forum, w przypadku gdy w bazie nie zostanie odnalezione ani ID z FB, ani adres e-mail przypisany do tego konta na FB. Przy rejestracji skrypt uzupełnia takie informacje: - avatar (profilówka z FB), - miejsce zamieszkania, - wiek, - adres e-mail, - płeć. Nazwa użytkownika tworzona jest w ten sposób: IMIĘ_NAZWISKO_ID przy czym, jeśli chodzi o ID to będzie to to ID z forum. Jeśli imię i nazwisko będzie dłuższe niż 22 znaki to skrypt automatycznie to utnie. Tutaj tak musi być, ponieważ skrypt dopuszcza max. 25 znaków w nicku, a jak wiadomo, niektórzy na FB podają sobie teraz dwa imiona + nazwisko i inne paści co w efekcie może dać więcej niż 25 znaków i wtedy będzie problem. Hasło generowane jest automatycznie przez skrypt i właśnie tutaj mnie zastanawia jak to zrobić, aby user, który się zalogował za pośrednictwem FB miał też dostęp do tego konta na forum i mógł się na nie logować w standardowy sposób, za pośrednictwem loginu i hasła. Obecnie rozwiązałem to tak, że na jego adres e-mail jest wysyłany e-mail powitalny, który zawiera zarówno nick jak i hasło. Oczywiście to logowanie dotyczy tylko podczas ogólnego logowania się na forum, przy logowaniu się do PA ta opcja logowania z FB jest już ukryta. Myślicie, że takie rozwiązanie jest ok? Co byście proponowali ew. dodać do skryptu (również od strony PA) Dzięki. -
Includowanie pliku z innej strony
Michael2318 odpowiedział(a) na ulung temat w Programowanie i tworzenie stron
Z innej strony to co najwyżej możesz wczytać zawartość pliku w ten sposób: <?php $value = file_get_contents('http://strona.pl/'); echo $value; >[/code] ew. można to samo jeszcze zrobić curl'em. -
[Pobierz] [Funkcja] data przyjazna użytkownikom
Michael2318 opublikował(a) temat w Gotowe rozwiązania
Nazwa: data przyjazna użytkownikom Autor: Michael2318 Tematyka: - Screen/Live Demo: Download: Dla własnych potrzeb, napisałem funkcję, która zamieni sztywne daty, typu: YYYY-mm-dd, H:m:i na coś ciekawszego. Funkcja zamienia daty na poniższe wzorce: DLA DAT PRZESZŁYCH - minutę temu (jeśli czas jest krótszy niż 60 sekund), - X minut temu (max. 59 minut temu), - Dzisiaj, 20:59 (jeśli czas jest dłuższy niż 60 minut), - Wczoraj, 20:59 (jeśli zmienił się dzień), - Sobota, 20:59 (dla dat starszych niż ww. 'wczoraj', przypisywane są dni tygodnia, max. 6 dni do tyłu), - 2013-02-03, 01:06:41 (dla dat starszych bądź równych tydzień). DLA DAT PRZYSZŁYCH: - Za minutę (jeśli czas do wydarzenia jest krótszy niż 60 sekund), - Za X minut (max. 59 minut), - Dzisiaj, 20:59 (jeśli czas do wydarzenia jest dłuższy niż 60 minut), - Jutro, 20:59 (jeśli do czasu wydarzenia nastąpi zmiana dni), - Sobota, 20:59 (dla dat bardziej odległych niż ww. 'jutro', przypisywane są dni tygodnia, max. 6 dni do przodu), - 2013-02-03, 01:06:41 (dla dat równych bądź odległych od tygodnia [7 dni]). Kod funkcji: function create_friendly_date($timestamp) { /* langs past */ $lang['Minute_Ago'] = 'Minutę temu'; $lang['Minutes_Ago_2_4'] = '%s minuty temu'; $lang['Minutes_Ago_5_59'] = '%s minut temu'; $lang['Today'] = 'Dzisiaj, %s'; $lang['Yesterday'] = 'Wczoraj, %s'; $lang['Mon'] = 'Poniedziałek, %s'; $lang['Tue'] = 'Wtorek, %s'; $lang['Wed'] = 'Środa, %s'; $lang['Thu'] = 'Czwartek, %s'; $lang['Fri'] = 'Piątek, %s'; $lang['Sat'] = 'Sobota, %s'; $lang['Sun'] = 'Niedziela, %s'; /* langs future */ $lang['For_Minute'] = 'Za minutę'; $lang['For_Minutes_2_4'] = 'Za %s minuty'; $lang['For_Minutes_5_59'] = 'Za %s minut'; $lang['Tomorow'] = 'Jutro, %s'; $lang['Now'] = 'W tym momencie'; // można zmienić np. na 'Teraz' $timestamp = intval($timestamp); $now = time(); $day_time = floor($timestamp/86400); $timedate = date("H:i", $timestamp); $day_now = floor($now/86400); $same_day = ($day_time == $day_now) TRUE : FALSE; if ( $timestamp < 1 ) { return FALSE; } $past_or_future = ($now > $timestamp) TRUE : FALSE; if ( $now == $timestamp ) { return $lang['Now']; } else if ( $past_or_future ) { $maths = $now - $timestamp; $day_before = $day_now-$day_time; if ( $same_day && $maths <= 60 ) { return $lang['Minute_Ago']; } else if ( $same_day && $maths > 60 && $maths <= 240 ) { $ret = ceil($maths/60); return sprintf($lang['Minutes_Ago_2_4'], $ret); } else if ( $same_day && $maths > 240 && $maths <= 3540 ) { $ret = ceil($maths/60); if ( substr($ret, 0, 1) > 1 && substr($ret, 1, 1) > 1 && substr($ret, 1, 1) < 5 ) { return sprintf($lang['Minutes_Ago_2_4'], $ret); } else { return sprintf($lang['Minutes_Ago_5_59'], $ret); } } else if ( $same_day && $maths > 3540 ) { return sprintf($lang['Today'], $timedate); } else if ( !$same_day && $day_before == 1 ) { return sprintf($lang['Yesterday'], $timedate); } else if ( !$same_day && $day_before > 1 && $day_before < 7 ) { if ( $day_before == 2 ) { return sprintf($lang[date("D", ($now-172800))], $timedate); } else if ( $day_before == 3 ) { return sprintf($lang[date("D", ($now-259200))], $timedate); } else if ( $day_before == 4 ) { return sprintf($lang[date("D", ($now-345600))], $timedate); } else if ( $day_before == 5 ) { return sprintf($lang[date("D", ($now-432000))], $timedate); } else if ( $day_before == 6 ) { return sprintf($lang[date("D", ($now-518400))], $timedate); } } else { return date("Y-m-d, H:i", $timestamp); } } else { $maths = $timestamp - $now; $day_after = $day_time-$day_now; if ( $same_day && $maths <= 60 ) { return $lang['For_Minute']; } else if ( $same_day && $maths > 60 && $maths <= 240 ) { $ret = ceil($maths/60); return sprintf($lang['For_Minutes_2_4'], $ret); } else if ( $same_day && $maths > 240 && $maths <= 3540 ) { $ret = ceil($maths/60); if ( substr($ret, 0, 1) > 1 && substr($ret, 1, 1) > 1 && substr($ret, 1, 1) < 5 ) { return sprintf($lang['For_Minutes_2_4'], $ret); } else { return sprintf($lang['For_Minutes_5_59'], $ret); } } else if ( $same_day && $maths > 3540 ) { return sprintf($lang['Today'], $timedate); } else if ( !$same_day && $day_after == 1 ) { return sprintf($lang['Tomorow'], $timedate); } else if ( !$same_day && $day_after > 1 && $day_after < 7 ) { if ( $day_after == 2 ) { return sprintf($lang[date("D", ($now+172800))], $timedate); } else if ( $day_after == 3 ) { return sprintf($lang[date("D", ($now+259200))], $timedate); } else if ( $day_after == 4 ) { return sprintf($lang[date("D", ($now+345600))], $timedate); } else if ( $day_after == 5 ) { return sprintf($lang[date("D", ($now+432000))], $timedate); } else if ( $day_after == 6 ) { return sprintf($lang[date("D", ($now+518400))], $timedate); } } else { return date("Y-m-d, H:i", $timestamp); } } }[/code] Testowałem i problemów nie było, w razie jakby ktoś zauważył jakiś błąd to prosiłbym o info - poprawię Co do używania to wiadomo, datę podajemy w formacie timestamp, przykład użycia: [code]echo create_friendly_date('1361518771'); Z chwilą wysłania tego posta, funkcja zwraca: Dzisiaj, 8:40. Jeśli podano błędny argument w funkcji, zwrócona zostanie wartość FALSE. Myślę, że komuś się przyda. -
Autor: Majkelo < Mich.Pajor[at]gmail.com > Michał Pajor Nazwa modyfikacji: Search Multi-Accounts Informacje dot. modyfikacji Wyszukuje użytkowników, którzy posiadają mulitkonta z poziomu PA. Screen/Live Demo: Download: https://przemo.org/phpBB2/forum/download.php?id=34947
-
[Pobierz] Przynależność do grupy na określony czas
Michael2318 opublikował(a) temat w Modyfikacje do phpBB2
Autor: Majkelo/Michael2318 < Mich.Pajor[at]gmail.com > Michał Pajor Nazwa modyfikacji: Przynależność do grupy na określony czas Informacje dot. modyfikacji Co modyfikacja potrafi: :arrow: Podczas dodawania użytkownika do danej grupy jest możliwość wybrania na jak długo dany user ma być przydzielony do danej grupy, :arrow: Przy dodawaniu/zmianie moderatora grupy - jego czas 'przynależenia' zawsze zmieniany jest na nieograniczony, :arrow: W widoku grupy moderator grupy (admin itd. oczywiście też) widzą kto kiedy z danej grupy wyleci. Ten kawałek: if ( rand(0, 8) == 8 ) { $sql = "DELETE FROM " . USER_GROUP_TABLE . " WHERE user_delete_time > 0 AND user_delete_time <= " . CR_TIME . ""; if ( !($result = $db->sql_query($sql)) ) { message_die(GENERAL_ERROR, 'Could not obtain user and group information', '', __LINE__, __FILE__, $sql); } sql_cache('clear', 'groups_data'); } Odpowiada za usuwanie ludzi z grupy, których czas już minął. Jak widać, zrobiłem taki prowizoryczny warunek, dzięki czemu to zapytanie nie będzie wykonywanie cały czas, tylko wtedy, jeśli z przedziału 0-8 wylosowana zostanie cyfra 8. Jak ktoś chce to może ten warunek usunąć i wtedy to zapytanie będzie wykonywane cały czas przy wejściu w groupcp.php. No i oczywiście, jeśli chcecie dodać danego użytkownika na okres nieokreślony do grupy (na zawsze) to pole 'Na czas' zostawiacie puste. Jest tam z resztą nawet informacja o tym W modyfikacji '1 miesiąc' to 30 dni. To chyba na tyle informacji. Screen/Live Demo: Download: https://przemo.org/phpBB2/forum/download.php?id=34738 -
Statystyki tematu Dodaje statystyki u dołu tematu z dokładną rozpiską - ile gości, anonimowych i zwykłych użytkowników przegląda dany temat. Co modyfikacja potrafi: :arrow: Dodaje statystyki u dołu tematu z dokładną rozpiską - ile gości, anonimowych i zwykłych użytkowników przegląda dany temat. Chyba każdy kojarzy z innych silników te statystyki: Jeśli user ma w preferencjach zaznaczone "Ukryj moją obecność na forum", to w spisie zarejestrowanych użytkowników nie występuje, aktualizowana jest jedynie liczba Anonimowych użytkowników. Do tego dodałem bajer, który rozpoznaje czy dany user tylko czyta temat czy też w nim odpowiada (jeśli odpowiada to jego nick jest podkreślony przerywaną linią). Informacja o tym czy user czyta czy też odpowiada w temacie jest po najechaniu na wybrany nick, aczkolwiek (tak jak już wspomniałem) - jeśli ktoś odpowiada to jego nick jest odpowiednio wyróżniony. Aby rozpoznało, że user odpowiada w temacie, nie może on odpowiadać przez moduł szybkiej odpowiedzi, tylko normalnie przez posting.php. UWAGA! Do działania tej modyfikacji MUSISZ mieć włączone: PA > Konfiguracja > Widoku tematów > Kto przeglądał temat: TAK Nie wiem czy takowa modyfikacja już istnieje, w każdym razie nie kojarzę. Statystyki tematu.txt
-
Skrypt edycji profilu w PHP i MySQL. Poradnik by Michael2318
Michael2318 odpowiedział(a) na Michael2318 temat w Poradniki
Nie zależy mi na piwach tylko na statystykach ile osób korzysta z moich rozwiązań. Nie musisz stawiać, odpal googla i poszukaj podobnego rozwiązania. -
Skrypt edycji profilu w PHP i MySQL. Poradnik by Michael2318
Michael2318 opublikował(a) temat w Poradniki
Cześć. Dzisiaj ląduje na Pecetowiczu, poradnik opisujący jak w prosty sposób zrobić skrypt edycji profilu w PHP i MySQL. A więc zaczynajmy. U mnie plik nazywa się profile.php. Najpierw łączymy się z bazą i dodajemy dwie zmienne, które sprawdzać będą czy user jest zalogowany oraz czy w linku istnieje dopisek: viewprofile_id=X - jeśli tak to zmienne zwrócą TRUE, jeśli nie to zwrócą FALSE. <?php mysql_connect('localhost','root','password') or die('Nieudane połaczenie z baza danych...'); mysql_select_db('database_name') or die('Nie udało się wybrać bazy danych...'); session_start(); $session_logged_in = (isset($_SESSION['nazwa'])) ? TRUE : FALSE; $profile = (isset($_GET['viewprofile_id'])) ? TRUE : FALSE; Teraz jeśli któraś z powyższych zmiennych zwróci false to wypluwamy błąd o tym: if ( !$profile ) { echo "Link jest niepoprawny!"; exit; } if ( !$session_logged_in ) { echo "Nie jesteś zalogowany!"; exit; } Jeśli z kolei powyższe zmienne zwróciły TRUE i w linku viewprofile_id=X - X jest równe ID usera, który edytuje dany profil (czyli po polsku, jeśli user jest właścicielem danego profilu) to wykonujemy zapytanie pobierające nam dane o tym userze. Tutaj tez na wszelki wypadek sprawdzamy czy podane w linku ID w ogóle istnieje, jeśli nie to zwracamy błąd: if ( $session_logged_in && $profile && $_GET['viewprofile_id'] == $_SESSION['nazwa'] ) { $profile_id = intval($_GET['viewprofile_id']); $sql = "SELECT * FROM `users` WHERE id = ".$profile_id.""; $result = mysql_query($sql) or die(mysql_error()); $num = mysql_num_rows($result); if ( $num == 0 ) { echo "Link jest niepoprawny!"; exit; } W przeciwnym razie, jeśli wszystko jest ok, wyświetlamy formularz: else { $row = mysql_fetch_assoc($result); if ( !isset($_POST['submit']) ) { $body = '<form action="profile.php?viewprofile_id='.$profile_id.'" method="post"> Nick: <input type="post" name="username" maxlength="25" value="'.$row['username'].'"><br> E-Mail: <input type="post" name="email" value="'.$row['email'].'"><br> Obecne hasło <span style="font-weight: bold; color: red;">*</span> <input type="password" name="obecne_haslo"><br> Nowe hasło <span style="font-weight: bold; color: red;">*</span> <input type="password" name="nowe_haslo"><br> Powtórz nowe hasło <span style="font-weight: bold; color: red;">*</span> <input type="password" name="powtorz_nowe_haslo"><br> <input type="submit" name="submit" value="Zapisz zmiany"> </form><br><br> <span style="font-weight: bold; color: red;">*</span> - Uzupełnij tylko jeśli chcesz zmienić hasło.'; echo $body; } Następnie są te same warunki, które są w poradniku dot. rejestracji, więc tutaj już mniej szczegółowo, zawsze można zerknąć do tamtego poradnika i zobaczyć co za co odpowiada: Jeśli pola: login i email nie są puste oraz pola z hasłami również są uzupełnione to updatujemy to do bazy: $login = mysql_escape_string($_POST['username']); $email = mysql_escape_string($_POST['email']); $password = md5($_POST['obecne_haslo']); $first_password = md5($_POST['nowe_haslo']); $second_password = md5($_POST['powtorz_nowe_haslo']); if ( !empty($login) && !empty($email) && md5($login) !== $first_password && $password == $row['password'] && !empty($_POST['nowe_haslo']) && !empty($_POST['powtorz_nowe_haslo']) && $first_password == $second_password && filter_var($email, FILTER_VALIDATE_EMAIL) && strlen($login) > 3 && strlen($_POST['nowe_haslo']) > 5 && preg_match( "/^[a-zA-Z0-9_ ]+$/" , $login) ) { $sql = "SELECT * FROM `users` WHERE id != ".$_SESSION['nazwa']." AND (email = '".$email."' OR username = '".$login."')"; $result = mysql_query($sql) or die("Nie udalo sie pobrac danych"); $num = mysql_num_rows($result); if ( $num == 0 ) { $sql = "UPDATE `users` SET username = '".$login."', password = '".$first_password."', email = '".$email."' WHERE id = ".$_SESSION['nazwa'].""; $result = mysql_query($sql) or die("Nie udalo sie zaktualizowac usera"); echo 'Profil został zaktualizowany!'; exit; } else { echo "Wpisany login lub email jest juz w uzyciu! Podaj inny!"; exit; } } Jeśli z kolei uzupełnione są tylko pola: login i email, a hasła zostały puste to ich nie zmieniamy: else if ( !empty($login) && !empty($email) && empty($_POST['nowe_haslo']) && empty($_POST['obecne_haslo']) && empty($_POST['powtorz_nowe_haslo']) && filter_var($email, FILTER_VALIDATE_EMAIL) && strlen($login) > 3 && preg_match( "/^[a-zA-Z0-9_ ]+$/" , $login) ) { $sql = "SELECT * FROM `users` WHERE id != ".$_SESSION['nazwa']." AND (email = '".$email."' OR username = '".$login."')"; $result = mysql_query($sql) or die("Nie udalo sie pobrac danych"); $num = mysql_num_rows($result); if ( $num == 0 ) { $sql = "UPDATE `users` SET username = '".$login."', email = '".$email."' WHERE id = ".$_SESSION['nazwa'].""; $result = mysql_query($sql) or die("Nie udalo sie zaktualizowac usera"); echo 'Profil został zaktualizowany!'; exit; } else { echo "Wpisany login lub email jest juz w uzyciu! Podaj inny!"; exit; } } Potem już są właśnie te warunki o których pisałem - żywcem wzięte z rejestracji, więc ich nie opisuję. Na końcu jest tylko warunek, że jeśli warunek z góry dot. właściciela profilu się nie spełni to wypluje błąd o tym: else if ( empty($login) || empty($email) ) { echo "Uzupełnij wszystkie pola!"; exit; } else if ( !(empty($_POST['nowe_haslo']) && empty($_POST['obecne_haslo']) && empty($_POST['powtorz_nowe_haslo'])) && !(!empty($_POST['nowe_haslo']) && !empty($_POST['obecne_haslo']) && !empty($_POST['powtorz_nowe_haslo'])) ) { echo "Uzupełnij pola z hasłami!"; exit; } else if ( !(strlen($login) > 3 && !empty($_POST['nowe_haslo']) && strlen($_POST['nowe_haslo']) > 5) ) { echo "Nick lub haslo jest za krotkie. Haslo musi zawierac min. 6 znakow, natomiast nick 4 znaki"; exit; } else if ( !(strlen($login) > 3) ) { echo "Nick jest za krotki. Nick musi zawierac min. 4 znaki."; exit; } else if ( !empty($_POST['nowe_haslo']) && md5($login) == $first_password ) { echo "Haslo nie moze byc takie samo jak login!"; exit; } else if ( !empty($_POST['nowe_haslo']) && !empty($_POST['powtorz_nowe_haslo']) && $first_password !== $second_password ) { echo "Wpisane hasla nie zgadzaja sie!"; exit; } else if ( !filter_var($email, FILTER_VALIDATE_EMAIL) ) { echo "Wpisany email jest niepoprawny!"; exit; } else if ( !preg_match( "/^[a-zA-Z0-9_ ]+$/" , $login) ) { echo "Znaki w loginie sa niedozwolone! Mozesz uzywac tylko malych i duzych liter (bez polskich znakow!), spacji, cyfr."; exit; } } } } else { echo "Próbujesz edytować nie swój profil!"; exit; } ?> Tyle. Autor poradnika: Michael2318 -
Przedstawię skrypt pod mój poradnik Logowania & rejestracji na sesjach, dzięki któremu użytkownik będzie mógł zresetować swoje hasło A więc najpierw dodajemy do bazy dwa pola: ALTER TABLE `users` ADD `user_new_password` varchar(32) NOT NULL DEFAULT '0'; ALTER TABLE `users` ADD `user_new_password_time` int(11) NOT NULL DEFAULT '0'; Następnie na samym początku pliku z logowaniem/rejestracją dodajemy kilka langów oraz zmienną, w której należy podać adres www swojej strony! <?php $website_name = 'http://twojastrona.pl/forum/'; $session_logged_in = (isset($_SESSION['nazwa'])) ? TRUE : FALSE; /* Langi */ $lang['Main_Info_Forgot_Password'] = 'Jeśli z jakichś powodów nie możesz się zalogować, możesz użyć tego formularza do zresetowania Twojego hasła, które zostanie wysłane na Twój e-mail.'; $lang['Email_address'] = 'Adres E-Mail'; $lang['Remind'] = 'Przypomnij'; $lang['Remind_Password_Successful'] = 'Twoje nowe hasło zostało wysłane pod wskazany adres e-mail. Sprwadź swoją skrzynkę pocztową i zaloguj się tutaj, korzystając w podanego w mailu hasła.'; $lang['Bad_Email'] = 'Wpisany email jest niepoprawny!'; $lang['Error_Remind_Password'] = 'Link aktywacyjny został już wysłany na Twoją skrzynkę mailową! Możesz tylko raz na 24 godziny poprosić o zresetowanie swojego hasła!'; $lang['Bad_Link'] = 'Link jest niepoprawny!'; $lang['Email_Remind_Password_Sent'] = 'Link aktywacyjny do rozpoczęcia zresetowania hasła został wysłany pod wskazany adres e-mail. Sprwadź swoją skrzynkę pocztową i kliknij w link zawarty w wiadomości.'; $lang['Error_Sent_Emails'] = 'Niespodziewany błąd przy próbie rozpoczęcia procesu zresetowania hasła. Zgłoś ten problem administratorowi strony.'; $lang['Title_Email_Remind_Password'] = 'Przypomnienie hasła'; $lang['Email_Message_Remind_Password'] = '<html>Witaj!<br>Poprosiłeś o zresetowanie Twojego hasła. W celu dokończenia procesu zresetowania hasła wejdź na poniższy link:<br>%s<br><br>Pozdr.</html>'; $lang['New_Password_Message'] = '<html>Witaj!<br>Poprosiłeś o przypomnienie Twojego hasła. Twoje nowe hasło to: <b>%s</b>. Zaloguj się, klikając w <br><a href="'.$website_name.'/login.php">TEN</a> odnośnik, korzystając z podanego hasła.<br><br>Pozdr.</html>'; /* Langi */ Po tej czynności należy dodać kod funkcji, która generuje nam losowy ciąg znaków (hasło). Opisywałem tą czynność w TYM poradniku. Należy po prostu dodać kod tej funkcji i tyle Następnie dodajemy formularz, dzięki któremu będzie można podać adres e-mail i znaleźć ofiarę, która zapomniała swojego hasła: if ( !isset($_GET['reset_id']) && !$session_logged_in && isset($_GET['forgot']) && $_GET['forgot'] == 'password' && !isset($_POST['submit']) ) { $body = $lang['Main_Info_Forgot_Password'].'<br><form action="login.php?forgot=password" method="post">'.$lang['Email_address'].'<input type="post" name="forgot_email"><br><input type="submit" name="submit" value="'.$lang['Remind'].'"></form>'; echo $body; exit; } Teraz sprawdzamy czy istnieje w ogóle użytkownik o podanym adresie e-mail. Jeśli nie to wypluwamy błąd: else if ( !isset($_GET['reset_id']) && !$session_logged_in && isset($_GET['forgot']) && $_GET['forgot'] == 'password' && isset($_POST['submit']) ) { $email = trim(htmlspecialchars($_POST['forgot_email'])); $sql = "SELECT * FROM `users` WHERE email = '".$email."'"; $result = mysql_query($sql) or die(mysql_error()); $num = mysql_num_rows($result); $row = mysql_fetch_assoc($result); if ( $num == 0 ) { echo $lang['Bad_Email']; exit; } Jeśli jednak istnieje to preparujemy losowe ID, updatujemy do bazy danych oraz wysyłamy linka w treści maila. W linku zawarte będzie właśnie to ID, które wygenerowaliśmy i zupdatowaliśmy do bazy: else { if ( $row['user_new_password_time'] != '0' && ($row['user_new_password_time'] + (24 * 3600)) > time() ) { echo $lang['Error_Remind_Password']; exit; } $new_password = generate_password(); $sql = "UPDATE `users` SET user_new_password = '".$new_password."', user_new_password_time = '".time()."' WHERE id = ".$row['id'].""; $result = mysql_query($sql) or die(mysql_error()); $headers = 'MIME-Version: 1.0' . "\r\n"; $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n"; $email_to = $row['email']; $topic = $lang['Title_Email_Remind_Password']; $tresc = sprintf($lang['Email_Message_Remind_Password'], '<a href="'.$website_name.'login.php?forgot=password&reset_id='.$new_password.'">Kliknij tutaj</a>');; if ( mail($email_to, $topic, $tresc, $headers) ) { echo $lang['Email_Remind_Password_Sent']; exit; } else { echo $lang['Error_Sent_Emails']; exit; } } } Później, jeśli user już kliknie w linka z maila, sprawdzamy czy ID zawarte w linku pasuje w ogóle do któregoś z userów. Jeśli nie, to wypluwamy błąd, iż link jest niepoprawny: if ( isset($_GET['reset_id']) && !$session_logged_in && isset($_GET['forgot']) && $_GET['forgot'] == 'password' ) { $reset_id = mysql_espace_string($_GET['reset_id']); $sql = "SELECT * FROM `users` WHERE user_new_password = '".$reset_id."'"; $result = mysql_query($sql) or die(mysql_error()); $num = mysql_num_rows($result); $row = mysql_fetch_assoc($result); if ( $num == 0 ) { echo $lang['Bad_Link']; exit; } W przeciwnym wypadku generujemy nowy losowy ciąg znaków, tym razem updatujemy już hasło o wskazany ciąg i wysyłamy go w mailu do użytkownika: else { $new_password = generate_password(); $sql = "UPDATE `users` SET password = '".md5($new_password)."', user_new_password = 0 WHERE id = '".$row['id']."'"; $result = mysql_query($sql) or die(mysql_error()); $headers = 'MIME-Version: 1.0' . "\r\n"; $headers .= 'Content-type: text/html; charset=utf-8' . "\r\n"; $email_to = $row['email']; $topic = 'Przypomnienie hasła - finalizacja'; $tresc = sprintf($lang['New_Password_Message'], $new_password); if ( mail($email_to, $topic, $tresc, $headers) ) { echo $lang['Remind_Password_Successful']; } else { echo $lang['Error_Sent_Emails']; } } } ?> To wszystko Jakie są plusy tego skryptu? Jeśli ktoś zna maila np. swojego kolegi i chce mu zrobić "psikusa", zmieniając mu cały czas hasło (bo cały czas prosi o zmianę go, używając skryptu) i zarazem ma na celu zapchanie komuś skrzynki pocztowej - nie uda się to! Skrypt zmienia hasło dopiero po potwierdzeniu (kliknięciu) linka, który jest w mailu. Dodatkowo, jeśli ktoś raz poprosi o zmianę hasła i nie kliknie w link zawarty w mailu - drugi raz nie będzie mógł zrobić tej samej czynności! Dopiero po upływie 24h jest możliwość wysłania kolejnego maila z prośbą o zresetowanie hasła. Ładne jest tutaj zabezpieczenie przed spamem, jeśli ktoś nagminnie wysyłałby komuś prośby o zmianę hasła Autor skryptu: Michael2318
-
[PHP/MySQL] Opcja "zaloguj automatycznie"
Michael2318 odpowiedział(a) na Michael2318 temat w Poradniki
Przypomnienie hasła mam zrobione już u siebie bo do swojego CMSa potrzebowałem, jak znajdę chwilkę to opublikuję. Edycja profilu to chyba zbyt wielki banał, no ale mogę dodać. -
Jeśli często odwiedzamy jakąś stronę i wymagane jest logowanie to wręcz denerwujące jest to, że za każdym razem musimy się logować. Chociaż faktem jest, że w przeglądarkach są opcje, które zapamiętują dane do naszego logowania, ale co z tego, skoro i tak musimy przejść przez etap logowania Dlatego właśnie przedstawię tutaj jak dodać opcję automatycznego logowania na stronę www. Bazować będę na swoim skrypcie LOGOWANIA & REJESTRACJI NA SESJACH, ale to w zasadzie można podpiąć pod inne tego rodzaju skrypty Skrypt opierać się będzie na ciastku, które będziemy tworzyć podczas logowania do serwisu. Aby takie logowanie było bezpieczne i aby nikt nie mógł się zalogować na konto innego użytkownika, tworząc ciacho z groźną zawartością umożliwiającą takie zalogowanie się, musimy generować przy każdym logowaniu losowy ciąg znaków, zapisywać je do ciastka i później sprawdzać przy wejściu na stronę czy zawartość ciastka (losowego ciągu znaków) pasuje do któregoś z użytkowników. Teoretycznie na tyle, przejdźmy do praktyki. Najpierw musimy dodać do bazy pole, w którym będziemy przetrzymywać wspomniany wyżej losowy ciąg znaków. Wykonujemy więc takie zapytanie: ALTER TABLE `users` ADD `session_id` char(30) NOT NULL DEFAULT '0'; Teraz wykorzystamy funkcję generującą losowy ciąg znaków. Dodajemy więc kod tej funkcji na początku pliku z logowaniem. Następnie musimy do formularza z logowaniem dodać pole typu radio do zaznaczania (bądź nie) opcji zalogowania automatycznego. Zmieniamy więc ten kod z mojego poradnika dot. logowania i rejestracji: $body = 'Witaj gosc! Zaloguj sie ;)<br><form action="index.php" method="post"><table><tr><td>Login: <input type="post" name="login" maxlength="25"></td></tr><tr><td>Haslo: <input type="password" name="password" maxlength="35"></td></tr><tr><td><input type="submit" name="submit" value="Zaloguj"></td></tr></table></form><br>Lub <a href="index.php?action=register">ZAREJESTRUJ SIE!</a>'; na: $body = 'Witaj gosc! Zaloguj sie ;)<br><form action="index.php" method="post"> <table><tr><td>Login: <input type="post" name="login" maxlength="25"></td></tr> <tr><td>Haslo: <input type="password" name="password" maxlength="35"></td></tr> <tr><td>Zaloguj automatycznie: <input type="radio" name="autologin" value="true"></td></tr> <tr><td><input type="submit" name="submit" value="Zaloguj"></td></tr></table></form><br>Lub <a href="index.php?action=register">ZAREJESTRUJ SIE!</a>'; echo $body; A następnie w tym fragmencie: $row = mysql_fetch_assoc($result); $_SESSION['nazwa'] = $row['id']; Musimy dodać aktualizację losowego ciągu znaków do bazy danych, wykorzystując wcześniej dodaną funkcję. Zmieniamy więc powyższy kod na: $row = mysql_fetch_assoc($result); $rand_id = generate_password(); $query = "UPDATE `users` SET session_id = '".$rand_id."' WHERE id = ".$row['id'].""; $res = mysql_query($query) or die(mysql_error()); if ( isset($_POST['autologin']) && $_POST['autologin'] == 'true' ) { setcookie('autologin', $rand_id, time() + 30 * 86400); // automatyczne logowanie będzie "trzymało" 30 dni - liczba 30 oznacza liczbę dni istnienia ciasteczka } $_SESSION['nazwa'] = $row['id']; Teraz pozostało dodać jeszcze warunek, że jeśli ciacho istnieje to user automatycznie jest logowany na swoje konto. Kod ten można dodać albo na początku pliku login.php lub w miejsce, gdzie dany kod jest wczytywany w każdym miejscu strony (przykładem może być plik config.php w którym przeważnie przetrzymuje się dane do bazy - jest on wczytywany zawsze i wszędzie, aby umożliwić połączenie do bazy). Jeśli kod umieścisz na początku login.php to user będzie automatycznie logowany dopiero w przypadku gdy odpali ten plik (czyli gdy wejdzie pod adres http://twojastrona.pl/login.php). if ( isset($_COOKIE['autologin']) && strlen($_COOKIE['autologin']) == 30 ) { $session_cookie_id = mysql_escape_string($_COOKIE['autologin']); $sql = "SELECT * FROM `users` WHERE session_id = '".$session_cookie_id."' LIMIT 1"; $result = mysql_query($sql) or die(mysql_error()); $row = mysql_fetch_assoc($result); $num = mysql_num_rows($result); if ( $num != 0 ) { $_SESSION['nazwa'] = $row['id']; } else { setcookie('autologin', time(), time() - 30 * 86400); // usuwamy ciasteczko bo sesja ID jest zła, chyba ktoś kombinował coś z ciastkiem i chciał się wbić na czyjeś konto } } Musimy jeszcze tylko usunąć ciasteczko auto-logujące, w przypadku gdy user się wyloguje. W przeciwnym razie jeśli np. przez przypadek zaznaczyłby auto-logowanie na nieswoim komputerze, skrypt cały czas logowałby na to samo konto, nie można by było się też zalogować na inne konto Zmieniamy więc ten kod: if ( isset($_GET['action']) && htmlspecialchars($_GET['action']) == 'wyloguj' ) { header('Location: index.php'); session_destroy(); } na: if ( isset($_GET['action']) && htmlspecialchars($_GET['action']) == 'wyloguj' ) { header('Location: index.php'); setcookie('autologin', time(), time() - 30 * 86400); session_destroy(); } To wszystko Poradnik napisany przez: Michael2318
-
W tym poradniku pokażę jak zrobić wyszukiwarkę w PHP i MySQL (strona praktyczna) oraz opiszę po krótce jak ona dokładnie działa (strona teoretyczna). Do czego służy wyszukiwarka? Wyszukiwarka najczęściej służy nam do przeszukiwania danych w bazie, za pomocą krótkiej frazy. Teksty, które zawierają daną frazę zostają wyświetlone. Od strony SQL'a, w przeszukiwaniu bazy pomoże nam instrukcja LIKE. Przykłady: SELECT `username` FROM `users` WHERE username LIKE "%nazwa"; Zwrócone zostaną nicki, które na początku zawierają frazę nazwa, czyli przykładowo będzie to nick: nazwatak. SELECT `username` FROM `users` WHERE username LIKE "%nazwa%"; Zwrócone zostaną nicki, które w środku zawierają frazę nazwa, czyli przykładowo będzie to nick: testnazwatak. SELECT `username` FROM `users` WHERE username LIKE "nazwa%"; Zwrócone zostaną nicki, które na końcu zawierają frazę nazwa, czyli przykładowo będzie to nick: testnazwa. SELECT `username` FROM `users` WHERE username LIKE "n%a"; Zwrócone zostaną nicki, które zaczynające się na literę n, a kończą na literę a czyli będzie to nick po prostu nazwa. Jak widać, znak procenta (%) oznacza dowolny ciąg znaków, co pomaga dokładnie przeszukać bazę danych pod względem wskazanej frazy Jak zrobić swoją wyszukiwarkę w PHP i MySQL Pokażę tutaj jak zrobić wyszukiwarkę, która będzie przeszukiwała użytkowników pod względem nicku (oczywiście będzie to łatwo podpiąć pod mój poradnik dot. "logowania i rejestracji na sesjach", bo to na nim właśnie będę bazował 😉 No więc, zaczynajmy. Najpierw połączymy się z bazą danych - uzupełniamy hosta, nazwę użytkownika bazy danych, hasło oraz nazwę bazy danych: <?php /* Połączenie z bazą danych */ mysql_connect('host', 'user', 'password') or die('Could not connect to database'); mysql_select_db('database_name') or die('Could not select database'); /* Połaczenie z bazą danych */ Następnie krótka konfiguracja. Określamy, ile słów maksymalnie użytkownik może wpisać do naszej wyszukiwarki oraz maksymalną długość całej frazy: /* Konfiguracja */ $max_words = 5; // maksymalna liczba słów $max_length = 50; // maksymalna długość całej frazy /* Konfiguracja */ W kolejnym kroku tworzymy formularz, czyli pole do wpisania frazy oraz button "submit" do przeszukania bazy pod względem danej frazy: if ( !isset($_POST['submit']) ) { $body = '<h1>Wyszukiwarka użytkowników by Michael2318</h1><br><br> <form action="search.php" method="post"> Fraza nicku <span style="color: red; font-weight: bold;">*</span> <input type="post" style="width: 200px;" name="fraza" maxlength="'.$max_length.'"><br> <input type="submit" name="submit" value="Szukaj"> </form><br><br> <span style="color: red; font-weight: bold;">*</span> - znak gwiazdki (<b>*</b>) zastępuje dowolny ciąg znaków.'; echo $body; } Teraz już trochę więcej roboty :) Usuwamy z frazy spacje z początku i z końca (jeśli istnieją), zabezpieczamy ciąg znaków (czyli frazę) funkcją mysql_escape_string() Zliczamy ile we frazie występuje spacji (czyli innymi słowy - ile użyto słów) i dodajemy warunek - jeśli użyto więcej słów niż zezwolono (patrz, wcześniej wspominałem o konfiguracji - tam ustawiamy maksimum) to wypluwamy błąd: else { $search_words = trim($_POST['fraza']); $search_words = mysql_escape_string($search_words); $count_words = substr_count($search_words, ' '); if ( ($count_words + 1) > ($max_words) ) { echo "Użyłeś za wiele słów"; exit; } Teraz zamieniamy wszystkie gwiazdki we frazie na znak procenta i wykonujemy zapytanie do bazy danych, które przeszuka nam nicki użytkowników pod względem wskazanej frazy. Zliczamy też ilość zwróconych rekordów przez SQL: $search_words = str_replace("*", "%", $search_words); $sql = "SELECT * FROM `users` WHERE username LIKE '".$search_words."'"; $result = mysql_query($sql) or die('error in search information about users'); $num = mysql_num_rows($result); Jeśli ilość zwróconych rekordów jest równa 0 to wyświetlamy błąd, że nic nie znaleziono: if ( $num == 0 ) { echo "Nie znaleziono pasujących."; exit; } w przeciwnym razie (czyli jeśli coś znaleziono) wyświetlamy nicki użytkowników, którzy spełnili podane kryterium odnośnie przeszukiwanych nicków pod względem podanej frazy: else { while($row = mysql_fetch_assoc($result)) { $body_search .= $row['username'].'<br>'; } $body = '<h1>Znaleziono '.$num.' użytkowników pasujących do podanej frazy</h1><br><br>'.$body_search.''; echo $body; } } ?> To wszystko. Plik należy zapisać jako search.php, w przeciwnym razie w formularzu należy zmienić nazwę tego pliku. Cały gotowy kod: <?php /* Skrypt wyszukiwarki napisany przez: Michael2318 Strona autora: http://michael2318.pl/ Forum - support: http://michael2318.pl/forum Zabraniam rozpowszechniania tego skryptu bez mojej zgody */ /* Połączenie z bazą danych */ mysql_connect('host', 'user', 'password') or die('Could not connect to database'); mysql_select_db('database_name') or die('Could not select database'); /* Połaczenie z bazą danych */ /* Konfiguracja */ $max_words = 5; // maksymalna liczba słów $max_length = 50; // maksymalna długość całej frazy /* Konfiguracja */ if ( !isset($_POST['submit']) ) { $body = '<h1>Wyszukiwarka użytkowników by Michael2318</h1><br><br> <form action="search.php" method="post"> Fraza nicku <span style="color: red; font-weight: bold;">*</span> <input type="post" name="fraza" style="width: 200px;" maxlength="'.$max_length.'"><br> <input type="submit" name="submit" value="Szukaj"> </form><br><br> <span style="color: red; font-weight: bold;">*</span> - znak gwiazdki (<b>*</b>) zastępuje dowolny ciąg znaków.'; echo $body; } else { $search_words = trim($_POST['fraza']); $search_words = mysql_escape_string($search_words); $count_words = substr_count($search_words, ' '); if ( ($count_words + 1) > ($max_words) ) { echo "Użyłeś za wiele słów"; exit; } $search_words = str_replace("*", "%", $search_words); $sql = "SELECT * FROM `users` WHERE username LIKE '".$search_words."'"; $result = mysql_query($sql) or die('error in search information about users'); $num = mysql_num_rows($result); if ( $num == 0 ) { echo "Nie znaleziono pasujących."; exit; } else { while($row = mysql_fetch_assoc($result)) { $body_search .= $row['username'].'<br>'; } $body = '<h1>Znaleziono '.$num.' użytkowników pasujących do podanej frazy</h1><br><br>'.$body_search.''; echo $body; } } ?>
-
Ostatnio, przeglądając różnego rodzaju skrypty, czy to poradniki, czy to skrypty sprzedawane na allegro - wiele z tych skryptów jest po prostu dziurawych, webmasterzy zapominają o tym, że ich rozwiązania mogą stać się celem kogoś niepowołanego (czyt. hackera). Najczęstszym zagrożeniem są ataki SQL INJECTION. Atak ten polega na zmianie zapytania SQL przez formularze lub linki w przeglądarkach. Każdy porządny serwis przechowuje masę danych w bazie. Jednak przy wyciąganiu tych danych zapominamy o (jak już wspomniałem) bezpieczeństwie! Teraz na szczęście hostingi same zabezpieczają nas przed brakiem podstawowych filtracji danych, ale nie można polegać tylko na tym, bo można się łatwo przejechać. Przykładem wykorzystania ataku SQL INJECTION może być chociażby skrypt logowania oparty o bazę danych. Logując się na jakąś stronę, skrypt musi sprawdzić czy podane przez nas dane w formularzu, zgadzają się z danymi podanymi w bazie. Tak więc po uzupełnieniu słynnych pól Login & Hasło (dla przykładu L: admin / H: haslo) wykonywane jest mniej więcej takie zapytanie: $sql = "SELECT * FROM `users` WHERE username = 'admin' AND user_password = 'haslo'"; $result = mysql_query($sql) or die('error'); Na pierwszy rzut oka nie ma tutaj nic podejrzanego. Jednak jeśli znamy jakikolwiek login/nick do serwisu, możemy w polu Login wpisać znany_nick'"; #. Co to spowoduje? A no zamieni nasze zapytanie z powyższego na: $sql = "SELECT * FROM `users` WHERE username = 'znany_nick'"; #' AND user_password = 'haslo'"; $result = mysql_query($sql) or die('error'); I co się stało? Wrzućmy powyższy kod do pierwszego lepszego edytora PHP: Jak widać, druga część została zakomentowana, czyli nie będzie ona brana pod uwagę. Tak więc do bazy zostanie wykonane następujące zapytanie: $sql = "SELECT * FROM `users` WHERE username = 'znany_nick'"; $result = mysql_query($sql) or die('error'); I co teraz? A no to, że skrypt nie wykryje żadnych nieprawidłowości...Podaliśmy login, który w bazie istnieje, hasła w ogóle nie brało pod uwagę, więc co mu pozostało innego - musi nas zalogować na konto o wskazanym nicku. Sprawa wyglądałaby zupełnie inaczej, gdyby użyć tutaj filtracji danych, czyli funkcji mysql_escape_string(). Co to da? Wzorując się na poprzednim przykładzie, jeśli "owiniemy"nasz poprzedni nick we wcześniej wskazaną funkcję, zapytanie przyjmie postać: SELECT * FROM `users` WHERE username = 'znany_nick\'\"; #' AND user_password = 'haslo'; $result = mysql_query($sql) or die('error'); Jak widać, funkcja dodała przed cudzysłowem i apostrofem slash'a\e, co w składni PHP wygląda już lepiej: Konkretniej, slash spowodował iż stojące obok niego cudzysłów i apostrof zostały zignorowane, a idąc dalej, płotek nie spowodował zakomentowania reszty ciągu. W tym wypadku do bazy leci zapytanie sprawdzające żywcem, czy w bazie istnieje user o nicku: znany_nick\'\"; #. Wiadome, że raczej nie istnieje, więc już z takiego myku co do logowania nici. Ja polecam jeszcze od siebie dodanie preg_match() i po prostu zezwolić na wpisanie liter dużych, małych oraz cyfr, podobnie z rejestracją i tego typu znaki jak apostrofy, cudzysłowy itd. mamy z głowy. Podobnie sytuacja wygląda w linkach stron. Przykładowo, w takim adresie: http://strona.pl/profil.php?id=144 liczba (konkretniej ID) na pewno ma coś wspólnego z bazą. I tutaj też, jeśli źle zabezpieczymy w plikach zmienne $_GET, nasz skrypt będzie dziurawy jak ser szwajcarski 🙂 Podobnie jak wyżej, zamiast cyfry 144, tworzymy podobny ciąg znaków, jak ten wyżej, gdzie mowa była o skrypcie logowania. Efekt będzie ten sam. Dlatego w przypadku zmiennych $_GET, powinniśmy je zabezpieczać: a ) w przypadku, gdy oczekujemy z GET'a liczby: intval() lub: is_numeric() b ) w przypadku, gdy oczekujemy z GET'a jakiegoś tekstu: htmlspecialchars() Podsumowując - przy pisaniu czegokolwiek, zwłaszcza zintegrowanego z bazą danych, musimy pamiętać przede wszystkim o bezpieczeństwie naszego skryptu. Jak widać, wystarczy dopisać jedną funkcję do zmiennych i cały skrypt staje się o wiele bezpieczniejszy Opis bezpieczeństwa skryptów PHP by Michael2318
-
Easy Contact Form MOD (Formularz kontaktowy) | phpBB2 by Przemo
Michael2318 odpowiedział(a) na CzareK temat w Modyfikacje do phpBB2
W sumie racja, zgodę z przemo.org masz ode mnie 😉