2017-12-21 14 views
0

나는 ... 대답이 더 있지만 더 나은 용서를 요청하는 것보다 지금 물어 없습니다 꽤 확신저장 프로 시저를 사용할 때 데이터를 위생해야합니까?

나의 이해는 우리가 서버 측 코드에서 쿼리를 작성하고 실행할 때 SQL 주입은 일반적으로 발생한다는 것입니다 직접 그래서 데이터베이스에 대해 :

db.any('SELECT * FROM Foo WHERE id = '${bar}') 

우리가 저장 프로 시저, 안전하게 항상를 사용하지만 경우에? 우리가

db.any('SELECT * FROM Foo WHERE id = $1', [bar]) 

를 사용하는 경우 내 이해 (그리고 나는이 주제에 대한 검색을 찾을 수 있었던 것과) 한 것을 우리가 적절한 유형을 사용하는 한,이 유형 캐스트를 줄 경우 발생되기 때문에 열 ID와 일치하는 유형이 아닙니다. 어떤 ID가 캐릭터가 변화 또는 텍스트 필드하지만 우리는이 같은 한 경우 :

const bar = "1'; DROP TABLE users;"; 
db.any('SELECT * FROM Foo WHERE id = $1', [bar]) 

겠습니까을이 캐릭터가 변화 또는 텍스트 필드 것을 이야기하고 안전하게 데이터베이스에 입력 (이 경우 포스트 그레스에서)? ? 또는 안전을 위해 저장 프로 시저로 보내기 전에 데이터를 살균해야합니까?

답변

0

예 적어도 문자열 필드의 경우 SP에서 값을 사용하기 전에 위생 처리가 필요합니다.

const bar = "1'; DROP TABLE users;"; 
db.any('SELECT * FROM Foo WHERE id = $1', [bar] 

당신이 id이 문자열 인 경우 SQL 주입을 만듭니다 언급이 시나리오.

1

기능 내부에서 어떤 일이 발생하는지에 따라 다릅니다.

동적 SQL을 캡슐화하는 함수의 유일한 장점은 매개 변수의 유형을 검사하여 매개 변수가 문자열이 아니면 동적 SQL을 안전하게 유지한다는 것입니다.

EXECUTE format('SELECT * FROM Foo WHERE id = %s', bar); 

또는

EXECUTE 'SELECT * FROM Foo WHERE id = ' || quote_literal(bar); 
: 그 외에는

, 당신은 일반적인 구조 중 하나를 사용해야합니다