2010-03-09 5 views
7

PHP에서는 SQL 삽입을 방지하는 가장 좋은 방법은 parameterized queries을 사용하는 것입니다.PHP : 표시된 정보에 대한 최상의 보안 관행?

하지만 같은 다른 목적을 위해 사용되는 살균 사용자 입력에 대한 : 사용자 (잠재적 인 크로스 사이트 스크립팅 벡터)

  • 다시 표시

    • 이메일 주소 또는에서 작성 메시지 본문

    htmlentities() 데이터베이스가 아닌 용도로 사용하는 가장 좋은 방법은 무엇입니까? 가장 좋은 방법은 무엇입니까?

  • 답변

    5

    PHP에서 최고의 XSS 필터는 다음과 같습니다 당신이 XSS를 이용하기> < 필요하지 않습니다 becuase

    htmlspecialchars($_POST['param'],ENT_QUOTES); 
    

    당신은 또한 따옴표를 인코딩해야하는 이유입니다. 예를 들어이 XSS에 취약 :

    $_REQUEST[xss]='" onMouseOver="alert(/xss/)"'; 
    

    ENT_QUOTES : 당신이 onMouseover와 를 사용할 수 있기 때문에이 경우 자바 스크립트를 실행하기> < 필요하지 않습니다

    print('<A HREF="http://www.xssed.com/'.htmlspecialchars($_REQUEST[xss]).'">link</a>'); 
    

    , 여기에 예를 들어 공격입니다 큰 따옴표를 처리합니다.

    이메일 주소가 이 아닌은 메일 클라이언트가 실행하지 않아야하며, 동일한 발신자 정책으로 인해 귀하의 사이트가 영향을받지 않습니다. 그러나 안전한쪽에 있기 위해 나는 여전히 htmlspecialchars($var,ENT_QUOTES);를 사용할 것이다. 그러나 PHP의 mail() 함수는 CRLF 주입이라고하는 다른 유형의 취약점에 굴복 할 수 있습니다. 다음은 PHP-Nuke에 대한 예제 취약점입니다. 다음과 같은 함수 호출이있는 경우 : mail($fmail, $subject, $message, $header); 그런 다음 사용자가 \r\n을 $ header에 삽입 할 수 없도록해야합니다.

    취약 코드 :

    $header="From: \"$_GET[name]\" <$ymail>\nX-Mailer: PHP"; 
    

    는 패치 :

    $_GET[name]=str_replace(array("\r","\n"),$_GET[name]); 
    $header="From: \"$_GET[name]\" <$ymail>\nX-Mailer: PHP"; 
    
    +0

    는 "구멍"을 찾기위한 자동화 된 테스트가 있습니까? – Kirzilla

    +0

    두뇌와 손. 그러나 구글이 주변에 있다면 몇 가지가있다. http://www.acunetix.com/의 사이트는 좋지만 내 두뇌는 좋다.하지만 무료는 아니다. –

    +0

    Acunetix에서 무료 xss 스캐너를 사용하십시오. http://www.acunetix.com/cross-site-scripting/scanner.htm 필자는 필자의 예제에서와 같이 이상한 유형의 xss를 테스트 할 것입니다. – rook

    1

    그럼 먼저 이메일 것처럼 구성해야 할 유일한 것은 문자, 숫자, @ (에서이다, 특정 필드에 대한 규칙을 만들 수 있습니다 -symbol? 실제로 무엇이라고 부르는가), 그리고 마침표가 있으므로 XSS를 구성 할 수 없으므로 htmlentities() 또는 htmlspeicalchars()을 사용하여 자원을 낭비 할 필요가 없습니다.

    2

    HTML 정제기를 사용하면 위험한 HTML을 제거하고 안전한 입력을 할 수 있습니다. HTML에서 허용/금지 할 규칙을 직접 만들 수도 있습니다.

    http://htmlpurifier.org/

    +0

    젠장, 나는 그걸 게시하려하고 있었다. –

    0

    없음 ,

    1)는 SQL 명령문의 주입 용액을 제조 아니다. 대부분의 경우 준비 문은 변수 바인딩과 SQL injection을 방지하는 효과적인 방법 인 투명한 이스케이프를 의미합니다.

    2) 입력을 위생적으로 처리하지 마십시오. 출력으로 위생 처리됩니다. 모든 수단을 통해 입력을 확인하십시오 (예 : 시작 날짜가 종료 날짜 이전인지 확인). 그러나 데이터의 repsentation은 PHP 코드가있는 지점에서만 변경해야합니다. HTML에 직접 작성된 데이터를 위생화하는 방법은 URL에 작성된 데이터를 위생적으로 다루는 방법과 다르다. 자바 스크립트 문자열 변수에 데이터를 쓰는 방법과 다르다. 변수는 SQL 문에 삽입하기위한 데이터를 위조하는 방법과 다르다. 데이터를 모뎀에 보내기 전에 데이터를 위생 처리하는 방법과 다른 ...

    ... 할 일이 무엇입니까? 데이터의 모든 가능한 표현을 만드시겠습니까? 데이터의 보편적 인 표현을 만드시겠습니까?

    http://xkcd.com/327/

    C.

    +1

    머리카락을 쪼개는 방법. 모뎀에 보내지는 데이터를 위생 처리하는 방법을 제안하고자한다면 실제로이 토론에 가치있는 것을 제공 할 것입니다. –