문제

응용 프로그램 제어, 저장, 논리에 사용되기 전에 외부 세계에서 나오는 데이터를 올바르게 탈출하는 방법을 살펴보고 있습니다.

분명히, Magic Quotes 지시 사항이 PHP 5.3.0+에서 곧 더 이상 사용되지 않고 PHP6에서 제거되면, 레거시 코드를 유지하면서 업그레이드하고 새로운 언어 기능을 사용하려는 사람이라면 누구나 더 긴급하게됩니다 (우리는 사랑하지 마십시오. 그것..).

그러나 내가 보지 못한 한 가지는 데이터를 보호 한 후에해야 할 일에 대한 이론/모범 사례에 대한 많은 토론 (예 : 슬래시가 있거나없는 저장)입니까? 나는 개인적으로 DB에서 탈출 된 데이터를 유지하는 것이 나쁜 움직임이라고 생각하지만, 토론을 듣고 일부 사례 연구를 읽고 싶어합니다 ..

참조를 위해 PHP 매뉴얼의 일부 링크 :

PHP 매뉴얼 - mysql_real_escape_string

PHP 매뉴얼 - htmlspecialchars

팁이 있습니까?

도움이 되었습니까?

해결책

준비된 진술을 살펴보십시오. MySQL에서 이것은 매우 잘 작동하며 데이터를 데이터베스에 가져 오는 안전한 형태입니다. 몇 가지 성능 이점도 있습니다.

http://dev.mysql.com/tech-resources/articles/4.1/prepared-statements.html

관심이 있다면 더 많은 자원이 있습니다.

이것이 당신이 찾고있는 것, TC입니다.

편집하다:

내가 추가 할 수있는 한 가지는 준비된 진술과 함께 필터를 사용하는 것입니다. 예를 들어, 값이 wist인지 확인하십시오. filter_sanitize_string을 사용하거나 이메일을 사용하여 filter_sanitize_email을 사용하십시오.

이것은 어느 정도의 코드를 절약하고 매우 잘 작동합니다. 나중에 자신의 방법을 사용하여 언제든지 데이터를 확인할 수 있지만 사용할 수있는 필터가 많이 있습니다.

다른 팁

  • 쿼리를 실행할 때 데이터를 빠져 나가는 올바른 방법을 사용하십시오. mysql_real_escape_string, 준비된 쿼리 등 ...

  • 데이터베이스에 데이터를 변경하지 않은 저장하십시오

  • 출력에서 데이터를 피하는 올바른 방법을 사용하십시오. htmlspecialchars 등 ..

데이터베이스 작업의 경우 매개 변수화 된 쿼리 및 준비된 명령문을 확인하십시오. pdo 그리고 mysqli 그것에 대해 좋습니다.

htmlspecialchars HTML 문서에 일부 텍스트를 표시하는 올바른 도구입니다.

그리고 PHP 5.3을 언급했듯이 필터 기능 사용자 데이터를 처리 할 때 꼭 사용해야합니다.

데이터베이스 삽입의 경우 솔루션은 사용하는 것입니다 바인딩 변수.

일반적으로 자신이 무엇이든 탈출 할 때마다 (쉘 명령에 대한 인수, DB 명령 조각, 사용자 지원 HTML 등) 올바른 함수 호출을 사용하지 않음을 나타냅니다 (예 : 사용, 사용 system 멀티 아그 형태의 형태를 사용할 수있을 때 exec) 또는 프레임 워크가 부족합니다. 부족한 프레임 워크에서 작업하는 표준 접근 방식은 인용에 대해 생각하지 않도록이를 향상시키는 것입니다.

탈출 수준과 인용 수준에 대해 생각하는 것은 재미있을 수 있지만, 정말로 당신이 정말로 즐기면 여가 시간에 TCL과 놀아주십시오. 실제 작업을 위해서는 다른 사람들이 사용할 수있는 도서관을 설계하지 않는 한 인용에 대해 생각해서는 안됩니다.이 경우 제대로 인용하고 사용자가 인용에 대한 생각을 피해야합니다. (그리고 당신은 당신이 어떤 종류의 인용을하고하지 않는지 정확하게 신중하게 문서화해야합니다)

간단 해. 들어오는 모든 데이터는 통과해야합니다 mysql_real_escape_string () 데이터베이스에 삽입하기 전에. 예를 들어 무언가가 정수가되어야한다는 것을 알고 있다면, 삽입하기 전에 정수로 설정하십시오. 이것은 SQL 주입을 중지하는 것입니다. XSS 및 데이터 검증은 다릅니다.

무언가가 이메일이되기를 원한다면 데이터베이스에 삽입하기 전에이를 확인해야합니다.

htmlentities () 데이터를 소독하여 의미합니다 수정하다 자료. 항상 데이터베이스에 원시 데이터를 저장해야한다고 생각하며 해당 데이터를 가져 오면 소독하는 방법을 선택하십시오.

나는 다음 기능을 "래퍼"로 사용하고 싶습니다. mysql_real_escape_string () 기능.

function someFunction( $value )
{
    if ( is_int( $value ) || is_float( $value ) ) {
        return $value;
    }
    return "'" . mysql_real_escape_string( (string) $value ) . "'";
}

값이 플로트 또는 정수 인 경우 실행할 필요가 없습니다. mysql_real_escape_string (). 값을 문자열에 전달하기 전에 값을 던진 이유 mysql_real_escape_string (), 때로는 값이 문자열이 아닐 수도 있기 때문입니다.

문자열이 아닌 값의 예 :

http : //localhost/test.php? hello [] = 테스트

내부 test.php, 당신은 실행됩니다 mysql_real_escape_string () on $ _get [ 'Hello'] Hello가 문자열이 될 것으로 기대합니다. 그 사람은 값을 배열로 설정하기 때문에 Hello는 문자열이 아니기 때문에 실제로 통지를 유발합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top