programing

상수 FILTER_SANITIZE_STRING이 더 이상 사용되지 않습니다.

jooyons 2023. 8. 18. 22:31
반응형

상수 FILTER_SANITIZE_STRING이 더 이상 사용되지 않습니다.

저는 PHP 8.1을 설치했고 이전 프로젝트를 테스트하기 시작했습니다.▁filter다 필터를 사용해 왔습니다.FILTER_SANITIZE_STRING 예:

$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);

이제 다음 오류가 발생했습니다.

사용되지 않음:상수 FILTER_SANITIZE_STRING이 더 이상 사용되지 않습니다.

사용할 때도 마찬가지입니다.FILTER_SANITIZE_STRIPPED:

사용되지 않음:상수 FILTER_SANITIZE_STRIPPED가 더 이상 사용되지 않습니다.

무엇으로 대체할 수 있습니까?

이 필터는 용도가 분명하지 않습니다.정확히 무엇을 달성하기 위한 것인지, 언제 사용해야 하는지 말하기 어렵습니다.또한 이름 때문에 기본 문자열 필터와 혼동되었습니다. 실제로는 기본 문자열 필터가 호출됩니다.FILTER_UNSAFE_RAWPHP 커뮤니티는 이 필터의 사용을 더 이상 지원하지 않기로 결정했습니다.

이 필터의 동작은 매우 직관적이지 않았습니다.그것은 사이의 모든 것을 제거했습니다.<의 끝이나 그고문의또다 번 까 지 음 는 끝 자 열 리 ▁the ▁and 번 까 지 ▁until>또한 모든 데이터를 제거했습니다.NUL바트입다니를 인코딩했습니다. 마침내, 암호화를 했습니다.'그리고."HTML 엔티티에 추가할 수 있습니다.

교체하려면 다음과 같은 몇 가지 옵션이 있습니다.

  1. 필터 사용 " " " 를 사용합니다.FILTER_UNSAFE_RAW필터링을 하지 않습니다.만약 당신이 그 행동에 대해 전혀 몰랐다면 이것을 사용해야 합니다.FILTER_SANITIZE_STRING문자열 값을 제공하는 기본 필터를 사용하려고 합니다.

  2. XSS 취약성으로부터 보호하기 위해 이 필터를 사용한 경우 해당 필터의 사용을 로 바꿉니다. 입력 데이터에서 이 함수를 호출하지 마십시오.XSS로부터 보호하려면 출력을 인코딩해야 합니다!

  3. 필터가 어떤 역할을 하는지 정확히 알고 있고 폴리필을 만들려면 정규식을 사용하여 쉽게 만들 수 있습니다.

    function filter_string_polyfill(string $string): string
    {
        $str = preg_replace('/\x00|<[^>]*>?/', '', $string);
        return str_replace(["'", '"'], ['&#39;', '&#34;'], $str);
    }
    

입력을 검사하지 마십시오.이스케이프 출력.

안전한 html 문자열에서 변수를 변환하려는 경우 대신 사용할 수 있는 가장 가까운 상수는 FILTER_SANITIZE_FULL_SPECIAL_CHARS입니다.

설명서에서 다음으로 대체해야 합니다.htmlspecialchars().

필터_SANITIZE_STRING

태그 및 HTML-인코딩 이중 따옴표와 단일 따옴표, 선택적으로 특수 문자를 제거하거나 인코딩합니다.FILTER_FLAG_NO_ENCODE_QUOTES를 설정하여 따옴표 인코딩을 해제할 수 있습니다. (PHP 8.1.0에서 사용되지 않음, 대신 htmls special chares()를 사용합니다.)

필터_SANITIZE_STRIPPED

"string" 필터의 별칭입니다. (PHP 8.1.0에서 사용되지 않으며 대신 htmls special chars()를 사용합니다.)

이렇게 FILTER_SANITIZE_STRING 상수를 교체했습니다.이렇게 하면 플래그도 사용할 수 있습니다.

저는 몇 가지 PHP 백엔드 테스트를 받았는데, 이 방법으로 잘 작동합니다.개선해 주셔서 감사합니다.

/**
 * @param string $value
 * @param array $flags
 * @return string
 */
private static function sanitizeFilterString($value, array $flags): string
{
    $noQuotes = in_array(FILTER_FLAG_NO_ENCODE_QUOTES, $flags);
    $options = ($noQuotes ? ENT_NOQUOTES : ENT_QUOTES) | ENT_SUBSTITUTE;
    $optionsDecode = ($noQuotes ? ENT_QUOTES : ENT_NOQUOTES) | ENT_SUBSTITUTE;

    // Strip the tags
    $value = strip_tags($value);

    // Run the replacement for FILTER_SANITIZE_STRING
    $value = htmlspecialchars($value, $options);

    // Fix that HTML entities are converted to entity numbers instead of entity name (e.g. ' -> &#34; and not ' -> &quote;)
    // https://stackoverflow.com/questions/64083440/use-php-htmlentities-to-convert-special-characters-to-their-entity-number-rather
    $value = str_replace(["&quot;", "&#039;"], ["&#34;", "&#39;"], $value);

    // Decode all entities
    return html_entity_decode($value, $optionsDecode);
}

다음과 같이 쉽게 대체할 수 있습니다.

FILTER_UNSAFE_RAW

언급URL : https://stackoverflow.com/questions/69207368/constant-filter-sanitize-string-is-deprecated

반응형