Skocz do zawartości

Mój skrypt komentarzy - czy bezpieczny?


westmid

Rekomendowane odpowiedzi

Cześć, napisałem pierwszy raz w życiu coś samemu w oparciu o MySQL. Proszę, czy możecie rzucić okiem pod kątem bezpieczeństwa - na co zwrócić uwagę w przyszłości, a co można tu poprawić? Dziękuję z góry za rady.

index.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="https://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-5" />
<title>PHP i MySQL: komentarz.</title>
</head>
<body>
<form name="formularz_komentowania" action="wysylanie/wyslij_komentarz.php" method="post" onSubmit="onSubmit">
<table width="680" border="0">
 <tr>
<td rowspan="3"><strong>Komentarz:</strong><br />
  <textarea name="tresc_komentarza" rows="6" cols="60" onFocus="if(this.value=='Tutaj wpisz co chcesz powiedziec...') this.value='';" onBlur="if(this.value=='') this.value='Tutaj wpisz co chcesz powiedziec...';">Tutaj wpisz co chcesz powiedziec...</textarea></td>
<td><strong>Pseudonim:</strong><br />
  <input type="text" name="pseudonim" maxlength="24" value="Twoj pseudonim..." onFocus="if(this.value=='Twoj pseudonim...') this.value='';" onBlur="if(this.value=='') this.value='Twoj pseudonim...';"></td>
 </tr>
 <tr>
<td><strong>Data i czas:</strong><br />
  <input type="text" name="czas_komentarza" disabled="disabled" value="<?php echo date('m/d/y H:i'); ?>"></td>
 </tr>
 <tr>
<td><input type="submit" value="Opublikuj komentarz"></td>
 </tr>
</table>
</form>
</body>
</html>

ustawienia/ustawienia.php

<?php
$host = 'localhost';
$user = 'master';
$password = '99zCYmUKLuteXbqe';
$database = 'kursmysql'; 
?>

wysylanie/wyslij_komentarz

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="https://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-5" />
<title>PHP i MySQL: komentarz.</title>
</head>
<body>
<?php
/* SEKWENCJA OTWIERANIA POLACZENIA Z BAZA MYSQL + SPRAWDZANIE ISTNIENIA TABLICY DLA KOMENTARZY */
# dolaczenie ustawien bazy MySQL 
include('../ustawienia/ustawienia.php');
# polaczenie z baza MySQL
mysql_connect($host, $user, $password) or die('Nie udalo sie polaczyc z baza danych.');
@mysql_select_db($database) or die('Nie udalo sie wybrac bazy danych.');
# sprawdzanie czy tabela wszystkie_komentarze istnieje
$exist="SELECT * FROM wszystkie_komentarze";
$result=@mysql_query($exist);
if (!$result)
{	
mysql_query("SET NAMES 'latin2'");
mysql_query('CREATE TABLE wszystkie_komentarze (												
id int(6) NOT NULL auto_increment,
publikowany_komentarz text(1200) NOT NULL, 
pseudonim_uzytkownika varchar(24) NOT NULL, 
czas_publikacji  text(12) NOT NULL, 
PRIMARY KEY (id),
UNIQUE id (id),
KEY id_2 (id)
)');
} 
?>

<?php
/* SEKWENCJA ZAPISANIA KOMENTARZA W BAZIE MYSQL  */
# utworzenie zmiennych
$tresc_komentarza = addslashes($_POST['tresc_komentarza']);
$pseudonim = addslashes($_POST['pseudonim']);
$czas_komentarza = addslashes(date('m/d/y H:i'));
#zapytanie do bazy MySQL
$query = "INSERT INTO wszystkie_komentarze VALUES ('','$tresc_komentarza','$pseudonim','$czas_komentarza')";
mysql_query($query);
# zamkniecie polaczeniea z baza MySQL
mysql_close();
?>
</body>
</html>

odczytywanie/odczytywanie.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="https://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-5" />
<title>PHP i MySQL: komentarz.</title>
</head>
<body>
<?php
/* SEKWENCJA OTWIERANIA POLACZENIA Z BAZA MYSQL + SPRAWDZANIE ISTNIENIA TABLICY DLA KOMENTARZY */
# dolaczenie ustawien bazy MySQL 
include('../ustawienia/ustawienia.php');
# polaczenie z baza MySQL
mysql_connect($host, $user, $password) or die('Nie udalo sie polaczyc z baza danych.');
@mysql_select_db($database) or die('Nie udalo sie wybrac bazy danych.');
?>

<?php
/* SEKWENCJA ODCZYTYWANIA KOMENTARZY Z BAZY MYSQL  */
# sprawdzanie czy tabela wszystkie_komentarze istnieje
$wynik = mysql_query("SELECT * FROM wszystkie_komentarze") or die('Blad zapytania');
# sprawdzanie, czy cos jest w tabeli i wyswietlanie
if(mysql_num_rows($wynik) > 0) { 
echo '<table bgcolor="#CCC" width="900" border="1"><tr><td width="50"><strong>ID</strong></td><td width="150"><strong>Pseudonim</strong></td>
<td width="100"><strong>Czas</strong></td><td width="600"><strong>Tresc</strong></td></tr></table>';
while($r = mysql_fetch_array($wynik)) { 		
echo '<table width="900" border="1"><tr><td width="50">'.$r[0].'</td>'; 
echo '<td width="150">'.$r[2].'</td>'; 
echo '<td width="100">'.$r[3].'</td>'; 
echo '<td width="600">'.$r[1].'</td>'; 
echo '</tr></table>';
} 
} 
# zamkniecie polaczeniea z baza MySQL
mysql_close();
?>

</body>
</html>

Odnośnik do komentarza
Udostępnij na innych stronach

Do przyjęcia dla niewielkich ilości rekordów komentarzy. Dla większej ilości rekordów należy stosować inne rozwiązania.

------

co to za nonsensowne typy

czas_publikacji text(12) NOT NULL, ;)

a to co to ma być

PRIMARY KEY (id),

UNIQUE id (id),

KEY id_2 (id)

:)

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

Do przyjęcia dla niewielkich ilości rekordów komentarzy. Dla większej ilości rekordów należy stosować inne rozwiązania.
Dlaczego? Jakie? Docelowo ma obsługiwać 10 nowych komentarzy tygodniowo, mam do wgrania już 200 z innej bazy. 20 stron wyświetlających komentarze z tej samej bazy, 1000 odsłon dziennie.
co to za nonsensowne typy

czas_publikacji text(12) NOT NULL, :puknijsie:

czas i data publikacji komentarza to w bazie 12 znaków, nie może być puste.
a to co to ma być

PRIMARY KEY (id),

UNIQUE id (id),

KEY id_2 (id)

:)

wg https://php.pl/phppl/Wortal/Artykuly/PHP/Po...anie-informacji

$query= "CREATE TABLE contacts (id int(6) NOT NULL auto_increment, first varchar(15) NOT NULL, last varchar(15) NOT NULL, phone varchar(20) NOT NULL, mobile varchar(20) NOT NULL, fax varchar(20) NOT NULL, email varchar(30) NOT NULL, web varchar(30) NOT NULL,PRIMARY KEY (id),UNIQUE id (id),KEY id_2 (id))";
Rzeczą na którą szczególnie powinieneś zwrócić uwagę jest pole id, które zostanie ustawione jako PRIMARY, INDEX, UNIQUE a dodatkowo z parametrem 'auto_increment' (pole EXTRA/DODATKOWO w PHPMyAdmin). Konsekwencją takich atrybutów będzie ustawienie pola id jako klucza głównego tabeli). Właściwość 'auto_increment' spowoduje automatyczne nadawanie każdemu, nowo wstawianemu rekordowi, kolejnego dostępnego identyfikatora.

PS Mam fascynujące początki, książki z Heliona za 120zł są do xxxx, z rozwiązań z neta się śmieją. Ja chcę się tego nauczyć w praktyce - macie jakieś zaufane źródła?

Odnośnik do komentarza
Udostępnij na innych stronach

Nooooo tak to jest jak się uczy z dobrych "źródeł" .

Systemy bazodanowe mają określone typy pol przeznaczone do przechowywania daty https://dev.mysql.com/doc/refman/5.5/en/dat...time-types.html proponuję je stosować. Dlaczego to już musisz sam się douczyć :)

Klucz główny tabeli zdefiniowany jako PRIMARY KEY (id), jest automatycznie polem unikalnym wiec nie potrzeba dodatkowo określać go jako UNIQUE id (id) ITD.

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

Słuchaj @Miona dobrze gada :)

Ja bym dodał jeszcze od siebie, że:

Istnieją specjalne typy daty i czasu więc czas publikacji lepiej zapisywać jako DATETIME lub TIMESTAMP - choćby z tego względu, że łatwiej się po nich selecty robi

Tworzenie tablicy jeśli nie uda się zapytanie, to raczej dziwne rozwiązanie i może być niebezpieczne. Jeśli już musisz tak robić, to raz wypadało by sprawdzić kod błędu i odpalać CREATE TABLE tylko w przypadku jej nieistnienia, a dwa dla bezpieczeństwa bym dodał CREATE TABLE IF NOT EXISTS

Odnośnik do komentarza
Udostępnij na innych stronach

Przyczepię się do:

$tresc_komentarza = addslashes($_POST['tresc_komentarza']);
$pseudonim = addslashes($_POST['pseudonim']);
$czas_komentarza = addslashes(date('m/d/y H:i'));

ładnie po polskiemu objaśnione https://php.net/manual/pl/function.mysql-re...cape-string.php

Albo jestem ślepy albo nie widzę tam żadnego filtrowania treści komentarza ani innych danych z zewnątrz - treść przepuść chociaż przez htmlspecialchars

Pseudonim też uwarunkuj - długość, zawartość etc.

Czas widzę ustawiasz lokalnie - OK - ale od tego są odpowiednie typy pól w mysqlu

Nie mam pojęcia dlaczemu wyleciały i mają filtera Polskie znaki w adresach Joomla od nowa napisane, czytelnie i logicznie. Dylemat adres z www czy bez? Powinno to rozwiać wszelkie wątpliwości.

Naprawiam kodowanie [krzaki, chińskie znaki, polskie znaki] dowiedz się także czymże jest kodowanie znaków bo to podstawa.

Odnośnik do komentarza
Udostępnij na innych stronach

Dane przesyłane do skryptu:

1. Użyć na nich htmlspecialchars zanim zostaną wstawione do HTML - https://pl.php.net/manual/en/function.htmlspecialchars.php,

tak samo po wyciągnięciu ich z bazy.

2. Przed wstawieniem do bazy użyć mysql_real_escape_string - https://pl.php.net/manual/en/function.mysql...cape-string.php

Wtedy będzie bezpiecznie, addslashes nie używaj.

Resztę można Ci wybaczyć bo to Twój pierwszy skrypt, ale jeżeli chcesz zostać dobrym programistą to jeszcze sporo musisz się nauczyć - i to nie jest żadna złośliwość jakby co.

Polecam taką stronę do nauki: https://w3schools.com/

Plus generalnie temat optymalizacji baz danych.

Odnośnik do komentarza
Udostępnij na innych stronach

  • 2 tygodnie później...

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę. Warunki użytkowania Polityka prywatności