Go Postgresql에서 SQL 주입 방지
Oct 02 2020
Go의 postgresql 주입 포럼에서 조사한 결과 아래와 같은 SQL 주입에서 유용한 정보를 찾았습니다.
Golang을 사용하여 SQL에서 IN 조회를 실행하는 방법은 무엇입니까?
Go에서 "database / sql"을 사용하는 동안 SQL 주입 공격을 방지하려면 어떻게해야합니까?
하지만 Go의 코드가 다른 종류의 코드와 사용 사례를 사용하기 때문에 여전히 조언이 필요합니다. 조언이 필요한 사용 사례 / 질문은 다음과 같습니다.
INSERT INTO a (a1,a2,a3) VALUES (%d,%d,%s)fmt.Sprintf를 사용하는 것과 같이 여러 삽입에 쿼리 루핑을 사용하면 sprinft를 사용하는 것이 나쁘다는 것을 알고 있습니다. 삽입에 대한이 루프 쿼리에 대한 해결책이 있습니까? 전의:INSERT INTO a (a1,a2,a3) VALUES (%d,%d,%s),(%d,%d,%s),(%d,%d,%s)- 매개 변수가
%d대신 사용 하는 경우 fmt.Sprintf를 사용하여 쿼리를 생성하는 것이 안전%s합니까? - Prepare 문과 Query를 사용하는 것은 안전하지만 Select 함수를 사용하는 경우 $1,$2) NamedQuery 함수 (명명 된 구조체 사용) 예 :
Select * from a where text = $1->이$1안전을 사용 하고 있습니까? 예 :Select * from a where text = :text-> NamedQuery 함수에서 안전합니까?
친절하게 조언이 필요합니다. 감사합니다!
답변
5 KennyGrant Oct 02 2020 at 18:20
첫째, 일반적으로 db 자리 표시자를 사용하는 것을 선호합니까? $ 1 등
- 예, 가능하면 피할 가치가 있지만 정수 매개 변수와 함께 fmt.Sprintf를 사용하여 SQL을 작성하는 것이 안전하지만 세 번째 매개 변수는 % s입니다. 피하고?
- 예, 정수 매개 변수와 함께 fmt.Sprintf를 사용하는 것이 안전하지만 % s 또는 % v는 훨씬 더 위험하므로 피하고 싶습니다. 왜 필요한지 생각할 수 없습니다.
- 여기에 자리 표시자를 사용하면 안전합니다.
일반 규칙:
- 기본적으로 자리 표시자를 사용합니다. 예를 들어 IN 쿼리에서와 같이 % d를 사용하는 경우는 드뭅니다.
- 유효성 검사 또는 사용 전에 매개 변수를 정수와 같은 유형으로 구문 분석
- 가능한 경우 문자열 연결을 피하고 특히 문자열 매개 변수에주의하십시오.
- 열 및 테이블 이름과 같은 것을 항상 하드 코딩하고 사용자 입력에서 생성하지 마십시오 (예 :? sort = mystringcolname).
- 가져온 매개 변수가 해당 사용자에게만 승인 된 매개 변수인지 항상 확인하십시오.