[php] 최고의 PHP 입력 살균 기능은 무엇입니까?

살균하기 위해 모든 문자열을 전달할 수있는 기능을 고안하려고합니다. 따라서 나오는 문자열은 데이터베이스 삽입에 안전합니다. 그러나 필터링 기능 이 너무 많아서 어떤 기능을 사용 해야하는지 확실하지 않습니다.

빈칸을 채우도록 도와주세요 :

function filterThis($string) {
    $string = mysql_real_escape_string($string);
    $string = htmlentities($string);
    etc...
    return $string;
}



답변

중지!

당신은 여기서 실수를하고 있습니다. 아뇨, 데이터를 좀 더 안전하게 만들기 위해 올바른 PHP 기능을 선택했습니다. 괜찮아. 실수는 작업 순서 와 이러한 기능을 사용하는 방법 및 위치입니다.

사용자 데이터 삭제 및 유효성 검사, 스토리지 데이터 이스케이프 및 프리젠 테이션 데이터 이스케이프의 차이점을 이해하는 것이 중요합니다.

사용자 데이터 삭제 및 확인

사용자가 데이터를 제출할 때 원하는 것을 제공했는지 확인해야합니다.

살균 및 필터링

예를 들어 숫자 가 필요한 경우 제출 된 데이터가 숫자인지 확인하십시오 . 사용자 데이터 를 다른 유형으로 캐스트 할 수도 있습니다. 제출 된 모든 것은 처음에 문자열처럼 취급되므로 알려진 숫자 데이터를 정수 또는 부동 소수점으로 강제 설정하면 소독이 빠르고 고통스럽지 않습니다.

자유형 텍스트 필드와 텍스트 영역은 어떻습니까? 해당 필드에 예상치 못한 것이 없는지 확인해야합니다. 주로 HTML 내용이 없어야하는 필드에 실제로 HTML이 포함되어 있지 않은지 확인해야합니다. 이 문제를 처리 할 수있는 두 가지 방법이 있습니다.

먼저 HTML 입력을 빠져 나갈 수 있습니다.htmlspecialchars . htmlentitiesHTML을 중화 하는 데 사용해서는 안됩니다. HTML은 인코딩해야 할 것으로 생각되는 악센트 및 기타 문자의 인코딩도 수행합니다.

둘째, 가능한 HTML을 제거 할 수 있습니다 . strip_tags빠르고 쉽고 빠르지 않습니다. HTML Purifier 는 모든 HTML을 제거하고 태그 및 속성의 선택적 화이트리스트를 허용하는 훨씬 철저한 작업을 수행합니다.

최신 PHP 버전은 에는 필터 확장 기능이 포함 되어있어 사용자 입력을 위생적으로 처리 할 수 ​​있습니다.

확인

제출 된 데이터에 예기치 않은 컨텐츠가 없는지 확인하는 것은 작업의 절반에 불과합니다. 제출 된 데이터에 실제로 작업 할 수있는 값이 포함되어 있는지 확인해야합니다.

1에서 10 사이의 숫자를 예상하면 해당 값을 확인해야합니다. 스피너 및 단계와 함께 새로운 멋진 HTML5 시대 숫자 입력 중 하나를 사용하는 경우 제출 된 데이터가 단계와 일치하는지 확인하십시오.

해당 데이터가 드롭 다운 메뉴에서 가져온 것이면 제출 된 값이 메뉴에 나타나는 값인지 확인하십시오.

다른 요구를 충족시키는 텍스트 입력은 어떻습니까? 예를 들어 날짜 입력은 strtotime또는 DateTime 클래스를 통해 확인해야합니다 . 주어진 날짜는 예상 범위 사이 여야합니다. 이메일 주소는 어떻습니까? 앞에서 언급 한 필터 확장is_email 라이브러리 의 팬이지만 주소의 형식 이 올바른지 확인할 수 있습니다 .

다른 모든 폼 컨트롤에 대해서도 마찬가지입니다 . 라디오 버튼이 있습니까? 목록을 확인하십시오. 확인란이 있습니까? 목록을 확인하십시오. 파일 업로드가 있습니까? 파일이 예상 한 유형인지 확인하고 파일 이름을 필터링되지 않은 사용자 데이터처럼 취급하십시오.

모든 최신 브라우저에는 완벽한 개발자 도구 세트가 내장되어있어 누구나 양식을 조작하기가 쉽지 않습니다. 코드는 사용자가 양식 내용에 대한 모든 클라이언트 측 제한을 완전히 제거했다고 가정해야합니다 !

스토리지를위한 데이터 이스케이프

이제 데이터가 예상 형식으로되어 있고 예상 값만 포함되었으므로 해당 데이터를 스토리지에 유지하는 것에 대해 걱정할 필요가 있습니다.

모든 단일 데이터 저장 메커니즘에는 데이터가 올바르게 이스케이프 및 인코딩되도록하는 특정 방법이 있습니다. SQL을 작성하는 경우 쿼리에서 데이터를 전달하는 방법은 자리 표시자가있는 준비된 명령문을 사용하는 것 입니다.

PHP에서 대부분의 SQL 데이터베이스를 사용하는 더 좋은 방법 중 하나는 PDO 확장 입니다. 명령문준비하고 , 변수를 명령문바인딩 한 다음 , 명령문과 변수를 서버보내는 일반적인 패턴을 따릅니다 . PDO로 작업하지 않은 경우 여기에 꽤 좋은 MySQL 지향 자습서가 있습니다. 있습니다.

일부 SQL 데이터베이스에는 SQL Server , PostgreSQLSQLite 3 등 PHP에서 자체 특수 확장 기능이 있습니다. 이러한 각 확장은 PDO와 동일한 준비 결합 실행 방식으로 작동하는 명령문 지원을 준비했습니다. 비표준 기능이나 동작을 지원하기 위해 PDO 대신 이러한 확장을 사용해야 할 수도 있습니다.

MySQL에는 자체 PHP 확장이 있습니다. 사실 그 중 두 개입니다. mysqli 라는 것을 사용하고 싶습니다 . 이전 “mysql”확장은 더 이상 사용되지 않으며 현대에 사용하기에 안전하거나 제정신이 아닙니다.

나는 개인적으로 mysqli의 팬이 아니다. 준비된 명령문에서 변수 바인딩을 수행하는 방식은 융통성이 없으며 사용하기가 어려울 수 있습니다. 의심스러운 경우 대신 PDO를 사용하십시오.

SQL 데이터베이스를 사용하여 데이터를 저장하지 않는 경우 사용중인 데이터베이스 인터페이스의 설명서를 확인하여 데이터를 안전하게 전달하는 방법을 결정하십시오.

가능하면 데이터베이스가 데이터를 적절한 형식으로 저장해야합니다. 숫자를 숫자 필드에 저장하십시오. 날짜 필드에 날짜를 저장하십시오. 부동 소수점 필드가 아닌 10 진수 필드에 돈을 저장하십시오. 다른 데이터 유형을 올바르게 저장하는 방법에 대해서는 데이터베이스에서 제공 한 문서를 검토하십시오.

프리젠 테이션을위한 데이터 이스케이프

사용자에게 데이터를 표시 할 때마다 데이터가 이스케이프 되어서는 안된다는 것을 알지 않는 한 데이터가 안전하게 이스케이프 되어야합니다.

HTML을 생성 할 때는 거의 항상 원래 사용자가 제공 한 모든 데이터를 전달해야합니다. htmlspecialchars . 사실, 당신이 때 당신이하지 말아야 할 유일한 시간입니다 알고 사용자가 HTML을 한 것으로, 당신은 것을 알고 이미 화이트리스트를 사용하여 소독하고 있다고.

때로는 PHP를 사용하여 자바 스크립트를 생성해야합니다. Javascript에는 HTML과 동일한 이스케이프 규칙이 없습니다! PHP를 통해 Javascript에 사용자 제공 값을 제공하는 안전한 방법은 json_encode입니다.

그리고 더

데이터 유효성 검사에는 더 많은 뉘앙스가 있습니다.

예를 들어, 문자 세트 인코딩은 큰 함정일 수 있습니다 . 귀하의 신청서는 “ UTF-8 전체 . 문자열 데이터를 잘못된 문자 세트로 취급 할 때 발생할 수있는 가상 공격이 있습니다.

이전에는 브라우저 디버그 도구에 대해 언급했습니다. 이 도구를 사용하여 쿠키 데이터를 조작 할 수도 있습니다. 쿠키는 신뢰할 수없는 사용자 입력으로 취급해야합니다 .

데이터 유효성 검사 및 이스케이프는 웹 응용 프로그램 보안의 한 측면 일뿐입니다. 웹 애플리케이션 공격 방법론을 숙지하여 이에 대한 방어 수단을 구축해야합니다.


답변

SQL 주입을 방지하기위한 가장 효과적인 살균은를 사용하는 매개 변수화 PDO입니다. 매개 변수화 된 쿼리를 사용하면 쿼리가 데이터와 분리되므로 1 차 SQL 주입의 위협이 제거됩니다.

HTML을 제거한다는 측면에서 HTML strip_tags만 제거하는 것이 가장 좋습니다. HTML 만 제거하면됩니다. htmlentities소리가 잘 들리므로 작동합니다. 허용 할 HTML을 구문 분석해야하는 경우 (즉, 일부 태그 를 허용하려는 경우 ) HTML Purifier 와 같은 기존의 기존 구문 분석기를 사용해야합니다.


답변

데이터베이스 입력-SQL 삽입을 방지하는 방법

  1. 예를 들어 정수 유형의 데이터가 실제로 정수인지 확인하여 유효한지 확인하십시오.
    • 문자열이 아닌 경우 데이터가 실제로 올바른 유형인지 확인해야합니다.
    • 문자열의 경우 쿼리에서 문자열을 따옴표로 묶어야합니다 (분명히 그렇지 않으면 작동하지 않습니다)
  2. SQL 삽입을 피하면서 데이터베이스에 값을 입력하십시오 (mysql_real_escape_string 또는 매개 변수화 된 쿼리)
  3. 데이터베이스에서 값을 검색 할 때 페이지에 HTML을 삽입 할 수 없도록하여 사이트 간 스크립팅 공격을 피하십시오 (htmlspecialchars).

데이터베이스에 삽입하거나 업데이트하기 전에 사용자 입력을 이스케이프해야합니다. 여기에 오래된 방법이 있습니다. 이제 매개 변수화 된 쿼리를 사용하려고합니다 (아마도 PDO 클래스에서).

$mysql['username'] = mysql_real_escape_string($clean['username']);
$sql = "SELECT * FROM userlist WHERE username = '{$mysql['username']}'";
$result = mysql_query($sql);

데이터베이스 출력-XSS 방지 방법 (Cross Site Scripting)

htmlspecialchars()데이터베이스에서 데이터를 출력 할 때만 사용하십시오 . HTML Purifier에도 동일하게 적용됩니다. 예:

$html['username'] = htmlspecialchars($clean['username'])

그리고 마지막으로 … 당신이 요청한 것

매개 변수가있는 쿼리 (적절한 방법)와 함께 PDO 객체를 사용하면 이것을 쉽게 달성 할 수있는 쉬운 방법이 없다는 것을 지적해야합니다. 그러나 이전 ‘mysql’방법을 사용하면 이것이 필요합니다.

function filterThis($string) {
    return mysql_real_escape_string($string);
}


답변

내 5 센트

여기서 아무도 mysql_real_escape_string작동 방식을 이해하지 못합니다 . 이 기능은 아무것도 필터링하거나 “위생 처리”하지 않습니다.
따라서이 기능을 주입에서 절약 할 수있는 범용 필터로 사용할 수 없습니다.
작동 방식과 적용 가능한 위치를 이해 한 경우에만 사용할 수 있습니다.

필자는 이미 쓴 것과 비슷한 질문에 대한 답을 가지고 있습니다
.PHP에서 데이터베이스에 문자열을 제출할 때 htmlspecialchars ()를 사용하여 불법 문자를 처리하거나 정규식을 사용해야합니까?
데이터베이스 측 안전에 대한 자세한 설명을 보려면 클릭하십시오.

htmlentities와 관련하여 Charles는 이러한 기능을 분리하도록 지시합니다.
HTML을 게시 할 수있는 관리자가 생성 한 데이터를 삽입한다고 가정 해보십시오. 당신의 기능은 그것을 망칠 것입니다.

나는 htmlentities에 대해 조언 할 것이지만. 이 기능은 오래 전에 더 이상 사용되지 않습니다. 교체 할 경우에만 <, >"HTML의 안전을 위하여 문자는 – 안 – 그 목적을 위해 의도적으로 개발 된 기능을 사용하여 반드시 htmlspecialchars () 를.


답변

데이터베이스 삽입의 경우 필요한 것은 mysql_real_escape_string매개 변수화 된 쿼리를 사용하는 것입니다. 일반적으로 데이터를 저장하기 전에 데이터를 변경하지 않으려 고합니다 htmlentities. 나중에 실행할 때 깨진 혼란으로 이어질 것입니다.htmlentities 웹 페이지의 어딘가에 표시하기 위해 다시 입니다.

사용하다 htmlentities웹 페이지에 데이터를 표시 할 때 .

예를 들어 연락처 양식과 같이 이메일로 제출 된 데이터를 전자 메일로 보내는 경우 머리글에 사용될 모든 데이터에서 줄 바꿈을 제거하십시오 (보낸 사람 : 이름 및 전자 메일 주소, 하위 항목 등). )

$input = preg_replace('/\s+/', ' ', $input);

이 작업을 수행하지 않으면 스팸 봇이 양식을 찾아서 악용하기까지 시간 문제 일뿐입니다. 어려운 방법을 배웠습니다.


답변

1) 네이티브 PHP 필터를 사용 하면 다음과 같은 결과가 나타납니다.

여기에 이미지 설명을 입력하십시오

(소스 스크립트 : https : // RunFor github.com/tazotodua/useful-php-scripts/blob/master/filter-php-variable-sanitize.php )


답변

사용중인 데이터의 종류에 따라 다릅니다. 일반적으로 사용하는 것이 가장 mysqli_real_escape_string좋지만 예를 들어, HTML 콘텐츠가 없다는 것을 알고 있습니다. strip_tags를 사용하면 보안이 강화됩니다.

허용해서는 안되는 문자를 제거 할 수도 있습니다.