2014-04-12 6 views
0

PHP 코딩에 대한 의견이 필요합니다. 이것이 SQL injection에 안전하다면 특별히 궁금합니다. 분명히있을 것 같지만 잘못되었을 수도 있습니다.이것은 SQL 주입을 방지하는 안전한 방법입니까?

그리고이 "코딩 스타일"은 수용 가능하거나 정말로 나쁜 습관이라고 생각합니까?

$validinputs = array(1,9,21,'a','b'); 

if(in_array($_GET['search'], $validinputs)) 
{ 
    $queryfilter = " = " . $_GET['search']; 
} 
else 
{ 
    $queryfilter = "IS NOT NULL"; 
} 

(...) 

$query = "SELECT * FROM `table` WHERE `field` {$queryfilter}"; 

고마워요!

편집 :이 경우 해당 필드에 대해 유일한 유효한 검색어이기 때문에이 경우 $ validinputs와 비교됩니다. 다른 검색어는 아무 것도 반환하지 않습니다.

+5

가능한 모든 검색어를 허용하고 싶습니까? 그것을 포기하고 준비된 진술을 대신 사용하십시오. –

답변

0

이상적으로, 당신은 저장 프로 시저를 사용하십시오 당신의 쿼리는 ...과 같이

$query = "call find_in_table('" . $_GET['search'] . "')"; 

보일 것입니다 ...하지만 매우 엄격를 전달하기 전에이를 필터링하는 당신이 허용 입력의 목록을하고 있기 때문에 쿼리 문자열로, 나는 당신이 SQL 인젝션으로부터 상당히 안전하다고 말했을 것이고 저장 프로 시저를 사용하는 것은 보안 기능보다 당신을위한 성능 향상 일 것입니다.

+1

왜 "이상적"이라고 부릅니까? –

+0

@YourCommonSense.이 저장 프로 시저가 저장 프로 시저의 작동 방식에 따라 필터링되지 않은 사용자 입력을 포함하는 동적 코드를 사용하지 않는 한 악의적 인 SQL을 저장 프로 시저에 삽입하기가 어렵 기 때문에. 동적 SQL을 사용하면 유효하지 않은 유효성 검사로 인해 악성 코드가 누출 될 가능성이 높아집니다. – gfish3000

+0

Stored Procedure! = Prepared Statement. –

1

제 의견으로는 이것은 허용 가능하지만 좋은 습관이 아닙니다. 표준 SQL 이스케이프 함수를 사용하지 않는 이유는 무엇입니까? 클래스에서 래핑 될 때 이들은 정말 강력하고 유지 보수가 가능합니다. 나는 누군가가이 방법으로 문자열을 자주 벗어나야 할 때 응용 프로그램/스크립트를 유지하려고한다고 생각하지 않습니다. 아마도 엄청난 혼란을 야기 할 수 있습니다.

관련 문제