Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Wysywalnie formularza, pliku bezpieczenstwo, Wysywalnie formularza, pliku bezpieczenstwo
bigos1995-95
post
Post #1





Grupa: Zarejestrowani
Postów: 79
Pomógł: 0
Dołączył: 18.05.2012

Ostrzeżenie: (0%)
-----


Witam, napisałem skrypt który obsługuje błedy i dodaje informacje do bazy danych a nastepnie na innej stronie informacje sa odczytywane. Chciałbym was zapytać jak oceniacie mój skrypt i czego w nim brakuje.

Oczywiście brakuje tutaj obslugi błedów co do JS,PHP itd jak mam sformatować zmienne aby nie formatowały kodu JS, PHP itd (IMG:style_emoticons/default/questionmark.gif)


Dodawanie informacji do bazy danych
  1. if (isset($_POST['przycisk'])) {
  2.  
  3. //Tworzymy krótkie nazwy zmiennych
  4. $nazwaskryptu = $_POST['nazwaskryptu'];
  5. $profesja = $_POST['profesja'];
  6. $nazwapoziom = $_POST['nazwapoziom'];
  7. $komentarz = $_POST['komentarz'];
  8. $miasto = $_POST['miasto'];
  9. $jaki_bot = $_POST['jaki_bot'];
  10. $plikuzytkownika = $_FILES['plikuzytkownika'];
  11. $skrypter = $_POST['skrypter'];
  12.  
  13. //Sklejanie zmiennych
  14. $danatabela = $jaki_bot . $miasto;
  15.  
  16. //lokalizacja pliku
  17. $lokalizacja = 'wyslane/'.$_FILES['plikuzytkownika']['name'];
  18.  
  19. if(strlen($lokalizacja) > 50) {
  20. echo 'Dodawany plik nie może mieć nazwy dłuższej niż 50 znaków';
  21. }
  22.  
  23. // tworzenie zmiennej nazwy pliku
  24. $nazwapliku = $_FILES['plikuzytkownika']['name'];
  25.  
  26. // Sprawdzanie, czy wszystkie dane zostały wpisane
  27. if(!$nazwaskryptu || !$nazwapoziom || !$komentarz || $miasto == "brak" || $jaki_bot == "pusty" || $profesja == "brak" || !$plikuzytkownika) {
  28. echo 'Nie podałeś wszystkich danych';
  29. }
  30.  
  31. // Sprawdzenie, czy przy próbie wysłania pliky wystąpił błąd
  32. if ($_FILES['plikuzytkownika']['error'] > 0)
  33. {
  34. echo 'Problem: ';
  35. switch ($_FILES['plikuzytkownika']['error'])
  36. {
  37. case 1: echo 'Rozmiar pliku przekroczył wartość upload_max_filesize'; break;
  38. case 2: echo 'Rozmiar pliku przekroczył wartość max_file_size'; break;
  39. case 3: echo 'Plik wysłany tylko częściowo'; break;
  40. case 4: echo 'Nie wysłano żadnego pliku'; break;
  41. case 6: echo 'Nie można wysłać pliku: Nie wskazano katalogu tymczasowego.'; break;
  42. case 7: echo 'Wysłane pliku nie powiodło się: Nie zapisano pliku na dysku.'; break;
  43. }
  44. }
  45.  
  46. // sprawdzanie czy pole POZIOM zawiera same cyfry
  47. if(!ctype_digit($nazwapoziom)) {
  48. echo 'Pole "Podaj poziom" musi zawierać same cyfry';
  49. }
  50. //sprawdzanie czy plik o podanej nazwie istnieje w katalogu
  51. $istnieje = file_exists($lokalizacja);
  52. if($istnieje) {
  53. echo 'Plik o nazwie <font color="#00FF00">'.$nazwapliku.'</font> istnieje już w katalogu, zmień nazwę pliku i spróbuj ponownie.';
  54. }
  55.  
  56.  
  57. //formatowanie zmiennych przed włożeniem do bazy danych
  58. $nazwaskryptu = mysql_escape_string($nazwaskryptu);
  59. $profesja = mysql_escape_string($profesja);
  60. $nazwapoziom = doubleval($nazwapoziom);
  61. $komentarz = mysql_escape_string($komentarz);
  62. $miasto = mysql_escape_string($miasto);
  63. $jaki_bot = mysql_escape_string($jaki_bot);
  64. $skrypter = mysql_escape_string($skrypter);
  65. }
  66.  
  67. //laczenie z baza danych i dodawanie zapytania
  68. @ $db = new mysqli('xxxxxxxx', 'xxxxxxxx', 'xxxxxxx', 'xxxxxxxx');
  69.  
  70.  
  71. if(mysqli_connect_errno()) {
  72. echo 'Blad: Polaczenie z baza danych nie powiodlo sie';
  73. }
  74. $zapytanie = "insert into $danatabela values (NULL, '".$profesja."', '".$nazwaskryptu."', '".$nazwapoziom."', '".$komentarz."', '".$skrypter."', '".$lokalizacja."',
  75. '".$lokalizacja."') ";
  76. $wynik = $db->query($zapytanie);
  77. if(!$wynik) {
  78. echo "Wystąpił błąd podczas zapisywania danych";
  79. }
  80. $db->close();
  81.  
  82.  
  83. // umieszczenie pliku w pożądanej lokalizacji
  84.  
  85. if (is_uploaded_file($_FILES['plikuzytkownika']['tmp_name']))
  86. {
  87. if (!move_uploaded_file($_FILES['plikuzytkownika']['tmp_name'], $lokalizacja))
  88. {
  89. echo 'Problem: Plik nie może być skopiowany do katalogu';
  90. }
  91. }
  92. else
  93. {
  94. echo 'Problem: możliwy atak podczas wysyłania pliku. Nazwa pliku: ';
  95. echo $_FILES['plikuzytkownika']['name'];
  96. }
  97.  
  98. echo 'Plik został wysłany<br><br>';
  99. }




Odczytywanie informacji
  1. @ $db = new mysqli('xxxxx', 'xxxxxx', 'xxxxxxx', 'xxxxxxxxx');
  2.  
  3. if(mysqli_connect_errno()) {
  4. echo 'Blad: Polaczenie z baza danych nie powiodlo sie';
  5. }
  6. $zapytanie = "select * from $tabela order by profesja";
  7. $wynik = $db->query($zapytanie);
  8.  
  9. $ile_znalezionych = $wynik->num_rows;
  10.  
  11. for($i=0; $i <$ile_znalezionych; $i++) {
  12. $wiersz = $wynik->fetch_assoc();
  13. echo "<tr>";
  14. echo '<td width="50" bgcolor="#00FF00"><font size="5">';
  15. echo $l = $i + 1;
  16. $numerrek = stripslashes($wiersz['numer']); // numer rekordu w bazie danych nie usuwac tego
  17. echo '</font></td>';
  18. echo '<td width="55" bgcolor="#C0C0C0">';
  19. echo stripslashes($wiersz['profesja']);
  20. echo '</td>';
  21. echo '<td width="100" bgcolor="#993333">';
  22. echo stripslashes($wiersz['nazwa']);
  23. echo '</td>';
  24. echo '<td width="50" bgcolor="#00FFFF">';
  25. echo stripslashes($wiersz['poziom']);
  26. echo '</td>';
  27. echo '<td width="570" bgcolor="#663399">';
  28. echo stripslashes($wiersz['opis']);
  29. echo '</td>';
  30. echo '<td width="55" bgcolor="#99ccff">';
  31. echo stripslashes($wiersz['skrypter']);
  32. echo '</td>';
  33. echo '<td width="100" bgcolor="#99ff99">';
  34. $infpodg = stripslashes($wiersz['podglad']);
  35. echo '<a href="podglad.php?lokalizacja='.$infpodg.'">Zobacz</a>';
  36. echo '</td>';
  37. echo '<td width="100" bgcolor="#ccff33">';
  38. $infpobi = stripslashes($wiersz['pobierz']);
  39. echo '<a href="pobierz.php?skad='.$infpobi.'">Pobierz</a>';
  40. echo '</td>';
  41. if(isset($_SESSION['prawid_uzyt']))
  42. {
  43. echo '<td width="10">';
  44. echo '<a href="usunskr.php?numerskr='.$numerrek.'&nazwatab='.$tabela.'&sciezka='.$infpodg.'">X</a>';
  45. echo '</td>';
  46. }
  47. echo "</tr>";
  48. }
  49. $wynik->free();
  50. $db->close();

Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
bigos1995-95
post
Post #2





Grupa: Zarejestrowani
Postów: 79
Pomógł: 0
Dołączył: 18.05.2012

Ostrzeżenie: (0%)
-----


1)stripslashes po to zeby sprowadzic tekst dalej do normalnej formy jak przed dodaniem do bazy danych uzylem funkcji mysql_escape_string

2)
  1. if(strlen($lokalizacja) > 50) {
  2. echo 'Dodawany plik nie może mieć nazwy dłuższej niż 50 znaków';
  3. }


to muszę miec bo mam miejsce tylko na 50 znakow w bazie danych

W jaki sposób mam zrobić aby wyświetlalo komunikat a nie usuwało wszystkich wprowadzonych danych??

I co z tym filtrowaniem przed JS?

Go to the top of the page
+Quote Post
Dejmien_85
post
Post #3





Grupa: Zarejestrowani
Postów: 251
Pomógł: 23
Dołączył: 23.04.2013

Ostrzeżenie: (0%)
-----


Cytat(bigos1995-95 @ 17.05.2013, 17:22:54 ) *
W jaki sposób mam zrobić aby wyświetlalo komunikat a nie usuwało wszystkich wprowadzonych danych??


Najprostsze co mi przychodzi do głowy, to "Say hello to HTML!". ; )

Możesz cofnąć się o jeden krok do tyłu i mieć pewność, że POSTEM przejdzie maksymalnie 50 znaków. "maxlenght" to jedno z rozwiązań, ma jednak jeden błąd, ucina wklejany tekst (jeśli jest dłuższy niż określona długość), tak więc niepełnosprytny internauta może tego nawet nie zauważyć (gdy obetnie mu część nazwy pliku).

Możesz się wspomóc "placeholderem" (HTML5), który podkreśli ile znaków ma być (w wypełnianym polu wyświetla tekst, np. maksymalna długość 50 znaków), albo za pomocą "pattern" (HTML5) opiszesz nazwę pliku przy pomocy wyrażeń regularnych (przykładowo upewniając się, że ostatnie cztery znaczki to "kropka_literka_literka_literka").

Powyższe działania dadzą Ci gwarancję, że więcej niż 50 znaków w $lokalizacja nie znajdziesz (jedynie jaskiniowcy używający IE 8 i starszych wersji mogą przez to przejść - ale wtedy atakuj ich JS). Walidację formularzy można także przeprowadzić za pomocą JS - wtedy można nawet wyświetlić jakiś komunikat.

Co do wyświetlania komunikatu w PHP - po wciśnięci "submit" i po odpaleniu skryptu PHP do formularza można powiedzieć chyba tylko "goodbye my beloved friend!" - a jak się opuści formularz, to później trzeba jakieś akrobacje przechodzić, aby te dane wróciły (w sumie możesz w pliku z formularzem dorzucić trochę skryptu PHP, który przechwytuje to co wraca ze skryptu dodawania info do bazy danych gdy $lokalizacja > 50, tj. w linijce nr 21. zamiast "exit" robisz powrót do formularza i zwracasz dane przy okazji wyświetlając komunikat).

Ogólnie do sprawdzania formularzy bardzo dobrze nadaje się HTML i JS - odsieją większość błędów, a jak ktoś używa IE 8 i later, to niech wypełnia pola drugi raz... w formularzu możesz dodać "jeśli masz IE 8 to będziesz drugi raz wpisywał dane gdy coś pójdzie nie tak - ściągnij sobie prawdziwą wyszukiwarkę!" ; >

To oczywiście tylko moje przemyślenia na szybko - na tym forum są świetni programiści, tak więc na pewno ktoś wpadnie na lepszy pomysł.

Ten post edytował Dejmien_85 18.05.2013, 00:55:44
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 12.10.2025 - 15:55