가장 좋은 PHP 입력 소싱 함수는 무엇입니까?
카테고리 없음가장 좋은 PHP 입력 소싱 함수는 무엇입니까?
나는 모든 문자열을 통과시켜 살균 할 수있는 기능을 찾아 내려고 노력 중이다. 그래서 그것에서 나오는 문자열은 데이터베이스 삽입에 안전합니다. 그러나 거기에 너무 많은 필터링 기능이있어 내가 사용해야 / 해야하는지 모르겠다.
공란을 기입하는 데 도움주세요 :
function filterThis($string) {
$string = mysql_real_escape_string($string);
$string = htmlentities($string);
etc...
return $string;
}
해결법
-
==============================
1.
너 여기서 실수하고있어. 아, 아니요, 데이터를 좀 더 안전하게 만들어주는 올바른 PHP 함수를 선택하셨습니다. 괜찮아. 귀하의 실수는 운영의 순서에 있으며, 이러한 기능을 사용하는 방법과 장소입니다.
사용자 데이터의 삭제 및 유효성 검사, 저장 용 데이터 이스케이프 및 프레젠테이션 용 데이터 이스케이프의 차이점을 이해하는 것이 중요합니다.
사용자가 데이터를 제출할 때 데이터가 예상 한 것을 제공했는지 확인해야합니다.
예를 들어 번호가 필요하면 제출 된 데이터가 숫자인지 확인하십시오. 사용자 데이터를 다른 유형으로 캐스팅 할 수도 있습니다. 제출 된 모든 것은 처음에는 문자열처럼 취급되므로 알려진 수치 데이터를 정수 또는 부동 소수점으로 강제하면 위생 처리가 빠르고 쉽습니다.
자유 형식 텍스트 필드 및 텍스트 영역은 어떻습니까? 당신은 그 분야에서 예기치 않은 것이 전혀 없는지 확인해야합니다. 주로 HTML 컨텐트가 없어야하는 필드에 실제로 HTML이 포함되지 않도록해야합니다. 이 문제를 해결할 수있는 두 가지 방법이 있습니다.
먼저 htmlspecialchars를 사용하여 HTML 입력을 이스케이프 처리 할 수 있습니다. htmlentities를 사용하여 HTML을 무효화하면 안됩니다. 악센트 부호가있는 문자와 다른 문자도 인코딩하므로 코드를 인코딩해야합니다.
둘째, 가능한 모든 HTML을 제거 할 수 있습니다. strip_tags는 빠르고 쉽지만 또한 엉성함. HTML 정수기는 모든 HTML을 제거하고 태그와 속성의 선택적 화이트리스트를 허용하는 훨씬 더 철저한 작업을 수행합니다.
최신 PHP 버전은 사용자 입력을 위생적으로 처리 할 수있는 포괄적 인 방법을 제공하는 필터 확장과 함께 제공됩니다.
제출 된 데이터에 예기치 않은 콘텐츠가 없음을 확인하는 것은 작업의 절반에 불과합니다. 또한 제출 된 데이터에 실제로 작업 할 수있는 값이 포함되어 있는지 확인해야합니다.
1에서 10 사이의 숫자가 필요하다면 그 값을 확인해야합니다. 스피너와 단계가있는 멋진 HTML5 시대 숫자 입력 중 하나를 사용하는 경우 제출 된 데이터가 단계와 일치하는지 확인하십시오.
해당 데이터가 드롭 다운 메뉴에서 가져온 것이 었다면 제출 된 값이 메뉴에 표시된 값인지 확인하십시오.
다른 필요를 충족시키는 텍스트 입력은 어떻습니까? 예를 들어 날짜 입력은 strtotime 또는 DateTime 클래스를 통해 유효성을 검사해야합니다. 주어진 날짜는 예상 한 범위 사이 여야합니다. 전자 메일 주소는 어떻습니까? 위에서 언급 한 필터 확장은 is_email 라이브러리의 팬이지만 주소가 올바른지 검사 할 수 있습니다.
다른 모든 폼 컨트롤에 대해서도 마찬가지입니다. 라디오 버튼있어? 목록에 대해 유효성을 검사합니다. 체크 박스가 있습니까? 목록에 대해 유효성을 검사합니다. 파일을 업로드 하시겠습니까? 파일이 예상되는 유형인지 확인하고 필터링되지 않은 사용자 데이터처럼 파일 이름을 처리하십시오.
모든 최신 브라우저에는 바로 개발 된 완벽한 개발자 도구 세트가 제공되므로 누구나 양식을 조작 할 수 있습니다. 코드는 사용자가 양식 내용의 모든 클라이언트 측 제한을 완전히 제거했다고 가정해야합니다!
데이터가 예상 된 형식으로되어 있으며 예상 값만 포함 했으므로 저장소에 해당 데이터를 보존하는 것에 대해 걱정할 필요가 있습니다.
모든 단일 데이터 저장 메커니즘에는 데이터가 올바르게 이스케이프되고 인코딩되도록하는 특수한 방법이 있습니다. SQL을 작성하는 경우 쿼리에서 데이터를 전달하는 데 사용할 수있는 방법은 자리 표시자를 사용하여 준비된 문을 사용하는 것입니다.
PHP에서 대부분의 SQL 데이터베이스로 작업하는 더 좋은 방법 중 하나는 PDO 확장입니다. 이것은 명령문을 준비하고 변수를 명령문에 바인드 한 다음 명령문 및 변수를 서버로 보내는 일반적인 패턴을 따릅니다. PDO로 작업하기 전에 여기서는 꽤 좋은 MySQL 지향 자습서를 가지고 있습니다.
일부 SQL 데이터베이스는 SQL Server, PostgreSQL 및 SQLite 3을 포함하여 PHP에서 고유 한 특수 확장 기능을 가지고 있습니다. 이러한 각 확장 기능은 PDO와 동일한 prepare-bind-execute 방식으로 작동하는 명령문 지원을 준비합니다. 때로는 비표준 기능이나 동작을 지원하기 위해 PDO 대신 이러한 확장을 사용해야 할 수도 있습니다.
MySQL은 또한 PHP 확장을 가지고 있습니다. 사실 그들 중 두 명. mysqli라고 불리는 것을 사용하고 싶을 뿐이다. 오래된 "mysql"확장은 더 이상 사용되지 않으며 현대 시대에는 사용하기에 안전하지도 안전하지 않습니다.
저는 개인적으로 mysqli의 팬이 아닙니다. 준비된 명령.에서 변수 바인딩을 수행하는 f}은 융통성이 없으며 g 용할 수 있습니다. 의심 스럽다면 대신 PDO를 사용하십시오.
SQL 데이터베이스를 사용하여 데이터를 저장하지 않는 경우 사용중인 데이터베이스 인터페이스의 문서를 참조하여 안전하게 데이터를 전달하는 방법을 결정하십시오.
가능한 경우 데이터베이스가 데이터를 적절한 형식으로 저장하는지 확인하십시오. 숫자 필드에 숫자를 저장하십시오. 날짜 필드에 날짜를 저장하십시오. 부동 소수점 필드가 아닌 십진 필드에 돈을 저장하십시오. 다른 데이터 유형을 올바르게 저장하는 방법에 대해 데이터베이스가 제공 한 문서를 검토하십시오.
사용자에게 데이터를 보여줄 때마다 이스케이프 처리하지 않아야한다는 것을 알지 않는 한 데이터를 안전하게 이스케이프 처리해야합니다.
HTML을 방출 할 때는 htmlspecialchars를 통해 원래 사용자가 제공 한 모든 데이터를 거의 항상 전달해야합니다. 사실, 사용자가 HTML을 제공했음을 알고 있고 허용 목록을 사용하여 이미 위생 처리되었음을 알고있는 경우에만이를 수행해서는 안됩니다.
PHP를 사용하여 자바 스크립트를 생성해야하는 경우가 있습니다. Javascript에는 HTML과 같은 이스케이프 규칙이 없습니다! PHP를 통해 사용자가 제공 한 값을 Javascript에 제공하는 안전한 방법은 json_encode를 사용하는 것입니다.
데이터 유효성 검사에는 더 많은 뉘앙스가 있습니다.
예를 들어, 문자 집합 인코딩은 큰 함정이 될 수 있습니다. 귀하의 신청서는 "UTF-8"에 명시된 관행을 따라야합니다. 문자열 데이터를 잘못된 문자 집합으로 취급 할 때 발생할 수있는 가설적인 공격이 있습니다.
앞서 브라우저 디버그 도구에 대해 언급했습니다. 이러한 도구는 쿠키 데이터를 조작하는데도 사용할 수 있습니다. 쿠키는 신뢰할 수없는 사용자 입력으로 처리되어야합니다.
데이터 유효성 검사 및 이스케이프는 웹 응용 프로그램 보안의 한 측면 일뿐입니다. 웹 응용 프로그램의 공격 방법론을 알고 있어야 방어 할 수 있습니다.
-
==============================
2.
SQL 주입을 방지하는 가장 효과적인 위생 처리는 PDO를 사용한 매개 변수화입니다. 매개 변수가있는 쿼리를 사용하면 쿼리가 데이터와 분리되므로 1 차 SQL 주입의 위협이 제거됩니다.
HTML 제거와 관련하여 strip_tags는 아마도 모든 것을 제거하기 때문에 HTML을 제거하는 가장 좋은 방법 일 것입니다. htmlentities는 그것이 들리는 것을한다. 그래서 그것은 또한 작동한다. 허용 할 HTML을 구문 분석해야하는 경우 (즉, 일부 태그를 허용하려는 경우) HTML Purifier와 같은 성숙한 기존 파서를 사용해야합니다
-
==============================
3.
데이터베이스 입력 - SQL 삽입을 방지하는 방법
데이터베이스에 삽입하거나 업데이트하기 전에 사용자 입력을 피할 필요가 있습니다. 그것을하기위한 오래된 방법이 있습니다. 이제 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); }
-
==============================
4.
내 5 센트.
mysql_real_escape_string이 작동하는 방식을 여기에서 이해하는 사람은 아무도 없습니다. 이 함수는 아무것도 필터링하지 않거나 "위생"하지 않습니다. 따라서이 기능을 주사에서 당신을 구할 수있는 보편적 인 필터로 사용할 수 없습니다. 사용법과 적용 가능한 위치를 이해할 때에 만 사용할 수 있습니다.
나는 이미 쓴 비슷한 질문에 대한 대답을 가지고있다. PHP에서 데이터베이스에 문자열을 제출할 때 htmlspecialchars ()를 사용하여 불법 문자를 처리하거나 정규 표현식을 사용해야합니까? 데이터베이스 측면 안전에 대한 자세한 설명을 보려면 클릭하십시오.
htmlentities에 관해서는 - Charles는 당신에게이 기능들을 분리하라고 말하고 있습니다. HTML을 게시 할 수있는 관리자가 생성 한 데이터를 삽입한다고 가정 해보십시오. 당신의 기능은 그것을 망칠 것입니다.
나는 htmlentities에 대해 조언을 줄 것이지만. 이 함수는 오래 전에 폐기되었습니다. HTML 안전을 위해 <,> 및 "문자 만 바꾸려면 htmlspecialchars () 메서드를 사용하여 의도적으로 개발 된 함수를 사용하십시오.
-
==============================
5.
데이터베이스 삽입을 위해 필요한 것은 mysql_real_escape_string (또는 매개 변수화 된 쿼리 사용)뿐입니다. 일반적으로 htmlentities를 사용하면 데이터를 저장하기 전에 데이터를 변경하고 싶지 않습니다. 그것은 나중에 htmlentities를 통해 웹 페이지의 어딘가에 그것을 표시하기 위해 그것을 실행했을 때 나중에 깨진 엉망으로 이어질 것입니다.
어딘가에 웹 페이지에 데이터를 표시 할 때 htmlentities를 사용하십시오.
다소 관련이 있는데, 예를 들어 연락처 양식과 같이 이메일에 제출 된 데이터를 보내는 경우 머리글에 사용할 데이터 (예 : 보낸 사람 : 이름 및 전자 메일 주소, 하위 등)에서 줄 바꿈을 제거해야합니다. )
$input = preg_replace('/\s+/', ' ', $input);
이렇게하지 않으면 스팸 봇이 양식을 찾아서 악용하기 전에 시간 문제 일뿐입니다. 어려운 방법을 배웠습니다.
-
==============================
6.
1) 네이티브 PHP 필터를 사용하여 다음 결과를 얻었습니다.
(소스 스크립트 : https://RunForgithub.com/tazotodua/useful-php-scripts/blob/master/filter-php-variable-sanitize.php)
-
==============================
7.
사용하는 데이터의 종류에 따라 다릅니다. 가장 일반적으로 사용되는 것은 mysqli_real_escape_string이지만, 예를 들어 HTML 컨텐트가 없다는 것을 알면 strip_tags를 사용하면 추가 보안이 추가됩니다.
허용해서는 안되는 문자를 삭제할 수도 있습니다.
-
==============================
8.
GUMP와 같은 작은 유효성 검사 패키지를 사용하는 것이 좋습니다. https://github.com/Wixel/GUMP
이런 기본적인 라이브러리를 구축하고 위생을 잊기가 거의 불가능합니다. "mysql_real_escape_string"은 좋은 필터링을위한 최선의 대안은 아닙니다 ( "Your Common Sense"와 같이 설명 됨). 한번만 사용하는 것을 잊어 버리면 전체 시스템이 주사 및 기타 불쾌한 공격을 통해 공격받을 수 있습니다.
-
==============================
9.
다음과 비슷한 코드에서 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 내용으로 문자열을 출력 할 때 엔티티의 일부 문자를 변환하는 데 사용됩니다.
from https://stackoverflow.com/questions/3126072/what-are-the-best-php-input-sanitizing-functions by cc-by-sa and MIT lisence