ถ้าผมรับ ค่ามา อย่างเช่น
$test=$_GET['test'];
ผมควรจะกรองด้วยอะไรบ้างครับ
$test=htmlspecialchars($_GET['test']);
$test=strip_tags($_GET['test']);
ประมาณนี้จะพอมั้ยครับ หรือควรเพิ่มเติมอะไรอีก
อันนี้ผมออกตัวก่อนนะว่าผมไม่ได้เชี่ยวชาญด้านนนี้ เรื่องการเช็คและกรอง user input เนี่ย เท่าที่ผมรู้มันกัน sql injection แล้วก็ cross site scripting (XSS) หรือ cross site fourgery พวกนี้
อย่างแปรกคือ sql injection คือมันอาจมีการใส่ค่าที่ปลอมแปลงเข้ามาใน input ทำให้เวลาที่ประกอบเป็น SQL Query ขึ้นมามันอาจทำให้เกิดอาการผิดเพี้ยนของข้อมูลที่จะ return กลับมา บางทีอาจจะผ่านการเช็ค condition หรือบางทีอาจกลายเป็ฯแสดงข้อมูลสำคัญเลย เราเลยต้องการทำการ valdate และ escape input ทุกตัวที่ต้องใช้ใน sql
อย่างที่ถามมาว่าควรกรองอะไรบ้าง กรณีที่เรากรอง sql injection เราต้องเช็คก่อนว่าตัวแปรที่เราจะใส่ลงใน query ตองเป็นข้อมูลชนิดไหน เช่นเป็นตัวเลข ก็ต้องเป็นตัวเลขจริงๆ ไม่ใช่มีข้อความปะปนมา (ซึ่งมันอาจจะมาจากการ injection ก็ได้) เช่น
$id = (int) $_GET['id']; // อันนี้เพื่อบังคับว่าต้องรับค่าเข้ามาเป็น integer เท่านั้น
$sql = "SELECT * FROM dbname WHERE id='{$id}'";
แบบนี้เราจะมั่นใจได้เลยว่า จะไม่มีการผิดเพี้ยนแน่นอน
ถ้าเป็นพวกชนิดข้อความจะยากหน่อย ถ้าข้อความมีรูปแบบแน่นอนก็ใช้ regex ในการตรวจสอบก่อน แล้วค่อย mysql_real_escape_string() อีกที น่าจะพอกันได้เบื้องต้น (แต่คิดว่าอาจจะไม่หมด)
ส่วนไอ้ที่ให้ htmlspecialchars หรือ strip_tags เพื่อป้องกัน XSS พวกขโมยข้อมูลจาก browser ส่วนใหญ่มันจะมากับ html หรือ javascript วิธีกันที่ง่ายที่สุดเลยคือ strip_tags() คือไม่รับ html ใดใดทั้งนั้น หืออาจจำเป้นต้องรับจริงๆ ให้ใช้ allowed tag ใส่ไปใน strip_tags($html,'<a><b><u><i>'); คือเอาแค่แท็กที่ไม่อันตราย อาจจะต้องทำการกรองเพิ่มอีกที อย่างแท็ก a อาจจะมี javascript แฝงมาใน href="javascript:..." เราต้องใช้ regex เพื่อเช็คอีกทีว่ามันใช่มั้ย ถ้าใช่คือลบออกไปเลย
เรื่อง XSS นี่ผมบอกได้ไม่หมดเพราะผมเองก็ไม่รู้เหมือนกันว่ามันแทรกซึมเข้าได้ทางแท็กไหนบ้าง ลองศึกษาแล้วหาวิธีป้องกันดู
สรุป จะกรองอะไรบ้าง คำตอบคือ แล้วแต่การนำตัวแปรไปใช้งานคับ