programing

가장 좋은 PHP 입력 삭제 기능은 무엇입니까?

minecode 2023. 1. 24. 08:24
반응형

가장 좋은 PHP 입력 삭제 기능은 무엇입니까?

나는 내 모든 끈을 통해 소독할 수 있는 기능을 생각해 내려고 한다.따라서 여기서 나오는 문자열은 데이터베이스 삽입에 안전합니다.하지만 필터링 기능이 너무 많아서 어떤 기능을 사용해야 할지/필요할지 모르겠어요.

빈칸을 채우는 것을 도와주세요.

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

멈춰!

지금 실수하는 거야아니요, 데이터를 좀 더 안전하게 하기 위해 올바른 PHP 기능을 선택하셨습니다.괜찮아요.조작 순서, 이러한 기능의 사용 방법, 사용 장소에 잘못이 있습니다.

사용자 데이터 삭제와 검증, 스토리지용 데이터 이스케이프 및 프레젠테이션용 데이터 이스케이프 간의 차이를 이해하는 것이 중요합니다.

사용자 데이터 삭제 및 검증

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

삭제 및 필터링

예를 들어 숫자를 예상하는 경우 제출된 데이터가 숫자인지 확인하십시오.사용자 데이터를 다른 유형으로 캐스트할 수도 있습니다.송신된 모든 것은 처음에는 문자열과 같이 취급되기 때문에 기존의 수치 데이터를 강제로 정수 또는 플로트로 하면 빠르고 쉽게 소거할 수 있습니다.

자유 형식의 텍스트 필드와 텍스트 영역은 어떻습니까?그 분야에서 예기치 않은 일이 없도록 해야 합니다.주로 HTML 콘텐츠가 없어야 하는 필드에 실제로 HTML이 포함되어 있는지 확인해야 합니다. 이 문제를 해결할 수 있는 두 가지 방법이 있습니다.

먼저 HTML 입력의 이스케이프를 시도할 수 있습니다.HTML을 무력화하기 위해서는 사용하지 마십시오.HTML은 악센트 문자나 부호화가 필요하다고 생각되는 문자를 부호화하기도 하기 때문입니다.

둘째, HTML을 삭제해 볼 수 있습니다.빠르고 쉽지만 엉성하기도 합니다.HTML Pure는 모든 HTML을 제거하고 태그와 속성의 선택적 화이트리스트를 통과시키는 훨씬 더 철저한 작업을 수행합니다.

최신 버전의 PHP는 필터 확장자와 함께 제공되며, 이 확장자는 사용자 입력을 삭제할 수 있는 포괄적인 방법을 제공합니다.

확인

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

1에서 10 사이의 숫자를 예상할 경우 해당 값을 확인해야 합니다.만약 당신이 스피너와 스텝에서 HTML5 시대의 새로운 숫자 입력 중 하나를 사용하고 있다면, 제출된 데이터가 스텝과 일치하는지 확인하십시오.

해당 데이터가 드롭다운메뉴에서 가져온 경우 전송된 값이 메뉴에 표시된 값인지 확인합니다.

다른 요구를 만족시키는 텍스트 입력은 어떻습니까?예를 들어 날짜 입력은 또는 DateTime 클래스를 통해 검증해야 합니다.지정된 날짜는 예상 범위 내에 있어야 합니다.이메일 주소는요?저는 is_email 라이브러리의 이지만 앞에서 설명한 필터 확장을 통해 주소가 올바른 형식인지 확인할 수 있습니다.

다른 모든 양식 컨트롤에서도 마찬가지입니다.라디오 버튼이 있나요?목록에 대해 검증합니다.체크박스가 있나요?목록에 대해 검증합니다.파일을 업로드하시겠습니까?파일이 예상된 유형인지 확인하고 파일 이름을 필터링되지 않은 사용자 데이터와 동일하게 취급하십시오.

모든 최신 브라우저에는 완전한 개발자 툴 세트가 내장되어 있기 때문에 누구나 폼을 조작할 수 있습니다.코드에서는 사용자가 양식 컨텐츠에 대한 모든 클라이언트제한을 완전히 제거했다고 가정해야 합니다.

저장을 위한 데이터 이스케이프

이제 데이터가 예상 형식인지 확인하고 예상 값만 포함하는지 확인했으므로 해당 데이터를 스토리지에 유지할 수 있을지 걱정해야 합니다.

모든 데이터 스토리지 메커니즘에는 데이터가 올바르게 이스케이프되고 인코딩되도록 하는 고유한 방법이 있습니다.SQL을 빌드하는 경우 쿼리에서 데이터를 전달할 수 있는 방법은 플레이스홀더와 함께 준비된 문을 사용하는 것입니다.

PHP에서 대부분의 SQL 데이터베이스를 사용하는 가장 좋은 방법 중 하나는 PDO 확장입니다.스테이트먼트준비하고, 스테이트먼트에 변수를 바인드하고, 스테이트먼트와 변수를 서버에 송신하는 일반적인 패턴을 따릅니다.PDO를 사용해 본 적이 없다면 MySQL 중심의 튜토리얼을 소개합니다.

SQL Server, Postgre 등 일부 SQL 데이터베이스에는 PHP에 고유한 특수 확장 기능이 있습니다.SQLSQLite 3.각 확장 기능에는 PDO와 동일한 준비 바인딩 실행 방식으로 작동하는 문장 지원이 준비되어 있습니다. 경우에 따라서는 비표준 기능 또는 동작을 지원하기 위해 PDO 대신 이러한 확장 기능을 사용해야 할 수 있습니다.

MySQL에는 자체 PHP 확장 기능도 있습니다.사실 그 중 두 명이요 mysqli라는 것만 쓰고 싶어하잖아오래된 "mysql" 확장자는 더 이상 사용되지 않으며, 현대 시대에 사용하기에 안전하지 않거나 적절하지 않습니다.

저는 개인적으로 misqli의 팬이 아닙니다.준비된 스테이트먼트에 대해 가변 바인딩을 수행하는 방법은 유연하지 않고 사용하기 어려울 수 있습니다.확실하지 않은 경우 PDO를 대신 사용하십시오.

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

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

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

데이터를 사용자에게 표시할 때마다 데이터를 이스케이프해서는 안 된다는 을 모르는 한 데이터가 안전하게 이스케이프되었는지 확인해야 합니다.

HTML을 내보낼 때는 사용자가 처음에 제공한 데이터를 거의 항상 전달해야 합니다. 실제로 사용자가 HTML을 제공했으며 이미 화이트리스트를 사용하여 삭제되었음을 알고 있는 경우에만 이 작업을 수행할 수 있습니다.

때로는 PHP를 사용하여 Javascript를 생성해야 합니다.Javascript는 HTML과 동일한 이스케이프 규칙을 가지고 있지 않습니다! 사용자가 제공한 값을 PHP를 통해 Javascript에 제공하는 안전한 방법은 를 사용하는 것입니다.

기타

데이터 검증에는 더 많은 뉘앙스가 있습니다.

를 들어 문자 집합 인코딩은 큰 트랩이 될 수 있습니다.신청은 "UTF-8"에 기재된 모든 절차를 따라야 합니다.문자열 데이터를 잘못된 문자 집합으로 취급할 때 발생할 수 있는 가상 공격이 있습니다.

앞에서 브라우저 디버깅툴에 대해 설명했습니다.이러한 도구는 쿠키 데이터를 조작하는 데도 사용할 수 있습니다.쿠키는 신뢰할 수 없는 사용자 입력으로 취급해야 합니다.

데이터 검증과 이스케이프는 웹 애플리케이션 보안의 한 측면일 뿐입니다.응용 프로그램 공격 방법론을 숙지하여 웹 응용 프로그램 공격 방법을 구축해야 합니다.

가장 은 SQL을 사용한 입니다.PDO주입의 합니다. 파라미터화된 쿼리를 사용하여 쿼리와 데이터를 분리하여 1차 SQL 주입의 위협을 제거합니다.

의 에 관해서는, HTML 의 삭제에 관해서입니다.strip_tagsHTML html html html html 。모든 것을 삭제하기만 하면 되기 때문입니다. htmlentities소리나는 대로 할 수 있으니까 그것도 효과가 있어요.허용할 HTML을 해석해야 하는 경우(즉, 일부 태그를 허용해야 하는 경우), HTML Pureator와 같은 성숙한 기존 파서를 사용해야 합니다.

데이터베이스 입력 - 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(사이트 간 스크립팅)를 방지하는 방법

htmlspecialchars()데이터베이스에서 데이터를 출력할 때만 사용할 수 있습니다.HTML 퍼수어 ::

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

그리고 마지막으로...당신이 요구한 것

PDO 오브젝트를 파라미터화된 쿼리(적절한 방법)와 함께 사용하는 경우 이를 쉽게 달성할 수 있는 방법은 없습니다.그러나 기존의 'mysql' 방식을 사용하는 경우에는 이 방법이 필요합니다.

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

내 5센트.

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

저는 제가 이미 쓴 것과 매우 유사한 질문에 대한 답을 가지고 있습니다.PHP에서는 데이터베이스에 문자열을 제출할 때 htmlspecialchars()를 사용하여 잘못된 문자를 처리해야 합니까, 아니면 정규 표현을 사용해야 합니까?
데이터베이스 측의 안전성에 대한 자세한 설명을 보려면 클릭하십시오.

- .htmlentity Charles는 Charles를 말합니다.
관리자가 생성한 HTML을 게시할 수 있는 데이터를 삽입한다고 상상해 보십시오. 그러면 기능이 손상됩니다.

htmlentity는.이 기능은 오래 전에 폐지되었습니다.「」만 .<,> , , , , 입니다."HTML의 안전을 위해 개발된 기능인 htmlspecialchars()를 사용합니다.

삽입에 한 것은 「」입니다.mysql_real_escape_string(어느쪽이든)하기 전에 않은 경우가 많은데, 를 저장하기 전에 .htmlentities그러면 나중에 뒤죽박죽이 될 거예요htmlentities웹 페이지 어딘가에 표시하기 위해 다시 한 번 클릭합니다.

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

어느 정도 관련성이 있습니다.예를 들어 연락처 폼과 같이 이메일로 송신된 데이터를 송신하는 경우는, 헤더에 사용되는 모든 데이터(발신자:이름과 이메일 주소, 서브섹트 등)에서 새로운 행을 삭제해 주세요.

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

이렇게 하지 않으면 스팸 봇이 폼을 찾아 악용하는 건 시간 문제일 뿐이에요. 난 힘든 방법을 배웠어요.

사용하는 데이터의 종류에 따라 다릅니다.으로 사용하는 .mysqli_real_escape_string예를 들어 HTML 콘텐츠는 존재하지 않습니다.strip_tags를 사용하면 보안이 강화됩니다.

허용되지 않아야 하는 문자를 제거할 수도 있습니다.

mysql_real_escape_string()은 다음과 같은 코드로 사용합니다.

$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
  mysql_real_escape_string($user),
  mysql_real_escape_string($password)
);

매뉴얼에서 설명한 바와 같이 그 목적은 인수로 전달된 문자열 내의 특수문자를 이스케이프하는 것입니다.이는 접속의 현재 문자 세트를 고려하여 mysql_query()에 배치하는 것이 안전합니다.이 문서에는 다음 내용도 포함되어 있습니다.

이진 데이터를 삽입하려면 이 함수를 사용해야 합니다.

htmlentities()는 HTML 콘텐츠에서 문자열을 출력할 때 엔티티 내의 일부 문자를 변환하기 위해 사용됩니다.

항상 GUMP와 같은 작은 검증 패키지를 사용할 것을 권장합니다.https://github.com/Wixel/GUMP

이러한 라이브러리에서 모든 기본 기능을 구축하면 위생 상태를 잊을 수 없습니다."mysql_real_escape_string"은 적절한 필터링을 위한 최선의 대안이 아닙니다("Your Common Sense"에서 설명한 것처럼). 단 한 번만 사용하지 않으면 주입 및 기타 악의적인 공격을 통해 시스템 전체가 공격받을 수 있습니다.

1) 네이티브 php 필터를 사용하면 다음과 같은 결과를 얻을 수 있습니다.

여기에 이미지 설명 입력


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

이게 제가 지금 연습하고 있는 방법 중 하나예요.

  1. CSRF 및 소금 유혹 토큰을 사용자의 요청과 함께 삽입하고 요청에서 모두 검증합니다.여기를 참조해 주세요.
  2. 클라이언트 측 쿠키에 너무 의존하지 않도록 하고 서버 측 세션을 사용하는 연습을 하십시오.
  3. 데이터를 해석할 때는 반드시 데이터 타입과 전송 방식(POST나 GET 등)만을 받아들입니다.
  4. webApp/App에 SSL을 사용해야 합니다.
  5. 스팸 요청을 의도적으로 제한하기 위해 타임베이스 세션 요청도 생성해야 합니다.
  6. 데이터를 서버에 구문 분석할 때, 요청이 json, html 등과 같은 원하는 데이터 모드에서 이루어져야 하는지 확인합니다.그 후 계속 진행합니다.
  7. 이스케이프 유형을 사용하여 입력에서 모든 잘못된 속성을 이스케이프합니다.예를 들면, 리얼 에스케이스트링 같은 거요.
  8. 그런 다음 사용자에게 원하는 데이터 유형의 깨끗한 형식만 확인합니다.
    §:
    : 합니다. - 입력이 올바른 이메일 형식인지 확인합니다.
    - - 인지 합니다입력만 텍스트 형식(문자열)인지 확인합니다.
    : 할 수 number : 자자 、 - - 、 - - - - - - - 。
    -. 는 php 등의 입력 Pelase php php php pel pel pel pel pel pel pel pel pel pel pel pel pel pel 。
    되면 준비된 /PDO를 SQL 스테이트먼트/PDO 를 사용해 주세요
    후 합니다. - 종료합니다.
    후 마십시오.- 는 것이 좋습니다.

내가 믿는 건 그게 기본초로는 충분하다고 생각해.해커로부터의 모든 주요 공격을 방지할 수 있습니다.

서버 측 보안을 위해 apache/htaccess에서 액세스 제한 및 로봇 차단 및 라우팅 차단 기능을 설정할 수 있습니다.서버측의 시큐러티에는, 서버측의 시큐러티 이외에 할 일이 많이 있습니다.

htaccess apache sec 레벨(공통 rpactices)에서 초의 복사본을 학습 및 가져올 수 있습니다.

사용방법:

$string = htmlspecialchars(strip_tags($_POST['example']));

또는 다음과 같습니다.

$string = htmlentities($_POST['example'], ENT_QUOTES, 'UTF-8');

말씀하신 대로 SQL 위생을 사용하고 있습니다.PDO와 준비된 스테이트먼트를 사용하는 것을 추천합니다.이렇게 하면 보호가 대폭 개선되지만 SQL에 전달된 사용자 입력을 삭제하기 위한 추가 조사를 수행하십시오.

준비된 문을 사용하려면 다음 예를 참조하십시오.값에 대해 ?의 sql이 있는 경우 이름, 성, 이메일이라는3개의 문자열 'ss'로 바인드 합니다.

// prepare and bind

$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)");

$stmt->bind_param("sss", $firstname, $lastname, $email);

여기서 mysql_real_escape_string에 대해 이야기하고 있는 모든 사용자는 이 함수가 PHP5에서 폐지되어 PHP7에서는 존재하지 않는다는 점에 유의해야 합니다.

IMHO가 이 작업을 수행하는 가장 좋은 방법은 PDO를 사용하여 매개 변수화된 쿼리를 사용하여 데이터베이스와 상호 작용하는 것입니다.https://phpdelusions.net/pdo_examples/select 를 확인해 주세요.

항상 필터를 사용하여 사용자 입력을 처리하십시오.http://php.net/manual/es/function.filter-input.php 를 참조해 주세요.

function sanitize($string, $dbmin, $dbmax) {
    $string = preg_replace('#[^a-z0-9]#i', '', $string); // Useful for strict cleanse, alphanumeric here
    $string = mysqli_real_escape_string($con, $string); // Get it ready for the database
    if(strlen($string) > $dbmax ||
       strlen($string) < $dbmin) {

        echo "reject_this"; exit();
    }
    return $string;
}

언급URL : https://stackoverflow.com/questions/3126072/what-are-the-best-php-input-sanitizing-functions

반응형