2011-04-20 2 views
0

좋아요,이 코드가 생겼어.하지만 어떻게 든 추한 것 같아. 더 잘 수행 될 수 있습니까?

if (isset($_GET['lang'])) { 
    $lang = $_GET['lang']; 
    if ($lang == 'en') { 
     $_GET['method']($lang); 
    } 
    elseif ($lang == 'nl') { 
     $_GET['method']($lang); 
    } 
    else { 
     $_GET['method']($lang); 
    } 
} 
else { 
    $lang = ''; 
    $_GET['method']($lang); 
} 
+3

'index.php? method = eval & lang = whatever()'를 허용한다면'isset'을 사용해서는 안됩니다. – mario

+0

''배열 인덱스가 설정되지 않았습니다 '경고를 막기 위해'isset'에 대해 걱정해야합니다. 아니면 경고를 무시할 수도 있습니다. 그러나 가장 좋은 방법은'isset'을 사용하여 그것을 피하는 것입니다. – Spudley

+0

@mario : 예제가 작동하지 않지만, eval은 함수가 아닙니다. 대신 컨텍스트 및 보안 문제를 고려할 때 assert;) – NikiC

답변

4
function GET($name, $default=null) 
{ 
    if (!isset($_GET[$name])) 
     return $default; 
    return $_GET[$name]; 
} 

$method = GET('method'); // Don't forget to error-check $method too, or it will be a major security hole! 
$method(GET('lang','')); 
+0

+1을 사용하십시오. –

+0

+ 1 브라우저에서 직접 호출 할 임의의 함수 이름을 지정할 수있는 주요 보안 구멍을 지적하기 위해 +1. – Spudley

+0

분명하지 않습니까? :) 어쨌든,이 방법 외에도 일반적으로 내 프로젝트에는 쿼리 매개 변수가 적절한 값인지 여부를 자동으로 검사하여 적절하게 캐스팅하는 GETint() 메서드가 있습니다. 정수는 매개 변수의 문자열만큼 일반적이기 때문입니다. 물론 POST() 및 POSTint()도 이에 해당합니다. –

0

당신이 상관없이 $ LANG의 값이 무엇인지 $_GET['method']($lang)에 의도하지 나타납니다. 따라서 값을 확인하지 마십시오. 그냥 결정한 다음 사용하십시오. 당신이 $_GET['method']($lang);를 호출하고 있기 때문에 완전한 내 보정

0

if (isset($_GET['lang'])){ 
$lang = $_GET['lang']; 
if ($lang == 'en'){ 
    $_GET['method']($lang); 
} elseif ($lang == 'nl'){ 
    $_GET['method']($lang); 
} else { 
    $_GET['method']($lang); 
} 
} else { 
    $lang = ''; 
    $_GET['method']($lang); 
} 

정확히 같은

if (isset($_GET['lang'])){ 
    $lang = $_GET['lang']; 
    $_GET["method"]($lang); 
} else { 
    $lang = ''; 
    $_GET['method']($lang); 
} 

@Highmastdon으로는하지 않을 것이다 else을 포함하여 모든 경우에 해당 조건을 모두 수행 할 필요는 없습니다. 똑같은 것; 그은을 얻기 위해 시작하지만 ...

$_GET['method'](isset($_GET['lang']) ? $_GET['lang'] : ''); 

을 :

$lang = isset($_GET['lang']) ? $_GET['lang'] : ''; 
$_GET['method']($lang); 

당신은 심지어 같은 하나에 두 줄을 결합 할 수 있습니다 : 당신이 준 코드는 다음과 같이 간단하게 작성할 수 있습니다 비트를 읽을 수 없습니다.

그러나, 나는 브라우저에서 직접 지정 함수 이름을 호출하는 것은 주요 보안 위험이 될 수 있다는 @ Vilx-에 의해 만들어진 점을 에코 것이다, 그래서 당신은 * 정말 * method의 내용 수의사에게 필요 lang. 그러나, 이를

+0

아니 설정되어 있지 않으면 오류가 발생합니다 – Highmastdon

+0

오, 미안 해요. 나는 당신이 isset으로 첫 번째 규칙을 제외 시켰는지는 알지 못합니다. 이 경우 당신은 이것에 대해 옳습니다. – Highmastdon

0

를 볼 수있는 예제를 만들려면 :

if (isset($_GET['lang'])) { $lang = $_GET['lang']; } 
else { $lang = ''; } 
$_GET['method']($lang); 
0
$_GET['method'](isset($_GET['lang']) ? $_GET['lang'] : ''); 

하지 마십시오 제발 (URL이 ?method=eval&lang=rm+index.php처럼 보였다 경우 상상). 사용자가 method=eval (또는 실제로 전화하지 않으려는 다른 기능)을 지정하면 방대한 보안 구멍이 생깁니다.

관련 문제