Program Tip

최고의 청결 / 안전 기능

programtip 2020. 12. 14. 20:48
반응형

최고의 청결 / 안전 기능


나는 사용자로부터 많은 입력을 $_GET받고있다. $_POST... 현재 나는 항상 mysql_real_escape_string($_GET['var'])..

$_GET/ $_POST배열 을 보호하고, 이스케이프하고, 정리하는 함수를 즉시 만들 수 있는지 알고 싶습니다 . 따라서 사용자 입력 등으로 작업 할 때마다 처리 할 필요가 없습니다.

나는 예를 들어 기능으로 생각 cleanMe($input)하고, 그것은해야 할 내부 mysql_real_escape_string, htmlspecialchars, strip_tags, stripslashes다음을 반환 (나는 그것을 청소하기 및 확보하기 위해 모든 것 같아요) $input.

이것이 가능합니까? 모든 $_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;
}

일반적인 위생 기능의 개념은 깨진 개념입니다.

모든 목적에 적합한 위생 방법. 그것들을 모두 문자열에서 무차별 적으로 실행하면 종종 깨질 것입니다. SQL 쿼리를 위해 HTML 코드를 이스케이프하면 웹 페이지에서 사용하기 위해 깨지고 그 반대의 경우도 마찬가지입니다. 데이터 사용 하기 직전에 위생을 적용해야합니다 .

  • 데이터베이스 쿼리를 실행하기 전에. 올바른 위생 방법은 사용하는 도서관에 따라 다릅니다. 그들은에 나와있는 내가 PHP에서 SQL 주입을 방지 할 수 있습니까?

  • htmlspecialchars() 안전한 HTML 출력을 위해

  • preg_quote() 정규 표현식에 사용

  • escapeshellarg()/ escapeshellcmd()외부 명령에 사용

  • 기타 등등.

"하나의 크기에 모두 적합"위생 기능을 사용하는 것은 정의에 따라 한 가지 종류의 벌레 만 포함 할 수있는 식물에 5 가지 종류의 고독성 살충제를 사용하는 것과 같습니다. 식물이 여섯 번째 종류의 벌레에 감염되었는지 확인하기 위해서만 사용합니다. 살충제가 작동합니다.

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


이 모든 함수를 통해 단순히 입력을 전달하는 것은 의미가 없습니다. 이 모든 기능은 다른 의미를 갖습니다. 더 많은 이스케이프 함수를 호출해도 데이터가 "더 깨끗해지지"않습니다.

MySQL에 사용자 입력을 저장하려면 mysql_real_escape_string. 그런 다음 데이터베이스에 안전하게 저장하기 위해 완전히 이스케이프됩니다.

편집하다

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


당신은를 찾고 있습니다 filter_input_array(). 그러나 SQL 입력 필터링이 아닌 비즈니스 스타일의 유효성 검사 / 정리에만 사용하는 것이 좋습니다.

SQL 주입에 대한 보호를 위해 mysqli 또는 PDO 와 함께 매개 변수화 된 쿼리를 사용합니다 .


문제는 한 번 사용하기에 깨끗하거나 안전한 것이 다른 용도로는 사용되지 않는다는 것입니다. 경로의 일부, mysql 쿼리의 일부, html 출력 (html 또는 javascript 또는 입력 값)에 대한 정리, XML의 경우 모순되는 다른 사항이 필요할 수 있습니다.

그러나 일부 글로벌 작업을 수행 할 수 있습니다. filter_input 을 사용 하여 사용자의 입력을 얻으십시오. 그리고 사용 준비된 문 당신의 SQL 쿼리를.

하지만 모든 기능을 수행하는 대신 입력을 관리하는 클래스를 만들 수 있습니다. 그런 것 :

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가 있으면 변경해야한다는 것을 알 수 있습니다. 그리고 언젠가 입력을 필터링하는 방법을 변경해야하는 경우 만든 클래스 만 변경하면됩니다.


May I suggest to install "mod_security" if you're using apache and have full access to server?!
It did solve most of my problems. However don't rely in just one or two solutions, always write secure code ;)
UPDATE Found this PHP IDS (http://php-ids.org/); seems nice :)


<?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;
}
?>

i used that pass array or get , post

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])));
          }
     }
 }
}

Usage :

cleanme($_GET);   
cleanme($_POST);

참고URL : https://stackoverflow.com/questions/4223980/the-ultimate-clean-secure-function

반응형