2009-10-15 4 views
1

저는 주입 공격을 막기 위해 데이터를 살균하는 가장 좋은 방법에 대해 생각하고 있습니다. 어떤 사람들은 결과를 출력하기 직전이나 데이터베이스에 삽입하기 직전에 위생 처리를하고 싶지만 ... 이것으로 보는 문제는 두 가지입니다. (1) 매개 변수/변수를 놓친다면 어떨까요? (2) 만약 당신이 over-sanitizing이라면? 그것이 결과물을 손상시킬 수는 없지만 이미 알고있는 물건들을 위생적으로 말하는 것은별로 안전하지 않습니다.GET 및 POST 데이터 만 살균하는 경우 주사로부터 안전합니까?

예를 들어, PHP 대신 $_GET$_POST을 사용하여 내가 좋아하는 뭔가 그 래핑 없습니다 :

function get($var) { 
    return my_sanitizer($_GET[$var]); 
} 

을하거나 충분하지 않을까요? 악의적 인 코드가 어디에서 몰래 빠져 나갈 수 있습니까?


아래 답변을 읽은 후이 질문은 약간 어리 석다는 것을 알고 있습니다. 그것은 데이터베이스에 삽입하거나 HTML을 출력하는지에 달려 있습니다. 이 경우 아마도 사용하기 바로 전에 입니다. 그래도 괜찮아요. 출력 방법을 너무 쉽게 감쌀 수 있습니다 ...

답변

5

소독 할 수 있습니다. 예를 들어, 일반적으로 HTML 및 JS는 출력되기 전에 언제든지 위생적으로 또는 이스케이프 처리해야합니다. 그러나 적절한 선택 (예 : 모든 HTML 제거, 허용 목록에 HTML 허용, 사용자가 다른 항목 입력 또는 문자 그대로의 이스케이프)은 응용 프로그램에 따라 다릅니다.

데이터베이스 삽입에 관한 한, Nate와 (이 경우 내부적으로 이스케이프를 사용하지만 사용자의 우려가 아닌) 때때로 준비된 문을 사용해야합니다.

요약하면 데이터를 가져 와서 직접 실행하는 수제 캐치 올 my_sanitizer는 데이터가 잘못된 선택 일 수 있습니다.

+0

오른쪽. 내 머리가 오른쪽으로 밀려서는 안된다 : 나는 여러 종류의 주사가 있다는 것을 알고있다. 그러나 무엇인가의 이유 때문에 나는 모든 경우에 트릭을 할 것이라고 생각했다. 당신은 그 데이터로하고 있습니다. – mpen

1

개인적으로 데이터베이스에 삽입하기 전에 개인적으로 저는 항상 살균을합니다. SQL 기반 데이터베이스를 매개 변수화 한 SQL 및 sprocs가 위험을 초래할 수있는 것을 주입하지 않도록하기위한 방법입니다.

1

당신은 $ _POST 나 $ _GET 배열의 foreach 문을하고 위생 개 이상의 종류 및 주입 한 개 이상의 종류가있어 모든

foreach($_POST as $key){ 

$_POST[$key] = addslashes($_POST[$key]) }

+0

이 기능은 권장되지 않습니다. mysqli_real_escape_string()과 같은 데이터베이스 관련 함수 나 더 나은 저장 프로 시저를 사용해야한다. –

+2

또한 위생 처리는 SQL에만 해당되는 것이 아니므로 페이지에 출력 할 경우 HTML 및 JS를 염두에 두어야합니다. – rslite