Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wysywalnie formularza, pliku bezpieczenstwo
Forum PHP.pl > Forum > PHP
bigos1995-95
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 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();

nospor

1)
$numerrek = stripslashes($wiersz['numer']);
Po co te stripslashes?


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

I teraz sobie pomysl - masz do wypełnienia formularz, wypełniasz go pół godziny i klikasz ZAPISZ. A na ekranie co? A na ekranie komunikat, że jedno pole ma za dużo znaków. A teraz co? A teraz znowu musisz przez pół godziny wypełniać formularz i modlić się, by tym razem nie było żadnego błędu bo znowu wszystko co wprowadziłeś szlag trafi...
bigos1995-95
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?

Dejmien_85
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ł.
nospor
ad1) Wiem że uzyles mysql_escape_string. Ale to sluzy nie rozwaleniu zapytania a nie dodawaniu dodatkowych slashy ktore potem ci się niby wyświetlają. Stripslashes jest zbedne. A jesli u ciebie jest niezbędne, znaczy że na serwerze masz włączone MAGIC_QUOTES - wyłącz to

ad2) Normalnie. Nie rob EXIT po bledzie, tylko wyswietlaj blad, ale też wyswietlaj formularz gdy jest blad z danymi, które już ktos wprowadzil
bigos1995-95
Dobrze, tutaj to rozumiem, tak jak mówisz dorzuce trochę kodu PHP do formularza który będzie zapobiegal usunięcia tego co wprowadził user w razie błędu. Najbardziej jednak chodzi mi o tekst wprowadzany do zmiennej $komentarz, można do niego dodać kawałek kodu JavaScript który doda się do bazy danych a następnie wyświetli na następnej podstronie i rozwali mi stronkę (jakieś przekierowanie czy cos). Jak temu zapobiec aby wprowadzane dane były formatowane w taki sposób żeby nie było możliwe użycia przez jakiegoś szkodliwego użytkownika JavaScriptu or something else

<?php
$item = "Zak's Laptop";
$escaped_item = mysql_escape_string($item);
printf ("Łańcuch ze znakami unikowymi: %s\n", $escaped_item);
?>

Troszkę nie rozumiem, ta funkcja jak widać wstawia znaki ukosnika przed apostrofami, i ja tekst w takiej formie wrzucam do bazy danych (ochrona przed SQL injection tak) a gdy później te dane z bazy danych chce z powrotem wyświetlić to już nie chce tych ukosnikow i używam striplashes żeby te ukosniki usunąć albo tak jak mówisz nie podejmuje żadnego działania w tym kierunku jeśli jest ustawione magic_quotes

Popraw mnie jeśli się mylę

nospor
$item = "Zak's Laptop";
$escaped_item = mysql_escape_string($item);
printf ("Łańcuch ze znakami unikowymi: %s\n", $escaped_item);

Kurcze, ale ty nie wyświetlaj sobie tego co robi mysql_escape_string - ta funkcja robi tak, by było dobrze przy wkładaniu do bazy. Ty nie patrz ze ona dodaje ukosniki, bo ona ma dodawać ale to tylko dla bazy dodaje. Jak z bazy pobierzesz dane to one już tych ukośników mieć nie będą..... No chyba że masz włączone MAGIC_QUOTES - to wtedy masz podwojnie ukosniki robione i one jak pobierzesz z bazy to będą. Dlatego ci mowie, że masz wyłączyć MAGIC_QUOTES jeśli masz włączone i już potem żadnych stripslashes nie używaj.
No już jaśniej się tego nie da napisać.


Co do kodu js, to jeśli nie pozwalasz by ktokolwiek ci wkladał jakieś kod html/js to przed wyswietlanieam danych używaj htmlspecialchars() - wowczas nawet jak ktoś ci wstawi js to nic ci nie zrobi.
bigos1995-95
Dobra czaje dzięki wink.gif, jakby ktoś miał jeszcze propozycje co do bezpieczeństwa kodu proszę pisać, będę wdzięczny
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.