2011-09-07 4 views
3

코드 삽입 가능성이 있는지 알고 싶습니다. (예 : 메모리 블록 읽기와 같은 보안상의 위험이 있습니다. 다음 시나리오에서 비화 데이터 (HTTP GET )은코드에서 배열의 KEY로 사용됩니다.PHP 배열 키 값으로 사용되는 HTTP GET 데이터의 PHP 삽입

문자를 알파벳 순서로 변환해야합니다. 2 B 1에, C 3 .... HTTP GET 당신은 아무것도 이해할 수있는 값의 편지를 가지고 있지만, 할을 생각 "문자"변수는 서버로 보낼 수 있습니다

HTML :

http://www.example.com/index.php?letter=[anything in here, as dirty it can gets] 

PHP :

$dirty_data = $_GET['letter']; 

echo "Your letter's order in alphabet is:".Letter2Number($dirty_data); 

function Letter2Number($my_array_key) 
{ 
    $alphabet = array("a" => "1", "b" => "2", "c" => "3"); 

    // And now we will eventually use HTTP GET unsanitized data 
    // as a KEY for a PHP array... Yikes! 

    return $alphabet[$my_array_key]; 

} 

질문 :

  1. 당신이 어떤 보안 위험을 볼 수 있습니까?
  2. HTTP 데이터를 배열의 KEY처럼 코드에서 사용할 수 있도록 위생 처리하는 방법은 무엇입니까?
  3. 이 연습은 얼마나 나쁜가요?
+0

참조 http://stackoverflow.com/questions/7341034/avoiding-xss-when-echoing-posted-html – powtac

+0

그것은 정확히이 코드의 보안 위험하지만,이 Letter2Number 추한 뭔가를 반환 할 수 있습니다 명심 것 이론적으로 코드의 다른 곳에서 보안 위험이 될 수있는 'NULL'과 같습니다. – someone

답변

6

이 연습에는 문제가 없습니다. 너 ... 뭐라해도 ... $_GET에서 가져 오는 것은 문자열이다. eval()에 전화하지 않으면 보안 위협이 전혀 없습니다. 모든 문자열을 PHP 배열 키로 사용할 수 있으며, 실제로는 긴 문자열을 사용하는 경우에도 메모리 사용에 영향을 미칠 수 있지만 역효과는 없습니다.

그것은 당신이 execut로 코드를 구축하고 SQL을처럼하지 에드 이상 - PHP 코드는 이미 구축하고 execut 을 보내고, 당신은 그것을에서 실행되는 방식을 수정할 수있는 유일한 방법입니다되었습니다 런타임은 eval() 또는 include()/require()을 호출하여 수행합니다. 그것에 대해 생각

편집

이 입력 스크립트의 작동에 영향을 줄 수 있다는 eval()include()에서 떨어져 다른 몇 가지 방법이 있고, 그에 공급 된 문자열을 사용하는 것입니다 함수/메소드를 동적으로 호출하거나, 객체를 인스턴스화하거나, 다양한 변수/속성에서 호출 할 수 있습니다. 그래서 예를 들면 : 당신이 먼저 $userdata 살균으로 작업을 수행하는 경우

$userdata = $_GET['userdata']; 

$userdata(); 
// ...or... 
$obj->$userdata(); 
// ...or... 
$obj = new $userdata(); 
// ...or... 
$someval = ${'a_var_called_'.$userdata}; 
// ...or... 
$someval = $obj->$userdata; 

는 ..., 아주 나쁜 생각이 될 것입니다.

그러나 현재하고있는 일에 대해 걱정할 필요가 없습니다.

+0

매우 유익한 답변을 주셔서 감사합니다 DaveRandom :) –

+0

PHP는 불행히도 $ _GET의 모든 내용이 문자열임을 보장하지 않으며, 배열 일 수도 있습니다. https://www.owasp.org/index.php/PHP_Security_Cheat_Sheet#Input_handling을 참조하십시오. 이것은 특히 PHP가 종종 놀라운 결과와 함께 유형 오류를 자동으로 전달하기 때문에 사용자 입력과 관련된 모든 대답을 복잡하게합니다. – spookylukey

3

GET, POST, FILE 등으로받은 외부는 불결한 것으로 취급해야하며 적절하게 위생 처리해야합니다. 언제 어떻게 위생 처리 하는가는 데이터가 언제 사용되는지에 달려 있습니다. DB에 저장하려면 SQL Injection을 피하기 위해 이스케이프해야합니다 (예 : See PDO). 이스케이프는 eval과 같은 사용자 데이터를 기반으로하는 OS 명령을 실행하거나 파일 읽기를 시도 할 때 필요합니다 (예 : ../../../etc/passwd 읽기와 같음).사용자에게 다시 표시하려면 인코딩해야합니다 (html 삽입을 피하기 위해 예 : See htmlspecialchars).

위의 사용 방법에 따라 데이터를 위생 처리 할 필요가 없습니다. 실제로 저장을 위해 이스케이프 처리하고 표시를 위해 인코딩해야하지만 그렇지 않은 경우 데이터를 그대로 유지해야합니다. 물론 데이터에 대한 자체 유효성 검사를 수행 할 수도 있습니다. 예를 들어 dirty_data[a, b, c]의 목록에 넣고 사용자에게 다시 표시하지 않을 수 있습니다. 그렇다면 그것을 인코딩해야합니다.

잘 알려진 OS는 사용자가 잘못된 메모리 주소를 읽으 려해도 문제가 없을 것입니다.

0
  1. 아마도이 배열의 내용은 이렇게 공개적으로 액세스 할 수 있습니다.
  2. 까지 실행하십시오. array_key_exists()
  3. 아마 조금 나빠질 것입니다. 무효화 된 멀티 바이트 문자열이나 제대로 구성되지 않은 서버에서 어떤 종류의 오버 플로우를 유발할 수있는 무언가가 있을지도 모르지만 그것은 내 생각에 순수한 (무지한) 추측입니다.