2013-04-23 2 views
1

나는 이미 asked에 대해 살균 및 탈출에 관한 질문을했지만 나는 답변을 얻지 못했음을 알고 있습니다.사용자 입력 및 출력 이스케이프 처리

좋아, 여기 있습니다. 나는 PHP 스크립트를 가지고 있고 그것이 문제 것, MySQL 데이터베이스에서 사용자의 입력과 SELECTGET 경우 내가 htmlspecialchars, htmlentities 또는 strip_tags 및 중 하나를 사용하여 <> 탈출하지 않은 경우/보안 위험 수 따라서 데이터베이스에서 HTML 태그를 선택/검색 할 수 있습니까? 입력이 trim(), mysql_real_escape_stringaddcslashes (\ % _)을 사용하여 이미 삭제 되었기 때문에.

htmlspecialchars를 사용하는 문제는 사용자의 입력이 가능하도록되어 앰퍼샌드 (&), 탈출이다 (필자는 동일 htmlentities 간다 생각을?). strip_tags을 사용하면 "John"과 같이 PHP 스크립트가 John에게 결과를 선택하고 표시하게됩니다.

if(isset($_GET['query'])) { 
    if(strlen(trim($_GET['query'])) >= 3) { 
     $search = mysql_real_escape_string(addcslashes(trim($_GET['search']), '\%_')); 
     $sql = "SELECT name, age, address WHERE name LIKE '%".$search."%'"; 
     [...] 
    } 
} 

그리고 여기는 디스플레이 내 출력된다 : 여기

데이터베이스에서 선택하기 전에, 입력 살균 내 PHP 코드 인 "X 정합 Y 결과."

echo htmlspecialchars(strip_tags($_GET['search']), ENT_QUOTES, 'UTF-8')." matched y results."; 
+1

대상 환경에 대해 위생/이스케이프 처리를 수행해야합니다. html은 SQL에 영향을 줄 수 없으므로 DB에 이스케이프 처리하지 않아도 안전합니다. 사실, 브라우저 컨텍스트에서 검색하고 표시하려고 시도 할 때까지 이스케이프하지 않는 것이 좋습니다. 실제로 무언가를 검색하는 경우 이스케이프 처리하지 않아도되며 두 번 이스케이프 처리가 필요하지 않습니다.'& amp;' –

+0

알겠습니다. 고마워요. 그래서, 내가 옳은 것 같아, 그렇지? – AnonymousJ

+0

no. 당신은 더 이상 사용되지 않는 mysql _ *() 함수이다. mysqli 또는 PDO로 전환한다. addcslashes() 호출을 제거하십시오. 불필요하며 단순히 db의 데이터에 무의미한 탈출구를 추가합니다. mysql_real_escape_string은 쿼리에서 폼 데이터를 안전하게 사용하는 유일한 방법이다. –

답변

2

이 문제를 해결하는 좋은 방법은 MySQLi를 사용하는 것입니다. MySQLi는 기본적으로 백엔드에서 모든 것을 이스케이프 처리하고 SQL 인젝션에 대한 강력한 보호 기능을 제공합니다. GET 데이터를 이스케이프 처리하지 않으면 다른 입력을 이스케이프 처리하지 않는 것처럼 위험합니다.

+0

MySQLi 기능을 가르쳐 주셔서 감사합니다. 그것은 나에게 여러 번 제안되었으며, 나는 그것에 대해 빨리 읽을 것입니다. 하지만 MySQL에서 MySQLi로 (또는 PDO를 위해)가는 것은 밤새 성취 될 수있는 것이 아닙니다. 맞습니까? – AnonymousJ

+0

PDO에는 mysqli, 특히 placeholder라는 몇 가지 장점이 있습니다. 적응하기에 너무 많은 데이터베이스 코드가 없다면 "밤새"수행 할 수 있습니다. [Learning PDO] (http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/)는 약 30 분 밖에 걸리지 않습니다. – tadman

+0

얼마나 많은 코드 (및 MySQL 쿼리)가 있는지에 따라 다릅니다. 현재 MySQL 쿼리를 모두 MySQLi 형식으로 전환 할 수 있지만 그 외에는 오버 헤드가별로 없습니다. 내가 그것에 대해 아무것도 몰라 PDO 말할 수 없다 :) – jball037

1

여기에는 두 가지 문제가 있습니다. SQL 문

당신은 쿼리를 작성하고 때마다의

사용자 데이터, 당신은 어떤 임의의 사용자 데이터가에서 생을 마감 없다는 것을 확신해야합니다. 이러한 오류는 SQL injection bugs이라고하며 데이터를 올바르게 이스케이프하지 못하면 발생합니다. 일반적으로 문자열 연결을 사용하여 쿼리를 작성해서는 안됩니다. 가능하면 언제든지 placeholders을 사용하여 데이터가 올바르게 이스케이프 처리되었는지 확인하십시오. HTML 문서에서

사용자 데이터

는 사용자가 제출 한 콘텐츠가 포함 된 페이지를 렌더링하고, 사용자가 HTML 태그 또는 스크립팅 요소 임의을 소개 할 수 있도록 탈출해야합니다. 이것은 XSS issues을 피할 수 있으며 &<과 같은 문자가 잘못 해석되지 않음을 의미합니다. "x < y"의 사용자 데이터는 귀하의 페이지를 깨뜨리지 않습니다.

사용자 데이터를 렌더링하는 모든 컨텍스트에 대해 항상 이스케이프해야합니다. 스크립트 태그 내부 또는 URL과 같은 다른 것들이 있지만 가장 일반적인 두 가지 태그입니다.