u0026 PHP & mySQL:정확히 htmlentities를 사용할 때?




u0026 decode php (4)

나는이 일을 끝내고 중요한 두 가지를 배웠습니다.

$ _POST / $ _ GET / $ _ REQUEST에서 값을 얻고 DB에 추가하려는 경우 mysql_real_escape_string 함수를 사용하여 값을 삭제하십시오. 그들을 htmlentities로 인코딩하지 마십시오.

htmlentities로 인코딩해서 데이터베이스에 저장하는 것이 어떨까요? 음, 여기에 목표가 있습니다. 가능한 한 데이터를 의미 있고 깨끗하게 만드는 것이 목표이며 Jeff 's Dog와 같은 htmlentities로 데이터를 인코딩하면 Jeff 's Dog가되어 데이터 컨텍스트가 의미를 잃게됩니다. 그리고 REST 서비스를 구현하기로 결정하고 DB에서 해당 문자열을 가져 와서 JSON에 넣으면 Jeff & quot; Dog & quot;와 같이 멋지게 나옵니다. 디코딩 할 다른 함수를 추가해야합니다.

"Jeff 's Dog"필드에서 "select * from table ="Jeff 's Dog "를 사용하여"Jeff 's Dog "를 검색하려고하면"Jeff 's Dog "가"Jeff 's Dog "와 일치하지 않으므로 찾을 수 없습니다. 나쁜?

영숫자 문자열 (CHAR 유형에서)을 웹 페이지로 출력하려면 htmlentities - ALWAYS!를 사용하십시오.

플랫폼 : PHP 및 mySQL

나의 실험 목적을 위해, 나는 내 자신의 웹 사이트에서 직접 XSS 주사를 사용하지 않았다. 양식 텍스트 입력이있는 상황을 고려하십시오. 이것은 텍스트 영역이므로 텍스트 및 모든 종류의 (영문) 문자를 입력 할 수 있습니다. 여기 내 관찰이 있습니다 :

에이). strip_tags 및 mysql_real_escape_string 만 적용하고 데이터베이스에 데이터를 삽입하기 직전에 입력에 htmlentities를 사용하지 않으면 쿼리가 중단 되고 비정상 종료로 인해 내 테이블 구조를 나타내는 오류가 발생합니다.

비). 데이터를 데이터베이스에 삽입하기 직전에 입력에 strip_tags, mysql_real_escape_string 및 htmlentities를 적용 하면 쿼리가 중단되지 않고 텍스트 영역의 데이터를 데이터베이스에 성공적으로 삽입 할 수 있습니다.

그래서 htmentities는 모든 비용으로 사용해야하지만 정확하게 사용해야하는지 확신 할 수 없다는 것을 이해합니다. 위의 사실을 염두에두고, 저는 알고 싶습니다 :

  1. 정확히 htmlentities를 사용해야 할 때? 데이터를 DB에 삽입하기 전에 사용해야하거나 DB에 데이터를 가져 와서 DB에서 데이터를 표시하려고 할 때 htmlentities를 적용해야합니까?

  2. 위의 B)에 설명 된 방법 (필자가 가장 분명하고 효율적인 솔루션이라고 생각하는 방법)을 따르면 DB에서 데이터를 표시하려고 할 때 htmlentities를 적용해야합니까? 그렇다면 왜? 그렇지 않다면 왜 안 되겠습니까? 나는이 게시물을 읽은 후에 정말 혼란 스럽기 때문에 이것을 묻습니다 : http://shiflett.org/blog/2005/dec/google-xss-example

  3. 다음으로 html_entity_decode 라는 PHP 함수가 하나 더 있습니다. htmlentities가 입력에 적용 되었기 때문에 DB에서 내 데이터를 표시 할 수 있습니까 (B 단계에 표시된 절차를 따른 후)? 어느 것이 좋습니다 : html_entity_decode 및 htmlentities 언제?

미리보기 페이지 :

여기에 특정 상황에 대한 세부 정보를 추가하는 것이 도움이 될 것이라고 생각했습니다. '미리보기'페이지가 있다고 가정하십시오. 이제 텍스트 영역의 입력을 제출하면 미리보기 페이지가 입력을 받아 HTML로 표시하고 숨겨진 입력이이 입력을 수집합니다. 미리보기 버튼의 제출 버튼을 누르면 숨겨진 입력의 데이터가 새 페이지로 POST되고 해당 페이지는 숨겨진 입력에 포함 된 데이터를 DB에 삽입합니다. 양식을 처음 제출할 때 htmlentities를 적용하지 않고 (strip_tags 및 mysql_real_escape_string 만 적용) 텍스트 영역에 악의적 인 입력이있는 경우 숨겨진 입력이 손상되고 숨겨진 입력의 마지막 몇 문자가 눈에 띄게 " /> on " /> 으로 표시됩니다. 이 점을 염두에 두어 미리보기 페이지에서 숨겨진 입력의 무결성을 유지하고 숨겨진 입력에서 데이터를 수집하여 손상시키지 않도록해야합니다. 나는 이것에 대해 간다?이 정보를 게시하는 것에 대한 사과.

미리 감사드립니다.


본질적으로, mysql_real_escape_string 을 SQL 삽입을 방지하기 위해 데이터베이스 삽입 전에 사용하고, htmlentities 등을 출력 시점에서 사용해야한다.

또한 모든 사용자 입력에 온 전성 검사 (sanity checking)를 적용하여 숫자 값이 실제로 숫자가되는 지 확인하십시오. 예를 들어 is_int , is_float 등과 같은 함수는이 시점에서 유용합니다. (이 함수들과 비슷한 함수들에 대한 더 자세한 정보는 PHP 매뉴얼의 변수 처리 함수 섹션을 참조하십시오.)


  1. (DB 나 $ _GET / $ _ POST와 상관없이) 값을 HTML로 출력하기 전에. htmlentities는 데이터베이스와 아무 관련이 없습니다.
  2. B는 잔인합니다. DB에 삽입하기 전에 mysql_real_escape_string을, HTML로 출력하기 전에 htmlentities를 사용해야한다. htmlentities 태그가 <br /> 등과 같이 화면에 표시되면 태그를 제거 할 필요가 없습니다.

이론적으로 당신은 DB에 삽입하기 전에 htmlentities를 할 수도 있지만 원본 텍스트가 필요할 경우 추가 데이터 처리가 더 어려워 질 수 있습니다.

3. See above

일반적인 경험 법칙은 다음과 같습니다.

마지막 순간에 변수를 이스케이프합니다.

변수를 데이터의 깨끗한 표현으로 나타낼 수 있습니다. 즉, "O'Brien"이라는 이름의 사람의 성을 저장하려고하는 경우 다음을 원하지 않는 것입니다.

O&#39;Brien
O\'Brien

.. 그의 이름이 아니기 때문에 앰퍼샌드 나 슬래시가 없습니다. 해당 변수를 가져 와서 특정 상황 (예 : SQL 쿼리에 삽입하거나 HTML 페이지로 인쇄)에 출력 할 때, 수정하면됩니다.

$name = "O'Brien";

$sql = "SELECT * FROM people "
     . "WHERE lastname = '" . mysql_real_escape_string($name) . "'";

$html = "<div>Last Name: " . htmlentities($name, ENT_QUOTES) . "</div>";

htmlentities 인코딩 된 문자열을 데이터베이스에 저장하고 싶지 않습니다. CSV 나 PDF 또는 HTML 이 아닌 것을 생성하고 싶다면 어떻게됩니까?

데이터를 깨끗하게 유지하고 특정 상황에 대해서만 벗어나십시오.





mysql