문제

나는 PHP 응용 프로그램 보안에 대한 독서를 해왔고, 그것은 나에게 mysqli_real_escape_string MySQL 테이블에 데이터를 삽입 할 때 사용하기에 올바른 기능입니다. addslashes 스마트 공격자에게는 이상한 일이 발생할 수 있습니다. 오른쪽?

그러나 나를 혼란스럽게하는 것이 하나 있습니다. 나는 조언을 기억하는 것 같습니다 addslashes ~보다 낫다 htmlentities 사용자가 사용자에게 입력하여 데이터를 보호하기 위해 사용자에게 다시 반영 할 때 addslashes 취약성이있는 사람입니다. 이것이 사실입니까, 아니면 내가 잘못 기억하고 있습니까?

도움이 되었습니까?

해결책

데이터에는 다른 컨텍스트가 있습니다. 데이터베이스에 데이터를 삽입하는 컨텍스트는 HTML/XML을 렌더링하는 컨텍스트 또는 전자 메일 메시지와 다르게 탈출해야합니다.

DB로 들어가는 데이터를 탈출하는 것은 준비된 진술을지지하여 모든 새 코드에서 더 이상 사용되지 않아야합니다. 다른 말을하는 사람은 당신에게 큰 장애를 겪고 있습니다.

브라우저로 이동하는 데이터 탈출은 대상에 따라 여러 가지 방법으로 탈출해야합니다. 때로는 htmlspecialchars로 충분하며 때로는 htmlentities를 사용해야합니다. 때로는 숫자 엔티티가 필요합니다. 모든 뉘앙스를 알기 위해 연구해야 할 주제입니다.

내가 살고있는 일반적인 규칙은 입력 및 탈출 출력 (컨텍스트에 따라) 입력 및 탈출 출력을 확인하는 것입니다 (필터가 아님)입니다.

다른 팁

그것들은 다른 목적을위한 다른 도구입니다.

MySQLI_REAL_ESCAPE_STRING은 MySQL에 삽입 할 수있는 데이터를 안전하게 만듭니다 (그러나 매개 변수화 된 쿼리는 더 좋습니다).

htmlentities는 HTML 문서로 출력하기위한 데이터를 안전하게 만듭니다.

AddSlashes는 몇 가지 다른 상황에 따라 데이터를 안전하게 만들지 만 MySQL에는 충분하지 않습니다.

당신은 또한 사용할 수 있습니다 pdo libs 서버에서 PHP5를 사용할 수있는 경우 대부분의 탈출을 수행합니다.

다시 반향에 따라 나는 개인적으로 htmlspecialchars를 선호하지만, 나를 바로 잡을 수 있습니다.

예, MySQLI_REAL_ESCAPE_STRING 또는 모든 사용자 입력에서 PDO와 같은 라이브러리를 사용하십시오. 다시 반향 할 때, 나는 ent_quotes와 함께 htmlentities를 두 번째 매개 변수로 사용합니다. 이는 인용문을 포함하여 모든 적용 가능한 문자를 HTML 엔티티로 빠져냅니다.

참고 : UTF-8 인코딩 된 문서에서 htmlentities ()를 사용하면 피해야합니다. 보다:

주의를 기울이십시오 (인용 phpwact.org):

UTF-8에 대한 최신 웹 브라우저와 UTF-8에 대한 넓은 지원을 제공하면 이러한 모든 문자가 UTF-8에 직접 표시 될 수 있으므로 htmlentities가 필요하지 않습니다. 더 중요한 것은 일반적으로 브라우저 만 HTML의 특수 문자를 지원하는 것입니다. 예를 들어 일반 텍스트 편집기는 HTML 엔티티를 알지 못하는 것입니다. 당신이하고있는 일에 따라, htmlentities를 사용하면 다른 시스템이 콘텐츠를 "소비"하는 능력을 줄일 수 있습니다.

또한 (확인되지는 않았지만 합리적으로 들립니다 - 여기에 댓글에서) 문서가 application/xml+xhtml (정의하지 않는 한)으로 제공되는 경우 캐릭터 엔티티 (»또는 -)가 작동하지 않습니다. 그래도 숫자 형태로 도망 갈 수 있습니다.

PHP 5.2 이상의 또 다른 흥미로운 솔루션은 필터 확장을 사용하는 것입니다. http://www.php.net/manual/en/book.filter.php

이를 통해 사용자 입력을 검증하고 소독 할 수 있습니다. 사용 가능한 많은 내장 필터가 있으며 플래그와 결합하여 동작을 조정할 수 있습니다. 또한 HESE 필터를 사용하여 INT, 플로트, 이메일, 특정 정규 표현식을 검증/소독 할 수도 있습니다.

나는 개인적으로 프로젝트에서 양식을 검증하고 사용자가 제공 한 데이터를 출력하기 위해 프로젝트에서 사용하기 시작했으며 매우 기뻤습니다. MySQL 데이터베이스에 값을 삽입하면 추가 보안을 위해 준비된 쿼리를 사용합니다. 이러한 솔루션은 대부분의 SQL 주입 및 XSS 유형 공격을 피할 수 있습니다.

하나의 "탈출"기능을 가질 수 없으며 항상 작동하기를 기대합니다. 특정 위생 루틴이 필요한 다른 공격이 있습니다. 이 개념을 이해하는 유일한 방법은 취약한 코드를 작성한 다음 이용하는 것입니다. 악용 코드 작성은 모든 보안 시스템에 대한 이해에 필수적입니다.

예를 들어이 쿼리는 SQL 주입에 취약합니다.

$host=htmlspecialchars($_GET[host],ENT_QUOTES);
$name=htmlspecialchars($_GET[name],ENT_QUOTES);
mysql_query("select * from user where Host='$host' and Name='$name' ");

악용하다:http : //localhost/sqli_test.php? host =& name =%20sleep (20)-%201

MySQL의 가장 좋은 탈출 기능은 mysqli_real_escape_string ()이지만 실패 할 수 있습니다.

mysql_query("select * from user where id=".mysqli_real_escape_string($_GET[id]));

악용하다:http : //localhost/sqli_test.php? id = 1%20or%20sleep (20)

실제로 SQL 주입을 관리하는 가장 좋은 방법은 Escape 함수를 호출하는 것이 아닙니다. SQL 주입에 ADODB의 매개 변수화 된 quires를 사용합니다. xss에는 htmlspecialcahrs ($ var, ent_qutoes)를 사용하십시오. 읽기 OWASP TOP 10 웹 애플리케이션 보안에 잘못 될 수있는 것보다 훨씬 더 많기 때문입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top