Fix: Naprawa podatności XSS w formularzach dodawania książek i klientów/ #72
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Typ podatności
Cross-Site Scripting (XSS) Persistent (Stored XSS)
Lokalizacja podatności
Backend
Python/Flask_Book_Library/project/books/views.pycreate_book()- brak walidacji danych wejściowychedit_book()- brak walidacji danych wejściowychPython/Flask_Book_Library/project/customers/views.pycreate_customer()- brak walidacji danych wejściowychedit_customer()- brak walidacji danych wejściowychFrontend
Python/Flask_Book_Library/project/templates/books.html| safewyłącza escapowanie HTMLPython/Flask_Book_Library/project/templates/customers.html| safewyłącza escapowanie HTMLScreenshoty udowadniające wystąpienie podatności
1. Wstrzyknięcie kodu XSS
Screenshot pokazuje formularz z wstrzykniętym kodem
<script>alert('blahblah')</script>w polu "Name".2. Rezultat - Alert
Screenshot pokazuje alert wyświetlony po wstrzyknięciu kodu. Alert potwierdza, że kod został zapisany w bazie danych i wykonany w przeglądarce użytkownika.
3. Wstrzyknięte kody w tabeli
Screenshot pokazuje listę książek, gdzie w kolumnie "Name" widoczny jest zapisany kod XSS. Kod został zapisany w bazie danych i jest wykonywany przy każdym wyświetleniu listy.
Rozwiązanie
1. Sanitizacja danych wejściowych w backendzie
Dodano bibliotekę
bleachdorequirements.txti zaimplementowano sanitizację danych przed zapisem do bazy danych:Funkcja
bleach.clean()usuwa wszystkie tagi HTML i JavaScript z danych wejściowych, pozostawiając tylko bezpieczny tekst.2. Usunięcie filtra
| safez szablonówUsunięto filtr
| safez szablonów HTML, co pozwala Flask na automatyczne escapowanie HTML:Przed:
Po:
Zastosowano zatem dwa poziomy ochrony.
Weryfikacja poprawki
Po wprowadzeniu poprawek:
1. Próba wstrzyknięcia kodu XSS
Screenshot pokazuje próbę wstrzyknięcia kodu XSS po wprowadzeniu poprawek.
2. Rezultat w tabeli Books
Screenshot pokazuje, że kod XSS nie został wykonany - alert się nie wyświetlił i kod został wyświetlony jako zwykły tekst w tabeli Customers. Kod HTML został usunięty przez sanitizację i escapowanie.
3. Rezultat w tabeli Customers
Screenshot pokazuje, że kod XSS nie został wykonany - został wyświetlony jako zwykły tekst w tabeli Books (ostatnia pozycja). Podobnie jak w przypadku Customers, kod HTML został usunięty przez sanitizację i escapowanie.
Wnioski: