2016-12-09 8 views
1

드롭 다운 메뉴를 구현하기위한 다음 코드가 있습니다. 사용자는 두 값을 선택하고, 상기 입력에 기초하여 상기 쿼리에 해당 열이 사용자에게 표시하기 위해 선택 :Fortify에서 SQL 삽입을 처리 할 수있는 접근법

String sql = "SELECT :first, :second from <table>"; 
sql = sql.replace(":first", <first_user_input>); 
sql = sql.replace(":second", <second_user_input>); 

지금, 포티는 SQL 인젝션 있도록 이러한 라인을 잡는다. 제 질문은 입니다. 요새화는 솔루션으로 RegEx 기반 화이트리스트를 사용합니까?

나는 다음과 같은 접근 방식 채택의 생각

:

if(isValidSQL(<first_user_input>) && isValidSQL(<second_user_input>)) 
{ 
    sql = sql.replace(...); 
} 
else 
    throw new IllegalSQLInputException 

하고 그래서

public boolean isValidSQL(String param) 
{ 
    Pattern p = Pattern.compile([[A-Z]_]+); //RegEx for matching column names like "FIRST_NAME", "LNAME" etc. but NOT "DROP<space>TABLE" 
    Matcher m = p.matcher(param); 
    return m.matches(param); 
} 

, 이 요새화 것 유효한 화이트 리스팅 방법으로 이것을 받아 들일를? 포티는 아래의 문법에 작동하는 경우 :

valid_sql := <immutable_string_literal> //Something like "SELECT * FROM <table> WHERE x = ?" or //SELECT * FROM <table> 
valid_sql := valid_sql + valid_sql //"SELECT * FROM <table>" + "WHERE x = ?" 

는 내가 정규식 기반의 화이트리스트가 작동합니다 생각하지 않습니다. 이 경우 런타임에 고정 된 문자열을 추가하기 때문에 this example 만 작동합니다. 방대한 양의 switch-case 문장이 생기기 때문에이 방법을 선호하지 않습니다.

는 위에서 언급 한 접근 방식을 시도한 후, 나는 포티 여전히 잠재적 인 위협으로 라인을 잡는 것을 발견,

답변

1

그래서 감사합니다. 그러나 Fortify가 작동하는 방식에 대해 읽은 후에 Fortify 자체 또는 XML 구성 파일에 정의 된 회사 규칙에서 "엄격함"이 올지 확실하지 않습니다. 기업 규칙에 따라 정규 표현식 기반 화이트리스트 작성이 가능하면 트릭을해야한다고 생각합니다.