Zabezpieczenie

0

Witam! Czy w kodzie poniżej jest jakiś błąd? Pytam, bo mogę manipulować zapytaniami z poziomu formularza. Przykład: wpisanie 'kruk boolean #' tworzy mi tylko jedną kolumnę i to o nazwie kruk.

$nazwa_wydarzenia = htmlentities($_POST['nazwa_wydarzenia'], ENT_QUOTES, "UTF-8");
						$nazwa_wydarzenia =  mysqli_real_escape_string($polaczenie, $nazwa_wydarzenia);
						if ($nazwa_wydarzenia != "")
						{
							if (($polaczenie -> query("ALTER TABLE {$_SESSION['table-name']}event ADD {$nazwa_wydarzenia}_udzial boolean")) && ($polaczenie -> query("ALTER TABLE {$_SESSION['table-name']}event ADD {$nazwa_wydarzenia}_uregulowano boolean")))
							{
								for ($i=1; $i<=$ile_rekordow; $i++)
								{
									if (isset($_POST[$i]))
										$polaczenie -> query("UPDATE {$_SESSION['table-name']}event SET {$nazwa_wydarzenia}_udzial = 1, {$nazwa_wydarzenia}_uregulowano = 0 WHERE nr_dziennik = $i");
									else
										$polaczenie -> query("UPDATE {$_SESSION['table-name']}event SET {$nazwa_wydarzenia}_udzial = 0, {$nazwa_wydarzenia}_uregulowano = 0 WHERE nr_dziennik = $i");
								}
								echo '<span style = "color: green">Zdarzenie utworzone poprawnie</span><br>';
							}

0

Nie jest to rozsądne. Wstępnie widzę, że korzystając z podzapytań da rade dostać się do całej bazy.

0

Dlatego pytam jak to rozwiązać. Myślałem, że htmlentities() i real_escape_string() rozwiąże sprawę...

0

no to ci odpowiadam: nie rób tego dynamicznie, korzystaj z pdo, jeśli piszesz w czystym php.

0
mr_jaro napisał(a):

no to ci odpowiadam: nie rób tego dynamicznie, korzystaj z pdo, jeśli piszesz w czystym php.

Wiesz może co tu jest nie tak? Otrzymuję taki błąd: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''TI01'' at line 1

$stmt = $conn -> prepare('SELECT imie_nazwisko FROM :a');
$stmt -> bindValue(':a', $_SESSION["table-name"], PDO::PARAM_STR);
$stmt -> execute();
0

Oczywiście, znowu próbujesz robić zapytanie dynamicznie. Nie wstawiaj tam dynamicznych nazw kolumn i nazw tabel. Te rzeczy muszą być na sztywno by było bezpiecznie, nigdy nie mogą pochodzić od usera.

0

screenshot-20190326172427.png
User logując się wybiera niejako tabelę z jakiej będzie korzystał. Myślę, że jest to mus robiąc zapytanie dynamiczne, bo inaczej musiałbym zrobić pełno ifów czy switchy. Czy się mylę?

1

Jeśli logując się user wybiera tabele, to znaczy, że masz źle bazę zaprojektowaną i popełniasz tradycyjne błędy początkujących dzieląc tabele na użytkowników. a to nie tędy droga. Relacje to jest odpowiedź na wszystkie twoje troski. Przebuduj bazę.

0

Jesteś okrutny

0
Bartosz Żelek napisał(a):

Jesteś okrutny

Chcesz robić to porządnie, czy aby działało? Pokaż projekt bazy a powiem co masz skopane.

0

Uczę się - chcę aby było porządnie i działało. screenshot-20190326174741.png
Dużo chyba się z tego nie dowiesz.

0

Wiem wystarczająco by dać ci rozwiązanie.

Musisz posiadać tabelke users trzymającą wszystkie dane usera, czyli nick, imie, naziwkso, hasło, email itp, I to jest twoja tabelka wyjściowa. Dalej w takich tabelce "dzinnik" robisz relacje do usera poprzez jego id tworząc klucz obcy "user_id" i tym samym w jednej tabelce możesz trzymać dzienniki wszystkich userów, a nie jednego.

0

@mr_jaro:
Odświeżam. I przychodzę po pomoc. Zrobiłem coś takiego: screenshot-20190328175532.png screenshot-20190328175739.png screenshot-20190328175859.png Myślisz, że jest ok?

Jest sobie skarbnik klasowy, zarządza klasą. Chcę dodać opcje umożliwiającą dodanie jakiegoś specjalnego eventu, typu kino. Wyświetli się podstrona z wyborem uczniów o tym samym class-code co skarbnik. Zostaną wybrani poszczególni i mam ich ID. I tu zaczynają się schody. Nie wiem jak w tej sytuacji ma wyglądać baza danych. Będzie jedna statyczna tabela i kolumny czy może tabele i kolumny mają być tworzone nowe? Proszę o pomoc.

0

jeśli dobrze rozumiem, to w tabelce którą masz obecnie to trzymasz informacje, czy ktoś zapłacił kase za dany miesiąc tak?

0

nie jestem zwolennikiem nadania polom nazw miesięcy, a jak przyjdzie nastepny rok to co zakładasz nową tabelę ?
Dałbym w tabeli pola ID_Student, miesiac, rok, kwota. Oczywiście to jest kwestia modelu modelu biznesowego i widziałem programy w których każdy rok to była oddzielna baza danych, ale osobiście za takim rozwiązaniem nie przepadam wolę jedną bazę

0
mr_jaro napisał(a):

jeśli dobrze rozumiem, to w tabelce którą masz obecnie to trzymasz informacje, czy ktoś zapłacił kase za dany miesiąc tak?

Dokładnie

0

Moja propozycja tabel:

roles {
id:uint
name:varchar(255)
}

users {
id:uint
name:varchar(255)
password: varchar(255) //ilosc znaków powinna być taka jaką generuje algorytm hashowania
role_id:uint
class_id:uint
}

classes {
id:uint
code:varchar(10)
name:varchar(255)
}

month_payments {
id:uint
user_id:uint
class_id:uint
month:usmallint
year:usmallint
value:float
}

events {
id:uint
class_id:uint
name:varchar(255)
}

event_payments {
id:uint
user_id:uint
event_id:uint
date:timestamp
value:float
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1