문제

가 포괄적인 기능이 어딘가에 대해 잘 작동하는 소독이 사용자 입력에 대한 SQL injection 및 XSS 공격하는 동안,여전히 수 있도록 특정 유형의 HTML 태그?

도움이 되었습니까?

해결책

그것은 일반적인 오해는 사용자 입력 필터링 할 수 있습니다.PHP 심지어(현재 사용되지 않습니다)"기능"라는 마법의 견적을 바탕으로 하는 이러한 개념을 파악할 수 있습니다.그것은 없다.잊지에 대한 필터링(또는 청소,또는 어떤 사람들이 부르다).

당신이해야 할 문제를 방지하기 위해,매우 간단하다:할 때마다 포함하는 문자열 내에서 외국인 코드에,당신은 탈출해야합니다,그것의 규칙에 따라하는 언어입니다.예를 들어,포함하는 경우 문자열에는 몇 가지 SQL 타겟팅 MySql,당신은 탈출해야 문자열과 함께 MySql 의 기능을 이 목적으로(mysqli_real_escape_string).(거나,의 경우에 데이터베이스를 사용하여 준비된 문은 더 나은 접근 방식은,가능하면)

또 다른 예는 HTML:포함하는 경우 문자열에 HTML 태그에,당신은 탈출해야로 htmlspecialchars.이 echoprint 성명을 사용해야 한다 htmlspecialchars.

세 번째 예 될 수 있습 쉘 명령:는 경우를 포함하는 문자열은(인자)외부 명령을 호출하는 것으로 exec, 다음을 사용해야 합니다 escapeshellcmdescapeshellarg.

그래서 떠나지 않습니다.

는 경우 당신은 필요를 적극적으로 데이터를 필터링,는 경우 받아들이 미리 포맷된 입력합니다.예를 들어.는 경우에 당신은 당신의 사용자가 게시 HTML 태그는 표시할 계획이다.그러나,당신은 당신이 현명해야 이를 방지하기 위해서 모든 비용 때문에,당신이 얼마나 잘 필터를,그것은 항상 잠재적인 보안 구멍이 있습니다.

다른 팁

입력 데이터를 소독하여 SQL 주입을 방지하지 마십시오.

대신에, SQL 코드를 작성하는 데 데이터를 사용할 수 없습니다.. 바운드 변수를 사용하는 준비된 문 (예 : 템플릿 쿼리에서 매개 변수 사용)을 사용하십시오. SQL 주입에 대해 보장되는 유일한 방법입니다.

내 웹 사이트를 참조하십시오 http://bobby-tables.com/ SQL 주입 방지에 대한 자세한 내용.

아닙니다. 당신은 그것이 무엇을 원하는지에 대한 컨텍스트 없이는 일반적으로 데이터를 필터링 할 수 없습니다. 때로는 SQL 쿼리를 입력으로 사용하고 싶을 때 때로는 HTML을 입력으로 가져 가고 싶을 때가 있습니다.

화이트리스트에서 입력을 필터링해야합니다. 데이터가 기대하는 것에 대한 일부 사양과 일치하는지 확인하십시오. 그런 다음 사용하는 컨텍스트에 따라 사용하기 전에 탈출해야합니다.

SQL 주입을 방지하기위한 SQL에 대한 데이터를 빠져 나가는 프로세스는 XSS를 방지하기 위해 (x) HTML에 대한 데이터를 빠져 나가는 과정과는 매우 다릅니다.

PHP는 이제 새로운 NICE Filter_Input 함수를 가지고 있습니다. 예를 들어 '궁극적 인 전자 메일 Regex'를 찾지 못하도록 해방시켜 Filter_Validate_Email 유형이 내장되어 있습니다.

내 자신의 필터 클래스 (JavaScript를 사용하여 결함이있는 필드를 강조 표시)는 AJAX 요청 또는 일반 양식 게시물로 시작할 수 있습니다. (아래 예제 참조)

/**
 *  Pork.FormValidator
 *  Validates arrays or properties by setting up simple arrays. 
 *  Note that some of the regexes are for dutch input!
 *  Example:
 * 
 *  $validations = array('name' => 'anything','email' => 'email','alias' => 'anything','pwd'=>'anything','gsm' => 'phone','birthdate' => 'date');
 *  $required = array('name', 'email', 'alias', 'pwd');
 *  $sanatize = array('alias');
 *
 *  $validator = new FormValidator($validations, $required, $sanatize);
 *                  
 *  if($validator->validate($_POST))
 *  {
 *      $_POST = $validator->sanatize($_POST);
 *      // now do your saving, $_POST has been sanatized.
 *      die($validator->getScript()."<script type='text/javascript'>alert('saved changes');</script>");
 *  }
 *  else
 *  {
 *      die($validator->getScript());
 *  }   
 *  
 * To validate just one element:
 * $validated = new FormValidator()->validate('blah@bla.', 'email');
 * 
 * To sanatize just one element:
 * $sanatized = new FormValidator()->sanatize('<b>blah</b>', 'string');
 * 
 * @package pork
 * @author SchizoDuckie
 * @copyright SchizoDuckie 2008
 * @version 1.0
 * @access public
 */
class FormValidator
{
    public static $regexes = Array(
            'date' => "^[0-9]{1,2}[-/][0-9]{1,2}[-/][0-9]{4}\$",
            'amount' => "^[-]?[0-9]+\$",
            'number' => "^[-]?[0-9,]+\$",
            'alfanum' => "^[0-9a-zA-Z ,.-_\\s\?\!]+\$",
            'not_empty' => "[a-z0-9A-Z]+",
            'words' => "^[A-Za-z]+[A-Za-z \\s]*\$",
            'phone' => "^[0-9]{10,11}\$",
            'zipcode' => "^[1-9][0-9]{3}[a-zA-Z]{2}\$",
            'plate' => "^([0-9a-zA-Z]{2}[-]){2}[0-9a-zA-Z]{2}\$",
            'price' => "^[0-9.,]*(([.,][-])|([.,][0-9]{2}))?\$",
            '2digitopt' => "^\d+(\,\d{2})?\$",
            '2digitforce' => "^\d+\,\d\d\$",
            'anything' => "^[\d\D]{1,}\$"
    );
    private $validations, $sanatations, $mandatories, $errors, $corrects, $fields;


    public function __construct($validations=array(), $mandatories = array(), $sanatations = array())
    {
        $this->validations = $validations;
        $this->sanatations = $sanatations;
        $this->mandatories = $mandatories;
        $this->errors = array();
        $this->corrects = array();
    }

    /**
     * Validates an array of items (if needed) and returns true or false
     *
     */
    public function validate($items)
    {
        $this->fields = $items;
        $havefailures = false;
        foreach($items as $key=>$val)
        {
            if((strlen($val) == 0 || array_search($key, $this->validations) === false) && array_search($key, $this->mandatories) === false) 
            {
                $this->corrects[] = $key;
                continue;
            }
            $result = self::validateItem($val, $this->validations[$key]);
            if($result === false) {
                $havefailures = true;
                $this->addError($key, $this->validations[$key]);
            }
            else
            {
                $this->corrects[] = $key;
            }
        }

        return(!$havefailures);
    }

    /**
     *
     *  Adds unvalidated class to thos elements that are not validated. Removes them from classes that are.
     */
    public function getScript() {
        if(!empty($this->errors))
        {
            $errors = array();
            foreach($this->errors as $key=>$val) { $errors[] = "'INPUT[name={$key}]'"; }

            $output = '$$('.implode(',', $errors).').addClass("unvalidated");'; 
            $output .= "new FormValidator().showMessage();";
        }
        if(!empty($this->corrects))
        {
            $corrects = array();
            foreach($this->corrects as $key) { $corrects[] = "'INPUT[name={$key}]'"; }
            $output .= '$$('.implode(',', $corrects).').removeClass("unvalidated");';   
        }
        $output = "<script type='text/javascript'>{$output} </script>";
        return($output);
    }


    /**
     *
     * Sanatizes an array of items according to the $this->sanatations
     * sanatations will be standard of type string, but can also be specified.
     * For ease of use, this syntax is accepted:
     * $sanatations = array('fieldname', 'otherfieldname'=>'float');
     */
    public function sanatize($items)
    {
        foreach($items as $key=>$val)
        {
            if(array_search($key, $this->sanatations) === false && !array_key_exists($key, $this->sanatations)) continue;
            $items[$key] = self::sanatizeItem($val, $this->validations[$key]);
        }
        return($items);
    }


    /**
     *
     * Adds an error to the errors array.
     */ 
    private function addError($field, $type='string')
    {
        $this->errors[$field] = $type;
    }

    /**
     *
     * Sanatize a single var according to $type.
     * Allows for static calling to allow simple sanatization
     */
    public static function sanatizeItem($var, $type)
    {
        $flags = NULL;
        switch($type)
        {
            case 'url':
                $filter = FILTER_SANITIZE_URL;
            break;
            case 'int':
                $filter = FILTER_SANITIZE_NUMBER_INT;
            break;
            case 'float':
                $filter = FILTER_SANITIZE_NUMBER_FLOAT;
                $flags = FILTER_FLAG_ALLOW_FRACTION | FILTER_FLAG_ALLOW_THOUSAND;
            break;
            case 'email':
                $var = substr($var, 0, 254);
                $filter = FILTER_SANITIZE_EMAIL;
            break;
            case 'string':
            default:
                $filter = FILTER_SANITIZE_STRING;
                $flags = FILTER_FLAG_NO_ENCODE_QUOTES;
            break;

        }
        $output = filter_var($var, $filter, $flags);        
        return($output);
    }

    /** 
     *
     * Validates a single var according to $type.
     * Allows for static calling to allow simple validation.
     *
     */
    public static function validateItem($var, $type)
    {
        if(array_key_exists($type, self::$regexes))
        {
            $returnval =  filter_var($var, FILTER_VALIDATE_REGEXP, array("options"=> array("regexp"=>'!'.self::$regexes[$type].'!i'))) !== false;
            return($returnval);
        }
        $filter = false;
        switch($type)
        {
            case 'email':
                $var = substr($var, 0, 254);
                $filter = FILTER_VALIDATE_EMAIL;    
            break;
            case 'int':
                $filter = FILTER_VALIDATE_INT;
            break;
            case 'boolean':
                $filter = FILTER_VALIDATE_BOOLEAN;
            break;
            case 'ip':
                $filter = FILTER_VALIDATE_IP;
            break;
            case 'url':
                $filter = FILTER_VALIDATE_URL;
            break;
        }
        return ($filter === false) ? false : filter_var($var, $filter) !== false ? true : false;
    }       



}

물론 사용중인 DB 유형에 따라 SQL 쿼리를 피해야한다는 점을 명심하십시오 (예 : SQL Server의 경우 MySQL_Real_Escape_string ()은 쓸모가 없음). 아마도 ORM과 같은 적절한 응용 프로그램 계층에서 이것을 자동으로 처리하고 싶을 것입니다. 또한 위에서 언급 한 바와 같이 : HTML 로의 출력을 위해 HTMLSpecialchars와 같은 다른 PHP 전용 기능을 사용하십시오.)

스트리핑 클래스 및/또는 태그와 같은 HTML 입력을 실제로 허용하기 위해 전용 XSS 유효성 검사 패키지 중 하나에 따라 다릅니다. HTML을 구문 분석하기 위해 자신의 regexes를 쓰지 마십시오!

아니 없어.

우선, SQL 주입은 입력 필터링 문제이며 XSS는 출력을 이스케이프하는 출력입니다. 따라서 코드 라이프 사이클 에서이 두 작업을 동시에 실행하지도 않습니다.

기본 경험의 규칙

  • SQL 쿼리의 경우 파라미터를 바인딩하거나 (PDO와 같이) 쿼리 변수에 드라이버 네이티브 이스케이프 함수를 사용하십시오 (예 : mysql_real_escape_string())
  • 사용 strip_tags() 원치 않는 HTML을 걸러 내기 위해
  • 다른 모든 출력을 피하십시오 htmlspecialchars() 여기에서 2 차 및 세 번째 매개 변수를 염두에 두십시오.

XSS 문제를 해결하려면 살펴보십시오. HTML 정화기. 상당히 구성 가능하며 적절한 실적이 있습니다.

SQL 주입 공격의 경우 사용자 입력을 확인한 다음 MySQL_Real_escape_string ()을 통해 실행하십시오. 기능은 모든 주입 공격을 패배하지 않으므로 쿼리 문자열에 덤프하기 전에 데이터를 확인하는 것이 중요합니다.

더 나은 해결책은 준비된 진술을 사용하는 것입니다. 그만큼 PDO 라이브러리 그리고 mysqli 확장은 이것들을 지원합니다.

PHP 5.2가 소개되었습니다 filter_var 기능.

그것은 많은 소독제를 지원하고 필터를 검증합니다.

http://php.net/manual/en/function.filter-var.php

하나의 트릭에서 도움을 줄 수 있는 특정한 상황에 있는 페이지 /mypage?id=53 를 사용하여,또는 당신은 당신의 id WHERE 절을 확인하는 id 확실히 정수,그래서 다음과 같:

if (isset($_GET['id'])) {
  $id = $_GET['id'];
  settype($id, 'integer');
  $result = mysql_query("SELECT * FROM mytable WHERE id = '$id'");
  # now use the result
}

하지만 물론 그만 상처는 하나의 특정 공격,그래서 모든 다른 답변이 있습니다.(그렇습니다 내가 알기에는 위의 코드는 크지 않다,하지만 그것을 보여줍니다 특정한다.)

PHP로 사용자 입력을 소독하는 방법 :

  • MySQL 및 PHP의 최신 버전을 사용하십시오.

  • charset을 명시 적으로 설정하십시오.

    • $mysqli->set_charset("utf8");
      수동
    • $pdo = new PDO('mysql:host=localhost;dbname=testdb;charset=UTF8', $user, $password);
      수동
    • $pdo->exec("set names utf8");
      수동
    • $pdo = new PDO(
      "mysql:host=$host;dbname=$db", $user, $pass, 
      array(
      PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
      PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"
      )
      );
      수동
    • mysql_set_charset ( 'utf8')
      PHP 5.5.0에서 감가 상각 된 PHP 7.0.0에서 제거됨].
  • 보안 숯불 사용 :

    • UTF8, LATIN1, ASCII .., 취약한 Charsets Big5, CP932, GB2312, GBK, SJIS를 사용하지 마십시오.
  • 공간화 된 기능 사용 :

    • MySQLI 준비된 진술 :
      $stmt = $mysqli->prepare('SELECT * FROM test WHERE name = ? LIMIT 1'); 
      $param = "' OR 1=1 /*";
      $stmt->bind_param('s', $param);
      $stmt->execute();
    • pdo :: QUOTE () - 입력 문자열 주위에 따옴표를 배치하고 (필요한 경우) 기본 드라이버에 적합한 인용 스타일을 사용하여 입력 문자열 내에서 특수 문자를 탈출합니다.

      $pdo = new PDO('mysql:host=localhost;dbname=testdb;charset=UTF8', $user, $password);명시 적 세트 캐릭터 세트
      $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);MySQL이 기본적으로 준비 할 수 없다는 에뮬레이션 진술에 대한 낙하를 방지하기 위해 준비된 진술을 비활성화합니다 (주입을 방지하기 위해)
      $var = $pdo->quote("' OR 1=1 /*");문자를 탈출 할뿐만 아니라 그것을 인용합니다 (단일 쿼트 '문자) $stmt = $pdo->query("SELECT * FROM test WHERE name = $var LIMIT 1");

    • PDO 준비된 진술: vs mysqli 준비 문은 더 많은 데이터베이스 드라이버와 이름이 지정된 매개 변수를 지원합니다.

      $pdo = new PDO('mysql:host=localhost;dbname=testdb;charset=UTF8', $user, $password);명시 적 세트 캐릭터 세트
      $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);MySQL이 기본적으로 준비 할 수 없다는 에뮬레이션 진술에 대한 낙하를 방지하기 위해 준비된 진술을 비활성화합니다 (주입을 방지하기 위해) $stmt = $pdo->prepare('SELECT * FROM test WHERE name = ? LIMIT 1'); $stmt->execute(["' OR 1=1 /*"]);

    • mysql_real_escape_string PHP 5.5.0에서 감가 상각 된 PHP 7.0.0에서 제거됨].
    • mysqli_real_escape_string 연결의 현재 숯을 고려하여 SQL 문에 사용하기 위해 특수 문자를 문자열로 빠져냅니다. 그러나 준비된 진술은 단순히 탈출 된 문자열이 아니기 때문에 준비된 진술을 사용하는 것이 좋습니다. 진술에는 사용될 테이블 및 인덱스를 포함하여 완전한 쿼리 실행 계획이 제공되며 최적화 된 방법입니다.
    • 쿼리 내부의 변수 주변에 단일 따옴표 ( '')를 사용하십시오.
  • 변수에 기대하는 내용이 포함되어 있습니다.

    • 정수를 기대하는 경우 사용하십시오.
      ctype_digit — Check for numeric character(s);
      $value = (int) $value;
      $value = intval($value);
      $var = filter_var('0755', FILTER_VALIDATE_INT, $options);
    • 문자열 사용 :
      is_string() — Find whether the type of a variable is string

      사용 필터 기능 filter_var () - 지정된 필터로 변수를 필터링합니다.
      $email = filter_var($email, FILTER_SANITIZE_EMAIL);
      $newstr = filter_var($str, FILTER_SANITIZE_STRING);
      더 사전 정의 된 필터
    • filter_input () - 이름으로 특정 외부 변수를 가져오고 선택적으로 필터링합니다.
      $search_html = filter_input(INPUT_GET, 'search', FILTER_SANITIZE_SPECIAL_CHARS);
    • preg_match () - 정규 표현식 일치를 수행합니다.
    • 자신의 검증 기능을 작성하십시오.

여기에 설명하는 것은 두 가지 별도의 문제입니다.

  1. 사용자 입력 데이터의 소독 / 필터링.
  2. 탈출 출력.

1) 사용자 입력은 항상 나쁜 것으로 가정해야합니다.

준비된 진술을 사용하거나/및 mysql_real_escape_string으로 필터링하는 것은 반드시 필수입니다. PHP에는 Filter_Input이 내장되어있어 시작하기에 좋은 곳입니다.

2) 이것은 큰 주제이며 데이터가 출력되는 컨텍스트에 따라 다릅니다. HTML의 경우 htmlpurifier와 같은 솔루션이 있습니다. 경험상 항상 당신이 출력하는 것을 피하십시오.

두 문제 모두 단일 게시물로 들어 가지 않기에는 너무 크지 만 더 자세히 설명하는 게시물이 많이 있습니다.

방법 PHP 출력

더 안전한 PHP 출력

PostgreSQL을 사용하는 경우 PG_ESCAPE_STRING ()로 PHP의 입력을 피할 수 있습니다.

 $username = pg_escape_string($_POST['username']);

문서에서 (http://php.net/manual/es/function.pg-escape-string.php):

pg_escape_string ()은 데이터베이스를 쿼리하기 위해 문자열을 이사합니다. 인용문없이 PostgreSQL 형식의 탈출 된 문자열을 반환합니다.

입력을 소독하고 데이터를 피하는 데 실수를 피하는 가장 쉬운 방법은 PHP 프레임 워크를 사용하는 것입니다. Symfony, 네트 등 또는 해당 프레임 워크의 일부 (템플릿 엔진, 데이터베이스 계층, ORM).

템플릿 엔진과 같은 작은 가지 또는 Latte에는 기본적으로 출력이 빠져 나옵니다. 컨텍스트 (HTML 또는 JavaScript 부분)에 따라 출력을 올바르게 탈출 한 경우 수동으로 해결할 필요가 없습니다.

프레임 워크는 입력을 자동으로 소독하며 $ _post, $ _get 또는 $ _session 변수를 직접 사용하지 말고 라우팅, 세션 처리 등과 같은 메커니즘을 통해 사용해서는 안됩니다.

데이터베이스 (모델) 레이어의 경우 Nette 데이터베이스와 같은 PDO 주변의 교리 또는 랩퍼와 같은 ORM 프레임 워크가 있습니다.

여기에서 자세한 내용을 읽을 수 있습니다. 소프트웨어 프레임 워크 란 무엇입니까?

해결해야 할 여러 가지 우려 사항이 있기 때문에 포획 기능이 없습니다.

  1. SQL 주입 - 오늘날, 일반적으로 모든 PHP 프로젝트는 PHP 데이터 객체 (PDO)를 통한 준비된 진술 모범 사례로 주입에 대한 완전한 용액 솔루션뿐만 아니라 길 잃은 견적으로 인한 오류 방지. 또한 데이터베이스에 액세스 할 수있는 가장 유연하고 안전한 방법입니다.

    체크 아웃 (유일한 적절한) pdo 튜토리얼 PDO에 대해 알아야 할 거의 모든 것에 대해. (주제에 대한이 위대한 자원에 대해 최고 기고자 @yourcommonsense에게 진심으로 감사드립니다.)

  2. XSS- 도중에 데이터를 소독합니다 ...

    • HTML 정화기 오랜 시간이 걸렸으며 여전히 적극적으로 업데이트되었습니다. 이를 사용하여 악의적 인 입력을 소독 할 수 있지만 여전히 관대하고 구성 가능한 화이트리스트의 태그를 허용 할 수 있습니다. 많은 wysiwyg 편집기와 잘 어울리지 만 일부 사용 사례에는 무거울 수 있습니다.

    • 다른 경우에, 우리가 HTML/JavaScript를 전혀 받아들이고 싶지 않은 경우, 나는이 간단한 기능이 유용하다는 것을 알았습니다 (그리고 XSS에 대해 여러 감사를 전달했습니다).

      /* Prevent XSS input */ function sanitizeXSS () { $_GET = filter_input_array(INPUT_GET, FILTER_SANITIZE_STRING); $_POST = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING); $_REQUEST = (array)$_POST + (array)$_GET + (array)$_REQUEST; }

  3. XSS- 나가는 길에 데이터 소독 ... 데이터가 데이터베이스에 추가하기 전에 데이터가 올바르게 소독되었다는 것을 보장하지 않으면 사용자에게 표시하기 전에 소독해야합니다. 이러한 유용한 PHP 기능을 활용할 수 있습니다.

    • 전화 할 때 echo 또는 print 사용자가 제공 한 값을 표시하려면 사용하십시오 htmlspecialchars 데이터가 적절하게 소독되어 안전하지 않고 HTML을 표시 할 수 없습니다.
    • json_encode PHP에서 JavaScript까지 사용자가 제공 한 값을 제공하는 안전한 방법입니다.
  4. 외부 쉘 명령을 사용하여 호출합니까? exec() 또는 system() 기능 또는 backtick 운영자? 그렇다면 SQL 주입 및 XSS 외에도 추가 문제가 발생할 수 있습니다. 서버에서 악성 명령을 실행하는 사용자. 사용해야합니다 escapeshellcmd 전체 명령을 피하고 싶다면 또는 escapeshellarg 개별 주장을 피하기 위해.

사용자 데이터를 신뢰하지 마십시오.

function clean_input($data) {
  $data = trim($data);
  $data = stripslashes($data);
  $data = htmlspecialchars($data);
  return $data;
}

그만큼 trim() 함수는 문자열의 양쪽에서 공백 및 기타 사전 정의 된 문자를 제거합니다.

그만큼 stripslashes() 함수는 백 슬래시를 제거합니다

그만큼 htmlspecialchars() 함수 일부 사전 정의 된 문자를 HTML 엔티티로 변환합니다.

사전 정의 된 문자는 다음과 같습니다.

& (ampersand) becomes &amp;
" (double quote) becomes &quot;
' (single quote) becomes &#039;
< (less than) becomes &lt;
> (greater than) becomes &gt;

출력 이스케이프의 주제에서 PHP DomDocument를 사용하여 HTML 출력을 사용하면 올바른 컨텍스트에서 자동으로 빠져 나옵니다. 속성 (value = "")과 a의 내부 텍스트는 u003Cspan>같지 않습니다. XSS에 대해 안전하려면 다음을 읽으십시오.u003C/span>OWASP XSS 예방 치트 시트

당신은 결코 입력을 소독하지 않습니다.

당신은 항상 출력을 소독합니다.

SQL 문에 포함시키기 위해 안전하게 데이터에 적용하는 변환은 HTML에 포함시키기 위해 적용하는 것과 완전히 다르며, JavaScript에 포함하도록 적용하는 것과 완전히 다릅니다. CSS에 포함에 적용하는 것과 완전히 다릅니다. 이메일에 포함하는 데 적용하는 것과 완전히 다릅니다 ....

입력을 확인하십시오 - 추가 처리를 위해 수락 해야하는지 여부를 결정하거나 사용자에게 용납 할 수 없다고 말하십시오. 그러나 PHP 토지를 떠날 때까지 데이터 표현에 변경 사항을 적용하지 마십시오.

오래 전에 누군가가 데이터를 피하기위한 모든 메커니즘에 맞는 한 가지 크기의 한 크기를 발명하려고 시도했고 결국 우리는 그와 함께하게되었습니다. "magic_quotes"모든 출력 대상에 대한 데이터를 제대로 탈출하지 않았으므로 다른 코드가 작동 해야하는 다른 설치가 발생했습니다.

필터 확장이 있습니다 (Howto-Link, 수동), 모든 GPC 변수와 잘 작동합니다. 그래도 마술 도구가 아니지만 여전히 사용해야합니다.

PHP 필터 소독 특수 특수 캐릭터가 유용한 것을 볼 수 있습니다.

처럼:

    $a=fliter_var($_POST['a'],FILTER_SANITIZE_SPECIAL_CHARS);

그러나 재고별로 C 코드를 살펴보면 " '' <> & 0 만 필터링하므로 이것이 소스화의 좋은 방법임을 알 수 있습니다. 그러나 소스 코드를 변경합니다. / {} [].와 같은 다른 문자를 포함하려면``Encode (ENC [ '']) 행 에서이 기능을 강화합니다.

    void php_filter_special_chars(PHP_INPUT_FILTER_PARAM_DECL)
{
unsigned char enc[256] = {0};

php_filter_strip(value, flags);

/* encodes ' " < > & \0 to numerical entities */
enc['\''] = enc['"'] = enc['<'] = enc['>'] = enc['&'] = enc[0] = 1;

/* if strip low is not set, then we encode them as &#xx; */
memset(enc, 1, 32);

if (flags & FILTER_FLAG_ENCODE_HIGH) {
    memset(enc + 127, 1, sizeof(enc) - 127);
}

php_filter_encode_html(value, enc);
}

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;
    }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top