2012-01-16 4 views
1
내가 취약점에 대한 내 스크립트를 확인하고 있었고, 매우 불안하다 내가 과거에 수행하는 데 사용되는 방법을 충격을 받았다

:

foreach ($_GET as $key => $value){ 
    $$key = $value; 
} 

이하

extract($_GET); 

스크립트에서 사용 된 이름과 일치하도록 일부 POST/GET 변수를 방화 광으로 변경했습니다. 이름을 올바르게 추측 할 수 있다면 덮어 쓸 수 있습니다 ().

그래서 나는이 같은 이름 개별적으로 그것을 할 수 있다고 생각 : $ allowed_vars는 =

$allowed_vars = array("time","hotfile","netload","megaupload","user","pfda","xyz","sara","amount_needed"); 
    foreach ($_GET as $key => $value) 
     { 
      if (in_array($key,$allowed_vars)) 
       { 
        $$key = $value; 
       } 
     } 

이 방법은 개별적으로 명명 이상의 시간을 절약 할 수 있습니다.

어떤 종류의 자동화가이 용도로 사용해야합니까?

+4

왜 처음부터 개별 변수로를 할당해야 할 :이 간단한 도우미 함수처럼

는 SET 문을 생산하는? '$ _GET [ 'time']'등을 사용할 수 없습니까? – JJJ

+2

FYI, foreach의 외부에'$ allowed_vars'를 넣을 것입니다. 매번 설정할 이유가 없습니다. –

+0

@Juahana 1. 사용의 용이성, 2. 탈출 방지. 그냥 스타일 코딩, 여기에 진짜 질문이 아니 – Email

답변

4

나는 어떤 종류의 자동문도 사용하지 않습니다.
요청 변수를 전역 변수에 자동으로 할당하는 일은 없습니다.
변수가 하나 또는 두 개이면 수동으로 처리 할 수 ​​있습니다.
더 많은 정보가 있으면 편리하게 처리 할 수 ​​있도록 배열 멤버로 유지해야합니다.

그러나 나는 당신과 비슷한 일종의 허용 목록 접근 방식을 사용하고 있습니다. 하지만 POST 데이터에서 전역 변수를 작성하지 않고 SQL 조회에 해당 데이터를 추가하십시오.

function dbSet($fields) { 
    $set=''; 
    foreach ($fields as $field) { 
    if (isset($_POST[$field])) { 
     $set.="`$field`='".mysql_real_escape_string($_POST[$field])."', "; 
    } 
    } 
    return substr($set, 0, -2); 
} 

$id  = intval($_POST['id']); 
$fields = explode(" ","name surname lastname address zip fax phone"); 
$query = "UPDATE $table SET ".dbSet($fields)." stamp=NOW() WHERE id=$id"; 
+0

마지막 인수에 무언가가 있습니다. 나는 코딩 스타일을 재고 할 것이다. – Email

+0

@Email : 이것은 일반적인 경우의 예입니다. 물론 예상 값을 얻고 싶습니다. 우편 번호 같은 것은 정말 우편 번호입니다. 또한 null 값을 사용하려면이 값을 약간 변경해야합니다. – Umbrella

0

내 경험상 $_REQUEST 배열의 데이터를 $$을 사용하여 변수로 변환하면 현재 범위 내에있는 변수를 덮어 쓸 가능성이 있기 때문에 변형해서는 안됩니다.

대신 데이터를 필터링하고 필요한 명명 된 변수에만 액세스하는 요청 개체 또는 배열을 고려해야합니다. 이렇게하면 허용 된 변수 이름을 계속 확장 할 필요가 없으며 보안을 유지할 수 있습니다.

예제의 ZF는 요청 객체를 가지고 있으며,이 데이터를 작업 할 때 그들이 입력 필터를 사용하는 것이 좋습니다 : http://framework.zend.com/manual/en/zend.filter.input.html

0

당신은보다 안전한 방법으로 추출 기능을 사용할 수 있습니다 :

extract($_REQUEST, EXTR_SKIP); 

이것은 코드에 이미있는 변수를 덮어 쓰지 않습니다. 사용할 수있는 다른 매개 변수에 대해서는 here을 참조하십시오.

+2

그러나 register_globals와 비슷한 구멍이 있습니다. $ admin 변수를 정의하지 않으면 일반 사용자의 경우이 방법으로 만들 수 있습니다. –

+0

@ Col.Shrapnel 확실합니다. 그런 상황을 피하기 위해 상식과 개발자 기술을 적용해야합니다. :) – SERPRO

+1

나는 extract() 함수를 피하고 싶습니다. –

3

조정하지 않고 더 많은 시간을 절약 할 수 있습니다. 그냥 $ _GET 배열에서 사용하십시오. 이 기능의 장점은 스크립트 변수와의 충돌을 피하는 것이 아니라 요청 매개 변수를 추가 할 때 "자동"을 업데이트 할 필요가 없다는 것입니다.

나는 폼으로, POST 데이터로 작업하고, 나는 종종 각 명시 적으로 처리 :이 방법으로

$data = array(); 
$data['field1'] = someSaniFunction($_POST['field1']); 
$data['field2'] = someOtherFunction($_POST['field2']); 
... 

내가 각 필드가 제대로 처리되었는지 확인하고 내가 기대 필드 만이 감동을 .

+0

나는 1 단어로 자동 연산을 재 작성하는 것이 $ _POST [ 'something']로 변수를 쓰는 추가 시간보다 더 많은 시간을 절약한다고 생각합니다. 2+ times – Email