사용자의 의견을 소독 / 필터링하는 가장 좋은 방법?
문제
현재이 프로세스를 사용하여 사용자가 입력 한 댓글을 소독/필터로 사용하고 있습니다.
이것은 슬래시를 벗기는 데 사용됩니다
if (get_magic_quotes_gpc()) {
function stripslashes_deep($value)
{
$value = is_array($value) ?
array_map('stripslashes_deep', $value) :
stripslashes($value);
return $value;
}
$_POST = array_map('stripslashes_deep', $_POST);
$_GET = array_map('stripslashes_deep', $_GET);
$_COOKIE = array_map('stripslashes_deep', $_COOKIE);
$_REQUEST = array_map('stripslashes_deep', $_REQUEST);
}
그런 다음 주석은이 기능을 통해 데이터를 소독합니다 ...
function my_strip_tags($str) {
$strs=explode('<',$str);
$res=$strs[0];
for($i=1;$i<count($strs);$i++)
{
if(!strpos($strs[$i],'>'))
$res = $res.'<'.$strs[$i];
else
$res = $res.'<'.$strs[$i];
}
return strip_tags($res);
}
이 후에는 준비 된 명령문을 사용하여 데이터베이스로 바로 들어갑니다 ..
function add_comment($comment,$type,$update_id,$user_id){
$query="INSERT INTO comment_updates (updateid,userid,comment) VALUES(?,?,?)";
if($stmt=$this->conn->prepare($query)) {
$stmt->bind_param('sss',$update_id,$user_id,$comment);
$stmt->execute();
if($this->conn->affected_rows==1){
$stmt->close();
return true;
}
}
}
나는 이것이 충분히 안전한지 또는 그들이 다른 더 나은 대안인지 알고 싶었습니다 ... 감사합니다
해결책
자신의 HTML 소독제를 쓰지 마십시오. XSS 구멍을 만들 것입니다.
자신의 글을 쓰려면 적어도 ha.ckers.org xss 스모크 테스트 그것에 대하여
그 테스트와 필터의 htmlpurifier 비교, 당신은 HTML 소독이 얼마나 복잡한 지, 그리고 왜 그것을 전문가에게 맡겨야하는지에 대한 좋은 아이디어를 얻을 수 있어야합니다.
다른 팁
데이터를 데이터베이스에 저장하는 것에 대해 생각할 때 가장 중요한 것은 데이터베이스를 탈출하는 것입니다. 사용 mysql_real_escape_string
, 또는 mysqli_real_escape_string
, 또는 PDO::quote
, 사용중인 DB에 따라 (또는 Oracle/Pg/...에 대한 기타 기능
또 다른 해결책은 준비된 진술을 사용하는 것입니다 ( mysqli::prepare
및/또는 PDO::prepare
- 오래된 사람들은 지원하지 않습니다 mysql_*
확장), 귀하의 장소에서 데이터를 탈출하는 것을 다룰 것입니다 ;-)
HTML 출력에 대해 생각할 때는 두 가지 솔루션이 있습니다.
- HTML을 수락하고와 같은 라이브러리를 사용하십시오 htmlpurifier 필터링/청소; 그것은 어떤 태그와 속성이 허용되는지 정확하게 지정할 수 있으며, 출력으로 깨끗하고 유효한 HTML을 제공합니다.
- Doinig처럼 HTML을 제거하려고 노력하십시오. 항상 잘 작동하는 것은 아닙니다 (특별한 경우를 잊어 버리면 어떻게됩니까?)
- HTML을 탈출하십시오
htmlentities
또는htmlspecialchars
: 반드시 멋져 보이지는 않지만 출력은 사용자의 입력처럼 보입니다.
나는 첫 번째 또는 마지막 솔루션과 함께 갈 것입니다. 당신은 더 "위험한"느낌이지만, 그것은 단지 느낌 일뿐입니다 ^^ (일반적인 아이디어는 "바퀴를 재창조하지 마십시오")
마법 따옴표 처리는 괜찮지 만 따옴표가있는 매개 변수를 만들면 키를 제거해야합니다. :)
스트립 태그는 실제 HTML 필터 라이브러리를 사용하는 것이 좋습니다. HTML과 관련된 비틀기와 회전이 너무 많아서 한 번만 만들고 잊어 버린 것을 믿어서는 안됩니다. 사람들은 HTML 필터를 만드는 데 시간을 보내므로 작업을 유리하게 사용하십시오.
"DB로 곧장"에 관해서는, 바운드 매개 변수에 있습니다. 확실히 좋습니다. 바인딩 매개 변수에 안전하게 넣을 수 있습니다. 인용문이있는 문자열에서 결과를 피하기를 바랍니다.
데이터베이스에 넣을 때 모든 문자를 탈출하십시오. 검색 및 표시시 <sometag>
따라서 코드로 취급되는 대신 표시됩니다.
PHP는 위생 기능이 거의 알려지지 않았지만 강력한 내장을 가지고 있습니다. 나는 그들을 사용하는 것이 좋습니다 :