Zapobiegaj wstrzykiwaniu SQL w Go Postgresql
Oct 02 2020
Przeszukałem forum postgresql injection w Go i znalazłem kilka przydatnych informacji w SQL injection jak poniżej:
Jak wykonać wyszukiwanie IN w SQL za pomocą Golanga?
Jak mogę zapobiec atakom typu SQL injection w Go, używając „database / sql”?
ale nadal potrzebuję porady, ponieważ mój kod w Go używa innego rodzaju kodu i innych zastosowań. niektóre przypadki / pytania, dla których potrzebuję porady, są takie
INSERT INTO a (a1,a2,a3) VALUES (%d,%d,%s)Wiem, że używanie zapętlenia zapytań do wielokrotnego wstawiania, jak przy użyciu fmt.Sprintf, jest złe. więc czy jest jakieś rozwiązanie dla tego zapytania pętli dla wstawiania? Dawny:INSERT INTO a (a1,a2,a3) VALUES (%d,%d,%s),(%d,%d,%s),(%d,%d,%s)- Czy używanie fmt.Sprintf do generowania zapytania jest bezpieczne, jeśli parametr używa
%dzamiast%s? - Używanie instrukcji Prepare i Query jest bezpieczne, ale co, jeśli używam funkcji Select (używając $1,$2) i funkcja NamedQuery (przy użyciu struktury o nazwie). Np .:
Select * from a where text = $1-> Czy używanie tego jest$1bezpieczne? i Ex:Select * from a where text = :text-> czy to jest bezpieczne w funkcji NamedQuery?
Uprzejmie potrzebuję twojej rady. Dziękuję Ci!
Odpowiedzi
5 KennyGrant Oct 02 2020 at 18:20
Po pierwsze, zazwyczaj wolisz używać symboli zastępczych db? 1 USD itp.
- Tak, używanie fmt.Sprintf z parametrami całkowitymi do budowania SQL jest bezpieczne, chociaż warto tego unikać, jeśli możesz, ale Twoim trzecim parametrem jest% s - unikaj tego i używaj?
- Tak, używanie fmt.Sprintf z parametrami całkowitymi jest bezpieczne, ale% s lub% v jest znacznie bardziej ryzykowne i unikałbym tego, nie mogę pomyśleć, dlaczego miałbyś go potrzebować.
- Użyj tutaj symboli zastępczych, więc tak, jest to bezpieczne.
Główne zasady:
- Używaj domyślnie symboli zastępczych, rzadko używaj% d (na przykład w zapytaniu IN)
- Analizuj parametry na typy takie jak liczba całkowita przed jakąkolwiek walidacją lub użyciem
- Unikaj łączenia ciągów, jeśli możesz, i bądź szczególnie ostrożny w przypadku parametrów ciągów
- Zawsze twardo koduj takie rzeczy, jak nazwy kolumn i tabel, nigdy nie generuj ich na podstawie danych wejściowych użytkownika (np.? Sort = mystringcolname)
- Zawsze sprawdzaj, czy otrzymane parametry są tylko autoryzowanymi dla tego użytkownika