SQL Injection/Insertion, Jak zapobiec włamaniu na stronę. |
SQL Injection/Insertion, Jak zapobiec włamaniu na stronę. |
30.09.2007, 21:42:27
Post
#161
|
|
Grupa: Zarejestrowani Postów: 26 Pomógł: 0 Dołączył: 13.09.2006 Skąd: Poland Ostrzeżenie: (0%) |
SQL Injection (zwane też "SQL Insertion") to (rzekomo) najprostszy sposób włamu na stronę. Spowodowany jest on niepełnym sformułowaniem zapytań do MySQL. Przykład. Dajemy na stronie możliwość edycji profilu. Zapytanie do SQL wygląda następująco:
Osoba włamująca się na stronę umieszcza całkiem prosty, odpowiedni ciąg znaków/poleceń w dowolnym polu edycji tego profilu, który wygląda np. tak (dla zmiany hasła użytkownika o dowolnie wybranym, przez atakującego numerze ID):
W taki oto prosty sposób, osoba atakująca zmieniła hasło użytkownikowi o ID=1 (zazwyczaj administrator). W podobny sposób można również wyciągnąć dowolne dane z tabeli SQL. W każdym razie. Poszperałem, pomyślałem i zebrałem wszystko do kupy. Zamieszczam to tutaj razem, oraz proszę o rozbudowanie tego topica, gdyż nie znalazłem na tym forum więcej informacji o "SQL Injection". Oto co możemy dokonać: 1. Możemy sformułować nasze zapytanie do SQL tak:
2. Numer ID warto ustawiać w sposób $_GET['id'], lub $_POST['id'], można też ustawić go w nast. sposób:
Może nie ma tego dużo, ale jest to już jakaś podstawa do zabezpieczenia strony/skryptu przed prostym i niezwykle niebezpiecznym, SQL Injection. Proszę osoby obeznane w tym temacie, aby dopisały tu własne propozycje metod zabezpieczenia się przed tym atakiem. Ależ problem ;->.
I potem w kodzie, przed zapytaniami: Dla URL'i z tekstem i cyframi:
A dla URLi z cyframi zastosujemy
Zawsze trzeba kodowac w mysl zasady KISS - (keep it stupid simple). Pozdrawiam. Ten post edytował templar 30.09.2007, 21:45:08 |
|
|
30.09.2007, 22:34:53
Post
#162
|
|
Grupa: Zarejestrowani Postów: 690 Pomógł: 81 Dołączył: 6.04.2005 Skąd: Szczecin Ostrzeżenie: (0%) |
@templar a po co te regExpy? nie lepiej skorzystać z ctype?
-------------------- |
|
|
4.11.2007, 14:46:49
Post
#163
|
|
Grupa: Zarejestrowani Postów: 79 Pomógł: 0 Dołączył: 8.04.2007 Ostrzeżenie: (0%) |
a co z sql injection jezeli mam linki w mod_rewrite i nie da sie wpisac slowa bo mam zdefiniowana wartosc ([0-9]*). Chyba nie da sie tego w jakikolwiek sposob ominac bo wywala error 404, co o tym myslicie?
|
|
|
4.11.2007, 15:40:32
Post
#164
|
|
Grupa: Zarejestrowani Postów: 690 Pomógł: 81 Dołączył: 6.04.2005 Skąd: Szczecin Ostrzeżenie: (0%) |
zawsze istnieje możliwość odwołania się bezpośrednio do plików, ale to też można wyeliminować zerknij tu -> http://www.beldzio.com/modrewrite-jako-pie...knieciami.freez
-------------------- |
|
|
14.11.2007, 20:55:27
Post
#165
|
|
Grupa: Zarejestrowani Postów: 592 Pomógł: 62 Dołączył: 3.08.2006 Ostrzeżenie: (0%) |
nie lepiej skorzystać z ctype? Moim zdaniem lepiej skorzystać jest z is_numeric. Kiedyś testowałem te funkcje i ctype okazało się wolniejsze w działaniu -------------------- :]
|
|
|
15.11.2007, 00:25:56
Post
#166
|
|
Grupa: Zarejestrowani Postów: 690 Pomógł: 81 Dołączył: 6.04.2005 Skąd: Szczecin Ostrzeżenie: (0%) |
wg. manuala ctype jest szybsze, a raczej ich testy były dokładniejsze :-)
-------------------- |
|
|
15.11.2007, 22:23:22
Post
#167
|
|
Grupa: Zarejestrowani Postów: 76 Pomógł: 2 Dołączył: 15.11.2007 Skąd: Kraków Ostrzeżenie: (0%) |
Co do samego początku tematu:
czy nie można przefiltrować apostrofów: Kod $login = str_replace("`", "", $login); $login = str_replace("'", "", $login); (ewentualnie wywalić błędu)? A tak poza tym to przecież MySQL odpowiednio koduje hasła:
więć teoretycznie w czym problem?... -------------------- CPU | GPU | RAM | HDD | OS |
|
|
15.11.2007, 23:08:17
Post
#168
|
|
Grupa: Zarejestrowani Postów: 1 033 Pomógł: 125 Dołączył: 17.09.2005 Skąd: Żywiec Ostrzeżenie: (0%) |
Cytat A tak poza tym to przecież MySQL odpowiednio koduje hasła:
więć teoretycznie w czym problem?... Problem jest w tym, że wysyłając formularzem odpowiedni ciąg znaków mogę to zapytanie przerobić na:
A co do apostrofów, to ich użycie nie oznacza zawsze próby włamania. Zamiast usuwania ich albo wyrzucania błędu wystarczy umieścić przed nimi znaki ucieczki. -------------------- "Sumienie mam czyste, bo nieużywane."
|
|
|
23.12.2007, 23:40:39
Post
#169
|
|
Grupa: Zarejestrowani Postów: 2 291 Pomógł: 156 Dołączył: 23.09.2007 Skąd: ITALY-MILAN Ostrzeżenie: (10%) |
A wiec po Przeczytaniu chyba juz 10 raz tego tematu sam juz nie wiem co uzywac dla zmienne $_GET['id'] mam dawac
*(int) *intval() *Is_numeric() *is_integer ??Sam juz nie wiem co jest najlepsze do rzutowania typu cyfrowego -------------------- Zainteresowania: XML | PHP | MY(SQL)| C# for .NET | PYTHON
http://code.google.com/p/form-builider/ Moj blog |
|
|
2.01.2008, 11:10:54
Post
#170
|
|
Grupa: Zarejestrowani Postów: 1 033 Pomógł: 125 Dołączył: 17.09.2005 Skąd: Żywiec Ostrzeżenie: (0%) |
is_integer" title="Zobacz w manualu PHP" target="_manual nigdy nie zadziała dla $_GET, $_POST czy $_COOKIE. Dane w tych tablicach są zawsze typu string lub array
Stosuj rzutowanie: intval" title="Zobacz w manualu PHP" target="_manual lub (int) i sprawdzaj czy zapytanie zwróciło jakieś dane. Jeśli nie, to wyświetlasz informację "nie ma strony o podanym ID", "nie ma takiego newsa", "komentarz nie istnieje lub został usunięty" czy jaką tam chcesz. -------------------- "Sumienie mam czyste, bo nieużywane."
|
|
|
2.01.2008, 18:06:56
Post
#171
|
|
Grupa: Zarejestrowani Postów: 2 Pomógł: 0 Dołączył: 2.01.2008 Ostrzeżenie: (0%) |
|
|
|
2.01.2008, 20:29:42
Post
#172
|
|
Grupa: Zarejestrowani Postów: 690 Pomógł: 81 Dołączył: 6.04.2005 Skąd: Szczecin Ostrzeżenie: (0%) |
patrzac na szybko to nic ciekawego z tego co widze to nawet nie broni przez standardowym 1 =1
-------------------- |
|
|
2.01.2008, 20:35:44
Post
#173
|
|
Grupa: Zarejestrowani Postów: 2 Pomógł: 0 Dołączył: 2.01.2008 Ostrzeżenie: (0%) |
no ale jak się ma w wszystkie pisywane przecież zmienne w apostrofach np tak
select * from ... where cos = '$_GET['cos']' to obroni co nie? no i nie da sie uzyc select, union oraz exec. a to dopisanie 1 = 1 to chyba zadziala jesli zmienna nie jest w apostrofkach? |
|
|
3.01.2008, 00:03:29
Post
#174
|
|
Grupa: Zarejestrowani Postów: 690 Pomógł: 81 Dołączył: 6.04.2005 Skąd: Szczecin Ostrzeżenie: (0%) |
wszystko zalezy od konkretnego kodu, najlepsze zabezpieczenie to pisanie porzadnego kodu, a nie bawienie sie w polsrodki
-------------------- |
|
|
9.02.2008, 03:27:22
Post
#175
|
|
Grupa: Zarejestrowani Postów: 305 Pomógł: 25 Dołączył: 27.01.2007 Ostrzeżenie: (0%) |
Owszem dodaje, ale chyba tylko, gdy na serwerze jest włączone <span style="font-weight: bold;">magic_quotes_gpc</span> ? A jeśli nie to jakim prawem kolega mi się włamał? Znalazłem taką funkcję odnośnie tego problemu.
Przydatne porady |
|
|
10.03.2008, 12:27:05
Post
#176
|
|
Grupa: Zarejestrowani Postów: 206 Pomógł: 21 Dołączył: 1.09.2006 Skąd: Edinburgh Ostrzeżenie: (0%) |
Znalazłem taką funkcję odnośnie tego problemu.
Przydatne porady To ze zrodel PHP-Fusion? |
|
|
10.03.2008, 18:51:04
Post
#177
|
|
Grupa: Zarejestrowani Postów: 29 Pomógł: 2 Dołączył: 7.03.2008 Ostrzeżenie: (0%) |
Witka!
Mam pytanie odnośnie SQL Injection. Wszystkie dane przepuszczam przez filtry, nie dopuszczam, żednych danych do bazy bez obróbki. Case study: Mam formularz rejestracji, próbowałem w nim wpisać
Zwrócił: There was an error: Invalid User Name Specified and try again. Czy to znaczy, że skrypt jest jako tako bezpieczny? Macie może jakieś metody, żeby sprawdzić dany skrypt? |
|
|
10.03.2008, 22:35:51
Post
#178
|
|
Grupa: Zarejestrowani Postów: 305 Pomógł: 25 Dołączył: 27.01.2007 Ostrzeżenie: (0%) |
|
|
|
11.03.2008, 19:02:00
Post
#179
|
|
Grupa: Zarejestrowani Postów: 1 657 Pomógł: 125 Dołączył: 29.04.2006 Ostrzeżenie: (0%) |
Mam takie pytanie: "Od zawsze" bronię się przeciwko atakom SQL Injection, w ten sposób:
- mysql_real_escape_string - apostrof na wyrażenie( bo np. gdyby po czyimś wstrzyknięciu było "WHERE news_title = costam AND (...) --" to samo mysql_escape_string by nic nie dało.) Ostatnio czytałem bardzo wiele artykułów na temat bezpieczeństwa skryptów etc. i co raz bardziej mam wrażenie, że to co robię to za mało. Wiem, że pytanie jest głupkowate i "mogłem uważniej czytać", ale kiedyś czyjś artykuł wciska mi kit, że trza zrobić cośtam (a to sprawy bezpieczeństwa), a ja tego nie robię to strasznie mnie to stresuje, bo zaczynam wierzyć, że to prawda -------------------- |
|
|
11.03.2008, 19:09:01
Post
#180
|
|
Grupa: Zarejestrowani Postów: 1 873 Pomógł: 152 Dołączył: 9.04.2006 Skąd: Berlin Ostrzeżenie: (0%) |
Czego jeszcze Ci brakuje Wystarczy ze w zmiennych który wstrzykujesz w zapytanie "SELECT * FROM lol WHERE if='$id'" dajesz ' lub jeśli to ma być int dajesz (int)$_GET['ehh']; Tyle starcza... :] No i usuwanie wszelkich scripts embed ;P
-------------------- |
|
|
Wersja Lo-Fi | Aktualny czas: 26.04.2024 - 05:45 |