2009-03-18 8 views
34

filter_var은 데이터 필터링에 적합합니까? 어떤 종류의 불량 데이터를 필터링합니까? mysql_real_escape_string을 사용하지만 filter_var을 추가하면 도움이 될지 궁금합니다.filter_var는 좋은 방법입니까?

+1

이것이 왜 왜곡되었는지 확실하지 않음 – Ross

+2

XSS 및 SQL 주입이 무엇인지 이해하고 기적 기능을 요구하지 않고 가능한 이유를 이해해야합니다. – Gumbo

+2

무엇을 도와 드릴까요? filter_var가 성취하기를 바라는 것을 당신은 무엇을하려고합니까? 질문이 실제로 모호하기 때문에 – jmucchiello

답변

23

가능하면 준비된 문을 사용하십시오. 그렇지 않다면, 문자열에 대해 mysql_real_escape_string을 사용하고, float에 대해서는 (int) casting 또는 intval()을, float에는 float (float) 또는 floatval()을, LIKE 문에서 사용할 문자열에 대해서는 addcslashes ($ input, '% _')를 사용하십시오. RLIKE 문에서 사용할 문자열을 이스케이프 처리 할 때 상황이 더욱 복잡해집니다.

$escaped = htmlspecialchars($input, ENT_QUOTES, $your_charset); 

A :이 경우에 가장 저렴한 솔루션이며, 원하는

는 필터링 HTML 콘텐츠의 경우, 최고 ($ allowable_tags를 거치지 않고) strip_tags 것,하지만 ... 당신은/좋아하지 않을 수 있습니다 더 신뢰할 수있는 솔루션은 같은 라이브러리를 사용하는 것입니다 HTML Purifier

필터 기능은 정상이지만 필터 중 일부는 필터보다 더 유효합니다. 귀하의 필요에 따라 그 중 일부가 유용 할 수 있습니다.

+4

htmlspecialchars()는 텍스트를 HTML로 출력하기위한 올바른 작업입니다. 텍스트에서 합법적 인 '<'문자를 사용하려는 경우 strip_tags()가 내용을 잃어 버리고 '&'가 제대로 표시되지 않습니다. – bobince

1

정말로 당신이하려는 일에 달려 있습니다. 구체적인 사항을 알지 못하면 실제로 대답 할 수 없습니다. 가능한 필터와 그 효과는 다음과 같습니다. Types of filters

+0

기본적으로 사용자 입력에서 오는 xss 또는 mysql 공격을 필터링하고 유효성을 검사합니다. – mikelbring

+0

XSS 및 SQL 주입 방법이 너무 많습니다 (http://ha.ckers.org/xss.html). 그것은 모두 사용자 데이터를 어떻게 처리했는지 응용 프로그램에 따라 다릅니다. – Gumbo

17

filter_varFILTER_* constants과 함께 사용하여 조정합니다. validation (데이터 확인은 안전함)이 아닌 sanitisation 개의 데이터 (실제 데이터를 안전하게 만들기 위해 * 조정)를 찾고있는 것 같습니다.

서로 다른 필터가 서로 다른 작업에 도움이 될 수 있습니다. mysql_real_escape_string은 SQL 인젝션을 방지하기 위해 데이터를 위생 처리하는 것으로 괜찮지 만 HTML을 포함 할 수있는 데이터를 출력하는 것은 좋지 않습니다. - (제거하지 않음) HTML 코드를 표시 XSS 공격을 방지하고 HTML 엔티티로 문자 변환에 유용

  • FILTER_SANITIZE_SPECIAL_CHARS : 여기가 일상적인 작업을 위해 사용하는 거라고 필터의 몇입니다.
  • FILTER_SANITIZE_STRINGSTRIP_LOW/HIGH 플래그 - 실제로는 HTML을 제거합니다 (strip_tags 참조).
  • FILTER_SANITIZE_URL - URL을 안전하게 만듭니다 *.
  • FILTER_SANITIZE_EMAIL - 주소를 저장하기 전에 유효 사촌을 사용하는 것이 좋지만 전자 메일 주소를 안전하게합니다.

* 저는 안전함을 느슨하게 사용합니다. 나는 결코 확신 할 수 없다고 생각합니다.

-5

그냥 약간의 테스트를 토대로, filter_var의 상수는 신뢰할 수 없다는 결론을 얻었습니다. 예를 들어

는 :

filter_var('[email protected]', FILTER_VALIDATE_EMAIL); // valid 
filter_var('http://.', FILTER_VALIDATE_URL); // valid 
filter_var('[email protected]', FILTER_SANITIZE_EMAIL); // [email protected] 
filter_var('http://.', FILTER_SANITIZE_URL); // http://. 

이 분명히 잘못된 값이지만, filter_var의 상수를 전달합니다. filter_var을 신뢰하지 마십시오.

+4

살균은 유효성 검사와 동일하지 않습니다. –

+0

@Mathew, 맞습니다.하지만 필자가 지적한'filter_var '의 문제와 관련이 있는지 확신 할 수 없습니다. 내가 입력 한 내용을 정확하게 필터링하거나 제대로 살균하지 않습니다. – eyelidlessness

+13

http://tools.ietf.org/html/rfc822에서 볼 수있는 한 전자 메일 주소가 올바르게 형식화되어 있습니다. 특히, 'c'는 새로운 TLD로 등록되고, 'b-'는 도메인으로 등록됩니다 ('-'는 유효한 문자입니다). 거기에는 아무런 문제가 없습니다. '! def! xyz % abc + tag @ [127.0.0.1]'은 유효한 주소가 아닙니까? (나는 궁금해 할 것이다.) 도메인 네임의 예제를 빨리 올리지는 못했지만, 'dig.'가 합리적인 응답을 주었다고 말할 수는 있지만,'stackoverflow.com.' 'stackoverflow.com'과 같은 ip를 반환합니다 (예, 첫 번째 URL의 후행 점). 나는 이것에서'filter_var'와 PHP에 동의한다. – Iiridayn

2

모두 유효한 URL 또는 유효한 이메일의 의미에 따라 다릅니다.

예를 들어 [email protected] - 글쎄 최상위 도메인을 필터링하여 .c을 제외 할 수 있지만 최상위 도메인 목록이 일정하지 않습니다. 또한 모든 문자가 유효합니다. 이상하게 보이고 거의 확실하게 유효하지 않더라도, 많은 정규식 필터가 유효성을 검사합니다.

이메일로 [email protected] 또는 링크으로 표시되거나 링크로 사용되는 경우 아무데도 가지 않아도 아무런 해를 끼치 지 않습니다.

저는 문제의 일부가 필터가 얼마나 느슨한 지에 대한 질문이라고 생각합니다. 큰 관심이 XSS 또는 SQL 주입이거나 그렇지 않으면 위험한 입력을 방지하는 경우 값이 사용 가능한지 여부는 관계가 없으므로 이러한 종류의 필터가 트릭을 수행 할 수 있습니다.

값이 안전하고 사용 가능하다는 것을 확인하려면 더 까다로운 짐승입니다.

관련 문제