Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][HTML] umieszczanie nazw tabel w HTML a bezpieczeństwo?
Forum PHP.pl > Forum > Przedszkole
xajart
Kiedyś robiłem pewą stronke i dzisiaj postanowiłem, że zoptymalizuje w niej kog źródłowy, zwłaszcza w AJAX (plik JS), bo kilkakrotnie miałem ten sam kod powielany który różnił się tylko parametrami zczytywanymi. 

Zrobiłem to dość uniwersalnie tak że wszystkie dane z PHP przekazuje do kodu HTML a skrypt je sobie pobiera poprzez DOM i odpowiednio przetwarza oraz dokonuje ewentualnie aktualizacji w MySQL. 

I na tym etapie zadałem sobie pytanie czy bezpiecznie będzie jeżeli do HTML przekazuje nazwę tabeli z MySQL, tak by za pomocą DOM, AJAX mógł sobie je pobrać.
np. mam kog w stylu:
Kod
<input type="text" name="article" index="15" tables="listArticles" cols="name" />

Gdzie tables to nazwa tabeli w BD. 
a cols = to nazwa kolumny

W ten sposób, po drugiej stronie JS mam krótki skrypt który to wszystko obsluguje, ale jakoś wydaje mi się, że nie jest to bezpieczna metoda. Bo ktoś w HTML'u może sobie odczytać parametr tables i cols i jak pokombinuje to może mi zaśmiecić BD. 

Dlatego moje pytanie do was, czy jest to bezpieczne? A jeżeli nie to jak ewentualnie przekazać dane z PHP do pliku JS (bez przeładowywania strony).


cojack
Tzn jeżeli skrypt nie jest zabezpieczony przed atakami typu sql injection to jeszcze podajesz nazwy tabel, to tak jakbyś sobie w kostkę strzelił. Bo nikt nie musi wybierać z sql'a tabel tylko już od razu wie jak się one nazywają. Po prostu genialnie masz + 3 do szpanu.
xajart
No właśnie tak mi się coś wydawało, że jak tak to rozwiąże to nie będzie to bezpieczne. Tylko nie wiem jak innaczej przekazać stałą z nazwą tabeli z PHP do JS.
Oczywiście mogę to zrobić na zasadzie nadawania jakiegoś unikalnego klucza w includzie, na podstawie którego JS sobie go pobierze i przekaże do pliku wykonywalnego PHP, który zinterpretuje na jego podstawie do jakiej tabeli się on odwołuje. I wykreuje odpowiednie zapytanie do BD aktualizującej wpis. Ale to z kolei w mojej ocenie trochę mija się z celem, zwłaszcza kiedy w przyszłości rozbuduje się serwis o inne elementy (nowe tabele) to będzie trzeba ten skrypt odpowiednio wyedytować. 

Co do SQL Injection - to sądzę że raczej mam dobrze to zabezpieczone. A tak apropo zna ktoś jakieś fajne fuzzery do testowania aplikacji - najlepiej dobrze rozbudowane a zarazme nieskomplikowane w obsłudze?


ucho
Jeśli używasz MySql 6 i ktoś znajdzie jakieś SqlInjection to i tak wyciągnie bez problemu nazwy wszystkich tabeli - podobnie w Postgresie można je pobrać z tabel systemowych (pg_*). A jeśli nie ma żadnej takiej luki to znajomość schematu bazy też nic nie pomoże.
xajart
Ściągnełem sobie jakiegoś fuzzera do sprawdzenia odporność na SQL Injecton oraz sam też kilka testów przeprowadziłem i nie ma szans na przebicie się. 

Więc moge śmiało stosowac rozwiązanie z przekazywaniem w formularzu nazwy tabeli. Ale wpadł mi inny pomysł do głowy, na zwiększenie bezpieczeństwa tego skryptu, a mianowicie robię coś takiego:
Kod
tables="<?php echo md5($nazwa_tabeli); ?>")



Następnie przez skrypt JS pobieram wartość tables i przekazuje do pliku php który odpowiada za zapisanie wartości w BD w odpowiedniej tabeli. 

Jest poddawana ona walidacji (czy zawiera znaki a-zA-z0-9). A następnie pobieram listę tabel z BD. I w ten sposób sprawdzam.

Kod
for ($n=0...)
if ($hash_table == md5($nazwa_tabeli_zBD[$n]))



PS. jeszcze myśle nad wprowadzeniem unikalności hashowania nazwy_tabeli, bo obecnie ona jest zawsze taka sama w zalenżności od nazwy i myśle by dodać do niej np wartość Tokena. Gdzie token - jest generowany unikalny i przypisany na czas zalogowania użytkownika do sesji. Wówczas będzie ten hash dosyć unikalny.
Kod
substr(md5($nazwa_tabeli.$_SESSION['token']), 0,8)



Wiem wiem, chyba przesadzam z tym bezpieczeństwem, ale to na wypadek gdyby zabezpieczenie przed SQL Injection kiedyś zawiodło, to lepiej mieć te nazwy tabel dość mocno zabezpieczone.
rezik
haKsior:
Kod
... FROM information_schema.tables--


i już ma wszystkie nazwy tabel, generalnie filtruj tylko dane które mogłby naruszyć zapytanie SQL - hashowanie nazw tabel nie ma zbytnio większego sensu

Cytat
A tak apropo zna ktoś jakieś fajne fuzzery do testowania aplikacji


filtruj wszystkie dane przychodzące na każdym etapie i podatności na SQLI być nie powinno... nie ma raczej gotowych 'skanerów podatności'. Jakby były to by script kiddie połowę stron położyły ;P
ziqzaq
~xajart
The Open Web Application Security Project (OWASP). Jest tam sporo informacji na temat bezpieczeństwa oraz narzędzi do testowania aplikacji internetowych. Wszystko to zebrane w jednym miejscu. IMO warto spędzić na niej trochę czasu.
xajart
Są fuzzery kiedyś szukałem pod tym katem i jest ich kilka różnych (tylko ciężko je znaleźć) - niektóre są proste w obsłudze a inne bardziej skomplikowane. Ostatnio używałem powerfuzzer.

ziqzaq dzięki za linka, przejże sobie to winksmiley.jpg
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.