문제

PostgressQL과 함께 그런 것을 사용할 때 SQL 주입에 안전한 지 알고 싶습니다.

CREATE or REPLACE FUNCTION sp_list_name( VARCHAR )
RETURNS SETOF v_player AS '
   DECLARE
      v_start_name ALIAS FOR $1;
      r_player  v_player%ROWTYPE;
      v_temp VARCHAR;
   BEGIN
      v_temp := v_start_name || ''%'';
      FOR r_player IN
         SELECT first_name, last_name FROM v_player WHERE last_name like v_temp
      LOOP
         RETURN NEXT r_player;
      END LOOP;
      RETURN;
   END;
' LANGUAGE 'plpgsql' VOLATILE;

이 기능을 사용하여 편지로 시작하는 플레이어의 이름을 나열하고 싶습니다.

select * from sp_list_name( 'A' );

A로 시작하는 성을 가진 플레이어를 제공합니다.

SQL을 주입하려고했습니다

select * from sp_list_name( 'A; delete from t_player;--' );
select * from sp_list_name( '''; delete from t_player;--' );

내가 안전한가요?

어떤 경우를 주사 할 수 있습니까?

문안 인사

도움이 되었습니까?

해결책

절차 측면에서 SP의 변수가 코드로 확장되지 않기 때문에 안전 해 보이지만 매개 변수화 된 쿼리를 사용하지 않으면 여전히 자신을 노출시킬 수 있습니다. "SELECT * FROM sp_list_name(?);"당신의 응용 코드. "SELECT * FROM sp_list_name('$start_name');"시작 이름을 전달하는 사용자가"전복 될 수 있습니다 "');delete from t_player where last_name NOT IN ('". 따라서 매개 변수화 된 쿼리를 사용하거나 정신성을 선택하십시오. 프로그램에서 입력을 확인하십시오.

NB : 다른 사람들에게는 저장된 절차의 변수가 ~ 아니다 '또는;, (전달을 제외하는 경우에도 코드로 확장 실행하다, 당신이 사용할 것입니다 quote_literal, 손으로 롤링되지 않습니다 replace 함수) 그렇게 대체; 또는 '완전히 불필요합니다 (저장된 절차에서 그것을 사용하는 응용 프로그램은 물론 다른 이야기입니다).tl;dr" 또는 "O'Grady"팀.

Leo Moore, Karl, LFSR 컨설팅: v_temp_name 저장된 절차에서 아니다 SP에서 코드로 확장됩니다 (no 실행하다), SP가 아닌 응용 프로그램에서 확인해야합니다 (또는 OP는 대신 앱 코드에서 매개 변수화 된 쿼리를 사용할 수 있습니다). 다른 사람들이 제안하는 것은 걱정하는 것과 비슷합니다

my $bar = "foo; unlink('/etc/password');"; 
my $baz = $bar;

실제로 평가가없는 상태에서 해제를 실행합니다.

다른 팁

규칙 #1 SQL 주입을 방지하기위한 규칙 #1 : 누군가로부터 오는 모든 입력/신뢰할 수 없거나 통제 할 수없는 모든 입력을 소독합니다.

문제 자체는 데이터베이스 코드 내에있는 것이 아니라 해당 문을 실행하는 응용 프로그램에서 나옵니다.

SQL 주입로부터 보호하는 적절한 방법은 흰색 목록* - 길고 짧은 것은 당신이 그들을 받아들이고 필터링 할 문자를 설정합니다.

잘못된 방법은 블랙리스트 - 블랙 리스팅 캐릭터가 허용되지 않는 것이 문제로 이어질 것입니다. 당신은 할 수 없습니다 공격자를 계속 유지하십시오. ASCII 테이블, 탈출 문자 및 그렇지 않은 것을 통해 블랙리스트 주변에 방법이 있습니다.

또한 여기에 좋은 것입니다 컨닝 지 사이트에서 시험해보십시오. 테스트를 실행하고 실패하는 것을 시도하십시오.

* 응용 프로그램에서 DB가 아닌 (James에게 감사합니다)

당신은 스스로 SQL을 생성하지 않으므로 이것은 안전하게 보입니다 (나에게).

저장 프로 시저 호출하는 데이터가 어디에서 왔는지 모르겠습니다. 따라서 여전히 버퍼 오버플로를 방지해야합니다.

심판 흰색 목록. 다른 조건을 따르는 경우 괜찮습니다. 모든 입력을 가장 간단한 형태로 나누는 것이 절대적으로 필수적이므로 SQL 쿼리 이름, 단일 따옴표 등을 확인하지 마십시오. 다른 문자 세트를 사용하여 표현하거나 인코딩 할 수 있으며 이것은 흰색 목록의 일부를 구체적으로 형성하는 것입니다. SQL 키워드 자체.

사용자 이름 /비밀번호를 보호 된 리소스로 허용하는 특정 클라이언트를 위해 일하고있었습니다 (궁극적으로 공항의 안전한 부분으로 액세스 할 수 있습니다!). 입력 한 다음 SQL 쿼리를 구축하여 사용자 계정 및 비밀번호를 검색하여 로그온 필드를 우회 할 수 있습니다.

문제는 고객이 이미 웹 개발을 한 적이없는 것처럼 보이는 공급 업체와 함께 사이트를 제작 한 것입니다. 이 수정은 추가 £ 60k로 유사한 func () 인 Union, Select, et al key Words를 확인하는 것만 확인했습니다. 그들이 카니 콜리 화 /인코딩을 위해 무엇을했는지 물었을 때 (설명해야했던)는 회전 시간이었습니다.

Dev House와 (비싼) 프로젝트가 통합되었습니다.

내용을 검증하는 것을 고려할 수 있습니다

 v_start_name 
. 준 콜론, 댓글 문자, 평등 등을 확인하십시오. 숯과 16 진수 값을 모두 확인해야합니다. 'Smith-Brown'이 허용 될 수있는 하이픈 이름을 허용하는 것을 잊지 마십시오. 'Smith'는 잠재적으로 주입됩니다.

SQL 주입의 16 진수에 익숙하지 않은 경우 다음은 빠른 소개입니다.

http://www.arejae.com/blog/sql-injection-attack-using-t-sql-and-hexadecimal.html

http://www.securityfocus.com/infocus/1768

DECLARE
      v_start_name ALIAS FOR $1;
      r_player  v_player%ROWTYPE;
      v_temp VARCHAR;
   BEGIN
      --  new pseudo code here
      if v_start_name has bad chars exit with error message
      -- end pseudo code here
      v_temp := v_start_name || ''%'';
      FOR r_player IN
         SELECT first_name, last_name FROM v_player WHERE last_name like v_temp
      LOOP
         RETURN NEXT r_player;
      END LOOP;
      RETURN;
   END;

Karl에 대한 안부

";" 등. 즉

v_clean_name VARCHAR;
Select v_clean_name = Replace(v_start_name,';','');

이것은 다음을 대체 할 것이다; 블랭크가 SQL 주입 공격을 장착하여

자세한 내용은 참조하십시오 postgressql의 문자열 함수

LFSR 컨설팅도 언급했습니다. 화이트리스트가 더 낫습니다 (즉, 블랙리스트보다는 ';'; ';'와 같은 잘못된 문자로 입력을 처리하지 않는 것이 좋습니다 (즉, 사용자가 교체에 대해 SQL 주입 공격을 수행 할 수 있으므로 데이터를 정리하려고합니다).

더 많은 정보를 보려면 살펴보십시오 SQL 주입 공격

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top