2010-11-23 4 views
0

나는 사용자가 MySQL DB에 저장 될 리뷰를 제출할 수있는 리뷰 사이트를 구축 중입니다. 리뷰는 내게 직접 내용을 검토 한 다음 내 사이트에 표시됩니다. 여기에서 (양식의 모든 항목이 함수에 전달됩니다) 데이터를 청소 내 사용자 정의 함수의 :내 양식의 보안 의견 제출/표시

function cleanDataForDB($data) { 
$data = trim(htmlentities(strip_tags($data))); 

if (get_magic_quotes_gpc()) 
    $data = stripslashes($data); 

$data = mysql_real_escape_string($data); 

return $data; 

}

들이 승인 한 후에 나는 리뷰를 표시하는 스크립트를 작성하지 않은 아직,하지만 난 그냥 MySQL의 테이블에서 html_entity_decode() 함수를 통해 모든 필드를 전달하고 내 페이지의 HTML에 쓰기 계획했다.

누구나이 계획에 명백한 보안 허점이 있습니까? 그것은 나에게 꽤 안전한 것처럼 보일 지 모르지만, 이것은 사용자가 제출 한 데이터를 허용하는 최초의 사이트이므로, 나는 스스로를 취약하게 만들지 않기를 바랍니다.

감사합니다.

+0

마술 따옴표 수정은 한 번 및 중앙 위치에서 수행해야합니다. 'if (get_magic_quotes_gpc()) {$ _POST = array_map ("stripslashes", $ _POST); $ _GET ...}' – mario

답변

1

데이터를 DB에 저장하기 전에 데이터 이스케이프 처리를 수행하고 HTML을 추출하여 이스케이프 처리해야합니다. 그렇게하면 미래에 사용자의 게시물에서 HTML을 처리 할 수 ​​있습니다. "oops, I mangled"를 찾지 않아도됩니다.

삽입을 위해 데이터를 이스케이프하는 가장 좋은 방법은 PDO를 사용하는 것입니다.

데이터를 표시하려면 htmlentities이면 충분합니다.

+0

'htmlspecialchars'가 더 나은 경우가 많지만, 유효한 charset 매개 변수가 효과적 일 수도 있습니다. – mario

+0

PDO에 익숙하지 않아서 php.net 매뉴얼이이 주제에 도움이되지 않습니다. 이것은 내가 이미 사용하고있는 사용자 정의 함수 외에도 사용해야하는 것이라고 말하고 있습니까? 필자는 PDO가 어떻게 든 더 강력한 보안을 제공한다고 가정합니다. – Chris

+0

@Chris : 이외에, 대신에. 위로 [준비된 진술]에 대한 읽기 (http://stackoverflow.com/search?q=%5Bphp%5D+prepared+statements) – mario

0

나는 Borealid에 동의하지만 preg_replace()를 사용하여 JavaScript 스크립팅을 완전히 제거하기를 원할 수도 있다고 덧붙이고 싶습니다.

+0

나는 이것을 할 수있는 몇 가지 정규 표현식을 찾았지만 (링크 참조), strip_tags() 이것을 불필요하게 만드시겠습니까? (btw, 덧글에 캐리지 리턴이 없으므로 코드를 작성하는 데 매우 실망 스럽습니다! :) 링크 : http://www.phpfreaks.com/forums/php-regex/removing-javascript-from-string/ – Chris