복붙노트

궁극의 클린 / 보안 기능

PHP

궁극의 클린 / 보안 기능

저는 $ _GET과 $ _POST로부터 많은 사용자 입력을 받았습니다 ... 지금은 항상 mysql_real_escape_string ($ _GET [ 'var'])을 작성합니다.

$ _GET / $ _ POST 배열을 즉시 보호, 이스케이프 및 정리하는 함수를 만들 수 있는지 여부를 알고 싶습니다. 따라서 사용자 입력 등으로 작업 할 때마다 처리하지 않아도됩니다.

나는 cleanMe ($ input)과 같은 함수를 생각하고 있었고, 그 안에 mysql_real_escape_string, htmlspecialchars, strip_tags, stripslashes (나는 그것을 깨끗하고 안전하게 만드는 것)라고 입력하고 $ 입력을 리턴해야한다고 생각했다.

이것이 가능한가? 모든 $ _GET 및 $ _POST에 대해 작동하는 함수를 작성하므로 다음과 같이하면됩니다.

$_GET  = cleanMe($_GET);
$_POST = cleanMe($_POST);

따라서 나중에 $ _GET [ 'blabla'] 또는 $ _POST [ 'haha']로 작업 할 때 코드가 안전하게 보호되고 제거됩니다.

조금 자신을 시도 :

function cleanMe($input) {
   $input = mysql_real_escape_string($input);
   $input = htmlspecialchars($input, ENT_IGNORE, 'utf-8');
   $input = strip_tags($input);
   $input = stripslashes($input);
   return $input;
}

해결법

  1. ==============================

    1.일반적인 위생 기능에 대한 아이디어는 깨진 개념입니다.

    일반적인 위생 기능에 대한 아이디어는 깨진 개념입니다.

    모든 목적을 위해 올바른 위생 방법이 하나 있습니다. 문자열에서 무차별 적으로 실행하면 SQL 쿼리의 HTML 코드를 이스케이프 처리하면 웹 페이지에서 사용할 수 없으며 그 반대의 경우도 마찬가지입니다. 위생은 데이터를 사용하기 바로 전에 적용되어야합니다.

    "하나의 크기에 맞는 모든"위생 기능을 사용하는 것은 한 종류의 버그 만 포함 할 수있는 식물에 매우 독성이 강한 5 가지 종류의 살충제를 사용하는 것과 같습니다 - 단지 식물에 여섯 번째 종류가 존재한다는 것을 알아 내기 위해서입니다. 의 살충제가 작동합니다.

    데이터를 함수에 전달하기 전에 항상 올바른 방법을 사용하십시오. 필요한 경우가 아니면 메서드를 혼합하지 마십시오.

  2. ==============================

    2.이러한 모든 기능을 통해 입력을 전달하는 데는 아무런 포인트가 없습니다. 이 모든 기능에는 다른 의미가 있습니다. 더 많은 이스케이프 기능을 호출하여 데이터가 "더 깨끗 해지지"않습니다.

    이러한 모든 기능을 통해 입력을 전달하는 데는 아무런 포인트가 없습니다. 이 모든 기능에는 다른 의미가 있습니다. 더 많은 이스케이프 기능을 호출하여 데이터가 "더 깨끗 해지지"않습니다.

    사용자 입력을 MySQL에 저장하려면 mysql_real_escape_string 만 사용해야합니다. 그런 다음 완전히 이스케이프 처리되어 데이터베이스에 안전하게 저장됩니다.

    편집하다

    또한 다른 기능을 사용할 때 발생하는 문제점에 유의하십시오. 클라이언트가 서버에 사용자 이름을 보내고 사용자 이름에 앰퍼샌드 (&)가 포함되어 있으면 데이터베이스의 사용자 이름에 & amp;을 포함하기 때문에 데이터베이스에 저장하기 전에 htmlentities를 호출하고 싶지 않습니다.

  3. ==============================

    3.filter_input_array ()를 찾고 있습니다. 그러나, 비즈니스 스타일 유효성 검사 / sanitisation 및 SQL 입력 필터링에 대해서만 사용하는 것이 좋습니다.

    filter_input_array ()를 찾고 있습니다. 그러나, 비즈니스 스타일 유효성 검사 / sanitisation 및 SQL 입력 필터링에 대해서만 사용하는 것이 좋습니다.

    SQL 삽입으로부터 보호하려면 mysqli 또는 PDO에서 매개 변수화 된 쿼리를 사용하십시오.

  4. ==============================

    4.문제는 한 가지 용도로 깨끗하고 안전한 것으로, 경로의 일부, mysql 쿼리의 일부, html 출력 (HTML 또는 자바 스크립트 또는 입력 값)에 대한 클리닝, 왜냐하면 xml은 모순되는 다른 것들을 요구하기 때문이다.

    문제는 한 가지 용도로 깨끗하고 안전한 것으로, 경로의 일부, mysql 쿼리의 일부, html 출력 (HTML 또는 자바 스크립트 또는 입력 값)에 대한 클리닝, 왜냐하면 xml은 모순되는 다른 것들을 요구하기 때문이다.

    그러나, 어떤 세계적인 일들이 이루어질 수 있습니다. filter_input을 사용하여 사용자 입력을 얻으십시오. 그리고 SQL 쿼리에 대해 준비된 문을 사용하십시오.

    do-it-all 함수 대신 입력을 관리하는 클래스를 만들 수 있습니다. 그와 같은 것 :

    class inputManager{
      static function toHTML($field){
        $data = filter_input(INPUT_GET, $field, FILTER_SANITIZE_SPECIAL_CHARS);
        return $data;
      }
      static function toSQL($field, $dbType = 'mysql'){
        $data = filter_input(INPUT_GET, $field);
        if($dbType == 'mysql'){
          return mysql_real_escape_string($data);
        }
      }
    }
    

    이런 종류의 일로 코드에서 $ _POST, $ GET, $ _REQUEST 또는 $ _COOKIE가 보이면 코드를 변경해야한다는 것을 알고 있습니다. 언젠가 입력 내용을 필터링하는 방법을 변경해야한다면, 만든 클래스를 변경하십시오.

  5. ==============================

    5.아파치를 사용하고 서버에 대한 모든 권한을 가진다면 "mod_security"를 설치하도록 제안 할 수 있습니까?! 그것은 내 문제의 대부분을 해결했다. 그러나 하나 또는 두 개의 솔루션에만 의존하지 말고 항상 보안 코드를 작성하십시오.) 최신 정보 이 PHP IDS (http://php-ids.org/)를 발견했습니다. 좋은 것 같습니다 :)

    아파치를 사용하고 서버에 대한 모든 권한을 가진다면 "mod_security"를 설치하도록 제안 할 수 있습니까?! 그것은 내 문제의 대부분을 해결했다. 그러나 하나 또는 두 개의 솔루션에만 의존하지 말고 항상 보안 코드를 작성하십시오.) 최신 정보 이 PHP IDS (http://php-ids.org/)를 발견했습니다. 좋은 것 같습니다 :)

  6. ==============================

    6.

    <?php
    function sanitizeString($var)
    {
        $var = stripslashes($var);
        $var = strip_tags($var);
        $var = htmlentities($var);
        return $var;
    }
    
    function sanitizeMySQL($connection, $var)
    {
        $var = $connection->real_escape_string($var);
        $var = sanitizeString($var);
        return $var;
    }
    ?>
    
  7. ==============================

    7.내가 그 전달 배열을 사용하거나 게시물을 얻을

    내가 그 전달 배열을 사용하거나 게시물을 얻을

    function cleanme(&$array)
    { 
     if (isset($array))
     {
         foreach ($array as $key => $value)
         {
              if (is_array($array[$key]))
              {
               secure_array($array[$key]);
              }
              else 
              {
                $array[$key] = strip_tags(mysql_real_escape_string(trim($array[$key])));
              }
         }
     }
    }
    

    사용법 :

    cleanme($_GET);   
    cleanme($_POST);
    
  8. from https://stackoverflow.com/questions/4223980/the-ultimate-clean-secure-function by cc-by-sa and MIT license