2017-10-27 3 views
0
CREATE OR REPLACE FUNCTION increment(key character varying) 
RETURNS character varying AS $$ 
BEGIN 
     SELECT code, name from tbl where $1; 
END; 
$$ LANGUAGE plpgsql; 


select * from increment('code = ''ati'' '); 

=> 통지 오류 "where $ 1";postgresql 오류로 함수를 작성하십시오.

+1

'$ 1'은'$ 1'을 의미합니다 - 그리고 varchar를 정의하십시오 ... 어쩌면 당신은 '이름 = $ 1;'tbl에서 이름을 선택 했습니까?'.. –

+0

당신은 where 절에 오류가 있습니다. ,'where column = $ 1'와 같아야합니다. – JustMe

+0

알아요. 그러나 함수의 매개 변수는 'name = ...'입니다. – NiemNV

답변

1

당신은 무엇을하려고하는 SQL 주입 예에 자두입니다 :

t=# CREATE OR REPLACE FUNCTION increment(key character varying) 
RETURNS character varying AS $$ 
BEGIN 
return format('SELECT code, name from tbl where %s',$1); 
END; 
$$ LANGUAGE plpgsql; 
CREATE FUNCTION 
Time: 1.179 ms 
t=# select * from increment('code = ''ati'' '); 
        increment 
------------------------------------------------ 
SELECT code, name from tbl where code = 'ati' 
(1 row) 

하지만 문이 반환을 제어하지 않는, 이쪽을 봐 :

t=# select * from increment('true; drop table b;'); 
         increment 
------------------------------------------------------ 
SELECT code, name from tbl where true; drop table b; 
(1 row) 
+0

어쩌면 dsql에서 키를 실행하여 true를 반환하는지 확인하십시오 :'execute 'select'|| some_boolean'을 입력하십시오. 오류가 발생하면 나머지는 실행하지 마십시오. – JustMe

+1

'''do $$ begin 실행 '선택 true; 드롭 테이블 b; '; 끝; $$ ;'''안전하게 낙하 된 테이블 –

+1

@JustMe 도움이되지 않을 것입니다; 공격자는 첫 번째 'EXECUTE'의 컨텍스트에서 작동하도록 공격을 조정할 수 있습니다. 다양한 컨텍스트에 대해 SQL 주입 공격을 구성하는 다양한 방법에 대한 많은 연구가 있습니다. – IMSoP

1

을 함수하지 않는 단순히 당신이 제공 한 변수를 연결하고 결과 SQL을 실행하면 전체 WHERE 절을 이와 같은 매개 변수로 전달할 수 없습니다.

가장 큰 이유는 보안입니다. 함수에 대한 입력이 궁극적으로 신뢰할 수없는 사용자 (예 : 웹 사이트의 입력)에서 발생했을 수 있으며 사용자가 임의로 검색어를 변경할 수 없게하려는 경우가 있습니다. 또한 사용하기가 어색 할 것입니다 : O'Reilly 성을 검색하려면 '이 이스케이프되었는지 여부를 추적하지 않으면 기능이 중단됩니다.

대신 쿼리와 데이터가 별도로 유지됩니다. WHERE $1이 작동하는 유일한 시간은 $1이 부울 인 경우입니다. 마찬가지로, WHERE name=$1은 오직 등 적절한 값 (아마 text 또는 varchar)에 대해 name을 비교합니다

당신은 정말 자주 경우 가끔 발생하는 동적 SQL 쿼리를 위해 필요하지만,하지 않은 경우 말했다 모든 DB를 잘 디자인 했으니 a plpgsql function with an EXECUTE statement을 사용할 수 있습니다.

SELECT code, name from tbl where code = $1; 

그런 다음 다른 사용 사례에 대해 변형 함수를 추가 할 수 있습니다, 또는 명시 적있다 :이 경우

, 당신은 아마 명시 적으로 그것을 확인하기 위해 입력 code의 값과 쿼리가되고 싶어요과 같은 부울 플래그는 동적 SQL의 위험과 복잡성이 없어도 다른 쿼리를 선택합니다.

관련 문제