2008-11-10 6 views
2

나는 그들과 함께 일하기 전에, 내 url에서 변수를 지우는 빠르고 쉬운 함수가 있는지 궁금하다. (또는 $ _POST가 생각 해보니 ...)URL 변수를 정리하는 깔끔한 방법은 무엇입니까?

내가 사용할 수 있다고 생각한다. 허용되지 않는 문자를 대체하는 정규식이지만 사람들이 이런 종류의 것을 사용하는 것을 듣고 싶습니다.

답변

2

정규 표현식이 유용 할 수 있으며 PHP 5.2.0에서는 입력 변수를 여러 가지 방법으로 필터링하는 데 사용되는 filter 확장을 도입했습니다.

입력 변수의 특성이 가변적이기 때문에 단일 솔루션을 권장하기가 어렵습니다. :-)

6

입력을 청소하는 개념은 나에게별로 의미가 없었습니다. 그것은 어떤 종류의 입력이 위험하다는 가정에 기반을두고 있지만 실제로는 위험한 입력 같은 것이 없습니다. 입력을 잘못 처리하는 코드.

어떤 종류의 문자열 (코드) 안에 어떤 종류의 해석기 (예 : )에 의해 평가되는 변수를 포함 시키면 변수가 올바르게으로 이스케이프되어야합니다. 예를 들어, SQL 문에 문자열을 포함하는 경우이 문자열에서 특정 문자를 인용 및 이스케이프해야합니다. URL에 값을 삽입 한 경우 urlencode으로 값을 이스케이프 처리해야합니다. HTML 문서 내에 문자열을 포함하면 htmlspecialchars으로 이스케이프해야합니다. 등등.

데이터를 "정리"하는 것은 운명적인 전략입니다. 그 시점에서 데이터가 어떤 컨텍스트에서 사용되는지 알 수 없기 때문입니다. 악명 높은 magic_quotes PHP의 안티 피쳐는 이 잘못된 생각의 대표적인 예.

+1

저는 htmlspecialchars 대신 htmlentities를 사용했습니다. 완전한 엔티티 변환을 수행합니다. –

+1

보안 관점에서 보면 괜찮습니다. htmlentities는 htmlspecialchars의 상위 집합입니다. UTF-8을 인코딩으로 사용하는 경우에는 필요하지 않습니다. – troelskn

1

아래의 방법을 사용하여 MYSQL 데이터베이스 사용에 대한 입력을 살균합니다. 요약하면 foreach를 통해 $ _POST 또는 $ _GET 배열을 반복하고 DBSafe 함수를 통해 각 $ _POST 또는 $ _GET을 전달하여 정리합니다. DBSafe는 데이터 변수의 다른 용도 (예 : HTML 출력 등)를 위해 쉽게 수정할 수 있습니다.

 
// Iterate POST array, pass each to DBSafe function to clean up data 
foreach ($_POST as $key => $PostVal) { 

    // Convert POST Vars into regular vars 
    $$key=DBSafe($PostVal); 

    // Use above statement to leave POST or GET array intact, and use new individual vars 
    // OR, use below to update POST or GET array vars 

    // Update POST vars 
    $_POST[$key]=DBSafe($PostVal); 
} 


function DBSafe($InputVal) { 
// Returns MySQL safe values for DB update. unquoted numeric values; NULL for empty input; escaped, 'single-quoted' string-values; 

    if (is_numeric($InputVal)) { 
    return $InputVal; 
    } else { 
    // escape_string may not be necessary depending on server PHP and MySQL (i.e. magic_quotes) setup. Uncomment below if needed. 
    // $InputVal=mysql_escape_string($InputVal); 
    $InputVal=(!$InputVal?'NULL':"'$InputVal'"); 
    return $InputVal; 
    } 
}