Go Postgresql에서 SQL 주입 방지

Oct 02 2020

Go의 postgresql 주입 포럼에서 조사한 결과 아래와 같은 SQL 주입에서 유용한 정보를 찾았습니다.

Golang을 사용하여 SQL에서 IN 조회를 실행하는 방법은 무엇입니까?

Go에서 "database / sql"을 사용하는 동안 SQL 주입 공격을 방지하려면 어떻게해야합니까?

하지만 Go의 코드가 다른 종류의 코드와 사용 사례를 사용하기 때문에 여전히 조언이 필요합니다. 조언이 필요한 사용 사례 / 질문은 다음과 같습니다.

  1. 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)
  2. 매개 변수가 %d대신 사용 하는 경우 fmt.Sprintf를 사용하여 쿼리를 생성하는 것이 안전 %s합니까?
  3. 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 등

  1. 예, 가능하면 피할 가치가 있지만 정수 매개 변수와 함께 fmt.Sprintf를 사용하여 SQL을 작성하는 것이 안전하지만 세 번째 매개 변수는 % s입니다. 피하고?
  2. 예, 정수 매개 변수와 함께 fmt.Sprintf를 사용하는 것이 안전하지만 % s 또는 % v는 훨씬 더 위험하므로 피하고 싶습니다. 왜 필요한지 생각할 수 없습니다.
  3. 여기에 자리 표시자를 사용하면 안전합니다.

일반 규칙:

  • 기본적으로 자리 표시자를 사용합니다. 예를 들어 IN 쿼리에서와 같이 % d를 사용하는 경우는 드뭅니다.
  • 유효성 검사 또는 사용 전에 매개 변수를 정수와 같은 유형으로 구문 분석
  • 가능한 경우 문자열 연결을 피하고 특히 문자열 매개 변수에주의하십시오.
  • 열 및 테이블 이름과 같은 것을 항상 하드 코딩하고 사용자 입력에서 생성하지 마십시오 (예 :? sort = mystringcolname).
  • 가져온 매개 변수가 해당 사용자에게만 승인 된 매개 변수인지 항상 확인하십시오.