2009-02-20 2 views
15

현재로서는 모든 것을 벽에 던지며 앞에서 언급 한 문제를 막는 방법을 찾아야합니다. 아래에 내가 함께 자갈을 넣은 기능이 있습니다 :mysql 인젝션 및 크로스 사이트 스크립팅을 방어하는 가장 좋은 방법

function madSafety($string) 
{ 

$string = mysql_real_escape_string($string); 
$string = stripslashes($string); 
$string = strip_tags($string); 
return $string; 

} 

그러나 나는 이것을하는 더 좋은 방법이 있음을 확신합니다. FILTER_ SANITIZE_STRING을 (를) 사용 중이며 완전히 보안 된 것으로 보이지 않습니다.

나는 어떤 방법으로 너희들을 고용하고 얼마나 성공했는지 묻고있는 것 같니? 감사합니다

+0

dupe : http://stackoverflow.com/questions/129677/whats-the-best-method-for-sanitizing-user-input-with-php – troelskn

+0

이 접근법은 많은 측면에서 잘못되었습니다! 아래에 답변을 게시하고 각 응답에 대해 -1 명의 작성자가 생각하기를 거부했다고 평가했습니다. –

답변

33

정말로 이해하지 못하는 많은 일을하면 도움이되지 않습니다. 당신은 주사 공격이 무엇인지 정확히 무엇을해야 하는지를 이해해야합니다. 글 머리 기호에서

:

  • Disable magic quotes. 그것들은 부적절한 해결책이며 문제를 혼란스럽게합니다.
  • SQL에 직접 문자열을 포함하지 마십시오. 바운드 매개 변수를 사용하거나 이스케이프 (mysql_real_escape_string 사용).
  • 데이터베이스에서 데이터를 검색 할 때 unescape (예 : stripslashes)하지 마십시오.
  • 문자열을 html로 삽입하면 (예 : echo 일 때) htmlentities을 사용하여 ENT_QUOTES으로 문자열을 이스케이프 처리해야합니다.
  • html 문자열을 html로 포함해야하는 경우 문자열 소스를 고려해야합니다. 신뢰할 수 없다면 필터를 통과시켜야합니다. strip_tags은 이론적으로 사용해야하는 것이지만 결함이 있습니다. 대신 HtmlPurifier을 사용하십시오.

은 참조 : What's the best method for sanitizing user input with PHP?

+0

우수 - 지금 작성한 응답보다 현저히 좋습니다. +1 –

+0

우리 모두에게 정말 좋은 알림 :) +1 – itsols

2

하지 마! mysql_real_escape_string을 사용하면 SQL 주입에 대해 사용자를 보호 할 수 있습니다. 이후에는 SQL 주입에 취약 해집니다. 당신이 정말로 원하는 경우에서와 같이 전에 그것을 을 넣어 : 당신이 mysql_real_escape_string을하고 있다면

function madSafety($string) 
{ 
    $string = stripslashes($string); 
    $string = strip_tags($string); 
    $string = mysql_real_escape_string($string); 
    return $string; 
} 

stripslashes 정말 유용하지 않습니다.

strip_tags은 SQL이 아니라 HTML/XML 삽입을 방지합니다.

중요하게주의해야 할 점은 문자열 을 다르게 문자열로 이스케이프해야한다는 것입니다. 사용자가 사용하는 imediate 용도에 따라 다릅니다.

MYSQL을 요청할 때 mysql_real_escape_string을 사용하십시오. 웹 페이지를 출력 할 때 htmlentities을 사용하십시오. 웹 링크를 만들려면 urlencode을 사용하십시오.

vartec이 언급했듯이 꼭 플레이스 홀더를 사용할 수 있다면 그렇게하십시오.

+5

사실, mysql_real_escape_string은 전적으로 안전하지 않습니다. http://ilia.ws/archives/103-mysql_real_escape_string-versus-Prepared-Statements.html –

9

SQL 인젝션을 막는 가장 좋은 방법은 문자열을 문자열에 "주입"하는 대신 변수를 바인딩하는 것입니다. http://www.php.net/manual/en/mysqli-stmt.bind-param.php

+0

허용되는 태그를주의 깊게 살펴보십시오. 모든 태그에 JS가 포함될 수 있습니다. –

+0

도 참조 - http://isisblogs.poly.edu/2008/08/16/php-strip_tags-not-a-complete-protection-against-xss/ –

+0

strip_tags에 결함이 있습니다. 이스케이프 문자열 또는 필요한 경우 HTML을 허용하려면 htmlpurifier를 사용하십시오. – troelskn

0

이 항목이 너무 잘못입니다!

사용자의 입력을 필터링하면 안됩니다. 그 사람이 입력 한 정보입니다. 비밀번호를 다음과 같이 설정하려면 어떻게 할 것입니까? '"'>s3cr3t<script>alert()</script>

문자를 필터링하고 변경된 비밀번호로 남겨두면 처음 로그인해도 성공하지 못합니까? 이것은 나쁘다.

적절한 해결책은 준비된 문이나 mysql_real_escape_string()을 사용하여 SQL 주입을 피하고 문맥 인식 이스케이프 처리를 사용하여 html 코드가 엉망이되는 것을 방지하는 것입니다.

웹은 사용자가 입력 한 정보를 나타낼 수있는 방법 중 하나임을 상기시켜드립니다. 일부 데스크톱 소프트웨어에서 그러한 스트리핑을 허용한다면 어떻습니까? 나는 당신의 대답이 NO이고 이것이 올바른 방법이 아닌 이유를 이해할 수 있기를 바랍니다.

다른 컨텍스트에서 다른 문자를 이스케이프해야한다는 점에 유의하십시오. 당신이 거 어떻게하는 사용자가 자신의 이름을 설정 한 경우

<span title="{$user->firstName}">{$user->firstName}</span> 

그러나, '"><script>window.document.location.href="http://google.com"</script>처럼 될 : 당신이 툴팁으로 사용자 이름을 표시해야하는 경우 예를 들어, 같은 것을 사용할 것인가? 따옴표를 제거 하시겠습니까? 이것은 너무 잘못 될 것입니다! 이 비 감각을 수행하는 대신 데이터를 렌더링하는 동안 인용 부호를 이스케이프하는 것이 좋습니다.

값 자체를 렌더링하는 동안 고려해야 할 또 다른 컨텍스트가 있습니다. 이전에 사용 된 html 코드를 고려하고 사용자 이름이 <textarea> 인 것으로 상상하십시오. 이렇게하면이 텍스트 영역에 이어지는 모든 HTML 코드가 래핑되어 전체 페이지가 분리됩니다.

다시 한 번 - 사용중인 컨텍스트에 따라 데이터 이스케이프를 고려하십시오!

P.S 해당 부정 투표에 대해 어떻게 대응해야할지 잘 모르겠습니다. 너, 사람들, 내 답장을 실제로 읽는거야?

+0

내 의견을 삭제하는 대신, 내가 무슨 말을했는지 이해하려고하십시오. 사용자가 태그를 제거하지 않겠다는 태그가있는 사용자 이름을 사용했다면 사용자 이름을 완전히 거부하고 사용자 이름을 적게 내버려 뒀습니다. 나를 용서하십시오. 비밀번호는 다르지만 '

관련 문제