Parę dni temu mój brat zadał mi takie pytanie..
czy jest możliwość (jeżeli tak to w jaki sposób jakie polecenia itp) napisania programu w c++ który będzie:
pobierać i wyświetlać dane z bazy MySQL znajdującej się na serwerze
będzie miał opcje pobrania bazy na dysk
będzie pobierał pliki .doc i .txt z serwera i je przetwarzał
będzie miał opcje wyszukiwania osoby z bazy np po nazwisku, zawodzie, wynagrodzeniu itp
a mi nasunęło się dodatkowe pytanie... jak zabezpieczyć program tak, żeby był potrzebny login i hasło i żeby administrator miał możliwość dodawania/edycji użytkowników a pozostali nie?
za wszelką pomoc dziękuje, bo to pytanie brata po klasie humanistycznej mnie poprostu rozwaliło
jeżeli możecie/znacie to mozecie dać jaieś ciekawe linki do tej tematyki
PS wszystkie ciekawsze fragmenty kodu również mile widziane, nie prosze o gotowca, bo raczej wolałabym to przy okazji zrozumieć (bo mimo, ze nie studiuje informatyki, to moze się kiedyś przyda )
obsługa MYsql w c++?
Rozpoczęty przez niki87, Jul 24 2008 16:59
2 odpowiedzi w tym temacie
Napisano 25.09.2011 - 17:55
#2
Napisano 25.07.2008 - 13:35
Witam,
istnieje możliwość dostępu do MySQL z poziomu C/C++ wykorzystując biblioteki np. libmysql, albo też inne mysql++, czy mniej popularne SOCI. Aby użyć libmysql, musisz poszukać odpowiedniego pakietu (np. ja w dev-cpp, mam ten pakiet wyszukiwany automatycznie z poziomu IDE). Następnie przy tworzonym projekcie należy tylko podłączyć -libmysql do linii poleceń linkera i można działać.
Oto przykładowy program, który właśnie napisałem. Mam nadzieję, że nie ma zbyt dużo błędów ;D Sądzę, że komentarze będą wystarczające, ale jakby co to pytaj:
http://pl2.php.net/m...l/ref.mysql.php
Oczywiście możliwość odczytywania danych z bazy, daje już wystarczające narzędzia do próby napisania własnej aplikacji zapisującej bazę do pliku. phpMyAdmin dostarcza tego typu rozwiązania, więc może warto zaglądnąć w jego źródło ;) (nie jest to co prawda C++ ale PHP, mimo to zasada działania będzie podobna). Różnego rodzaju wyszukiwania itp. to jedynie konieczność zmiany określonego w programie zapytania.
Użytkownik bazy ma dostęp do niej całej. Taki użytkownik jest najczęściej administratorem serwisu, który "nakłada" witrynę na tę bazę w taki sposób, że każdy użytkownik witryny może wybierać jedynie spośród odpowiednio spreparowanych zapytań SQL. Niejednokrotnie Administrator serwisu sam korzysta z takiego systemu spreparowanych zapytań aby nie narobić niepotrzebnych szkód ;) babrając się bezpośrednio w bazie. To interfejs na podstawie weryfikacji loginu i hasła, określa możliwości użytkownika i możliwe do wykonania przez niego zapytania.
Jeśli chcesz podobną weryfikację zrobić z poziomu aplikacji, to oczywiście będzie trzeba jakoś sprawdzać poprawność wprowadzanych przez użytkownika danych (aby rozsądzić, czy jest to administrator, moderator itp.). Oczywiście przechowywanie hasła w niezabezpieczonej formie mija się z celem, ponieważ jego odczytanie przez osoby trzecie jest niezwykle łatwe. Rozwiązaniem jest tu kryptografia oparta o hash'owanie. Hash'owanie to kodowanie jednokierunkowe. Łańcuch znaków poddany działaniu algorytmu hash'ującego, daje w wyniku łańcuch znaków, który nie może być w żaden sposób odkodowany. Załóżmy że istnieje przekształcenie f(x) będące funkcją hash'ującą, gdzie x to łańcuch znaków. Jednokierunkowość oznacza w tym przypadku że dla f(x) = y, nie isnieje żadne znane g(y) dające w wyniku x. Obecnie najpopularniejszym algorytmem hash'ującym jest MD5 (polecam pogooglować ;)). Sprawdzanie polega na zasadzie:
1) użytkownik podaje hasło
2) hash = hashowanie_md5(haslo)
3) jeśli hash jest równy temu zapisanemu w bazie to znaczy, że hasło jest poprawne
*) Nie jest to oczywiście metoda bez żadnego ryzyka. Teoretycznie istnieje możliwość wygenerowania dużych zbiorów haseł i obliczenia dla nich hash'y, a tym samym szybkie odnalezienie szukanego hash'a pośród posegregowanych hash'y i odkrycie hasła. Ale to trochę trwa a kryptografia nie śpi.
Dla 5 znaków alfabetycznych odkrycie hasła tą metodą trwa kilka sekund stąd polecam korzystanie z w miarę wyszukanych haseł ;D
ps. A co takiego studiujesz? jeśli można wiedzieć 8)
istnieje możliwość dostępu do MySQL z poziomu C/C++ wykorzystując biblioteki np. libmysql, albo też inne mysql++, czy mniej popularne SOCI. Aby użyć libmysql, musisz poszukać odpowiedniego pakietu (np. ja w dev-cpp, mam ten pakiet wyszukiwany automatycznie z poziomu IDE). Następnie przy tworzonym projekcie należy tylko podłączyć -libmysql do linii poleceń linkera i można działać.
Oto przykładowy program, który właśnie napisałem. Mam nadzieję, że nie ma zbyt dużo błędów ;D Sądzę, że komentarze będą wystarczające, ale jakby co to pytaj:
#include <mysql.h> #include <iostream> MYSQL *conn; // wskaźnik na obiekt/uchwyt połączenia MYSQL_RES* res; // dane odebrane MYSQL_ROW row; // pojedynczy wiersz int main(int argc, char* argv[]){ conn = mysql_init (NULL); // allokuje, inicializuje i zwraca nowy obiekt(uchwyt) połączenia if ( !mysql_real_connect ( // nawiązuje połaczenie z bazą danych, w razie problemów zwraca błędy (false) conn, // wskażnik na obiekt "localhost", // nazwa hosta do ktorego chcemy się podłączyć (localhost == 127.0.0.1) "root", // nazwa uzytkownika "password", // haslo do bazy "baza", // nazwa bazy do ktorej pragniemy nawiazac polaczenie 0, // port (0 oznacza uzycie domyslnego) NULL, // socket (brak) 0) // flagi (brak) ) { std :: cout << "Nie ma takiej bazy, lub podane dane są niepoprawne"; } else{ std :: cout << "Połączenie z bazą powiodło się\n"; mysql_query(conn,"SELECT * FROM phpbb_user_group"); // tworzymy zapytanie res = mysql_store_result(conn); // pobieramy wynik poprzedniego zapytania // wypisywanie wyniku if (res) { // Jesli res zawiera jakieś wpisy unsigned long num_fields = mysql_num_fields(res); // liczba pol w wierszu while ( (row = mysql_fetch_row(res)) ) { /* zwraca tablicę numeryczną, która odpowiada pobranemu wierszowi i przesuwa do przodu wewnętrzny wskaźnik danych; "przechodzenie po wierszach"*/ unsigned long *lengths; lengths = mysql_fetch_lengths(res); // pobiera długości pól wiersza wynikowego // wyswietlanie printf("|"); for(unsigned long i = 0; i < num_fields; i++) { printf(" %.*s |", (int) lengths[i], row[i] ? row[i] : "NULL"); // } printf("\n"); // --wyswietlanie }//while mysql_free_result(res); // zwalnia pamieć zajeta przez res }//if mysql_close (conn); // zamyka połączenie z bazą, zwalnia pamiec po uchwycie } system("pause"); return 0; }Jeśli chodzi o dostępne funkcje, w dość przyjaznej formie można je znaleźć tutaj:
http://pl2.php.net/m...l/ref.mysql.php
Oczywiście możliwość odczytywania danych z bazy, daje już wystarczające narzędzia do próby napisania własnej aplikacji zapisującej bazę do pliku. phpMyAdmin dostarcza tego typu rozwiązania, więc może warto zaglądnąć w jego źródło ;) (nie jest to co prawda C++ ale PHP, mimo to zasada działania będzie podobna). Różnego rodzaju wyszukiwania itp. to jedynie konieczność zmiany określonego w programie zapytania.
Użytkownik bazy ma dostęp do niej całej. Taki użytkownik jest najczęściej administratorem serwisu, który "nakłada" witrynę na tę bazę w taki sposób, że każdy użytkownik witryny może wybierać jedynie spośród odpowiednio spreparowanych zapytań SQL. Niejednokrotnie Administrator serwisu sam korzysta z takiego systemu spreparowanych zapytań aby nie narobić niepotrzebnych szkód ;) babrając się bezpośrednio w bazie. To interfejs na podstawie weryfikacji loginu i hasła, określa możliwości użytkownika i możliwe do wykonania przez niego zapytania.
Jeśli chcesz podobną weryfikację zrobić z poziomu aplikacji, to oczywiście będzie trzeba jakoś sprawdzać poprawność wprowadzanych przez użytkownika danych (aby rozsądzić, czy jest to administrator, moderator itp.). Oczywiście przechowywanie hasła w niezabezpieczonej formie mija się z celem, ponieważ jego odczytanie przez osoby trzecie jest niezwykle łatwe. Rozwiązaniem jest tu kryptografia oparta o hash'owanie. Hash'owanie to kodowanie jednokierunkowe. Łańcuch znaków poddany działaniu algorytmu hash'ującego, daje w wyniku łańcuch znaków, który nie może być w żaden sposób odkodowany. Załóżmy że istnieje przekształcenie f(x) będące funkcją hash'ującą, gdzie x to łańcuch znaków. Jednokierunkowość oznacza w tym przypadku że dla f(x) = y, nie isnieje żadne znane g(y) dające w wyniku x. Obecnie najpopularniejszym algorytmem hash'ującym jest MD5 (polecam pogooglować ;)). Sprawdzanie polega na zasadzie:
1) użytkownik podaje hasło
2) hash = hashowanie_md5(haslo)
3) jeśli hash jest równy temu zapisanemu w bazie to znaczy, że hasło jest poprawne
*) Nie jest to oczywiście metoda bez żadnego ryzyka. Teoretycznie istnieje możliwość wygenerowania dużych zbiorów haseł i obliczenia dla nich hash'y, a tym samym szybkie odnalezienie szukanego hash'a pośród posegregowanych hash'y i odkrycie hasła. Ale to trochę trwa a kryptografia nie śpi.
Dla 5 znaków alfabetycznych odkrycie hasła tą metodą trwa kilka sekund stąd polecam korzystanie z w miarę wyszukanych haseł ;D
ps. A co takiego studiujesz? jeśli można wiedzieć 8)
David Hilbert (1862-1943) wybitny niemiecki matematyk zapytany o jednego z byłych uczniów odpowiedział: "Ach, ten, został poetą. Na matematyka miał zbyt mało wyobraźni".
#3
Napisano 25.07.2008 - 14:10
dzięki narazie spróbuje się "wgryść" w ten programik.. oczywiście w razie pytań będę je zadawała tutaj
no ja studiuje matematyke mój brat od października zaczyna informatyke i dlatego zaczął się interesować programowaniem, a ponieważ ja mam wieksze doświadczenie to sie mnie o to spytał, a ja nie wiedziałam to spytałam tutaj
no ja studiuje matematyke mój brat od października zaczyna informatyke i dlatego zaczął się interesować programowaniem, a ponieważ ja mam wieksze doświadczenie to sie mnie o to spytał, a ja nie wiedziałam to spytałam tutaj