Giả sử này sẽ được đưa vào nội dung HTML (như giữa <body>
và </body>
hoặc giữa <div>
và </div>
), bạn cần phải mã hóa 5 ký tự XML đặc biệt (&, <, >, ", '), và OWASP đề xuất bao gồm dấu gạch chéo (/) là tốt. Xây dựng PHP, htmlentities()
sẽ làm phần đầu tiên cho bạn, và một đơn giản str_replace()
có thể làm dấu gạch chéo:
function makeHTMLSafe($string) {
$string = htmlentities($string, ENT_QUOTES, 'UTF-8');
$string = str_replace('/', '/', $string);
return $string;
}
Nếu, tuy nhiên, bạn sẽ đặt giá trị bị nhiễm vào một thuộc tính HTML, chẳng hạn như mệnh đề href=
của <a
, thì bạn sẽ cần phải mã hóa một nhóm ký tự khác ([dấu cách]% * + , - /; < =>^và |) -và bạn phải kích đúp quote HTML thuộc tính:
function makeHTMLAttributeSafe($string) {
$scaryCharacters = array(32, 37, 42, 43, 44, 45, 47, 59, 60, 61, 62, 94, 124);
$translationTable = array();
foreach ($scaryCharacters as $num) {
$hex = str_pad(dechex($num), 2, '0', STR_PAD_LEFT);
$translationTable[chr($num)] = '&#x' . $hex . ';';
}
$string = strtr($string, $translationTable);
return $string;
}
Mối quan tâm cuối cùng là bất hợp pháp tự UTF-8-khi giao cho một số trình duyệt, một chuỗi vô hình thành UTF-8 byte có thể thoát ra khỏi một thực thể HTML. Để bảo vệ chống lại điều này, chỉ cần đảm bảo rằng tất cả các ký tự UTF-8 bạn nhận được có giá trị:
function assertValidUTF8($string) {
if (strlen($string) AND !preg_match('/^.{1}/us', $string)) {
die;
}
return $string;
}
Các u
sửa đổi trên mà biểu hiện thường xuyên làm cho nó một Unicode khớp regex. Bằng cách kết hợp một chararchter đơn lẻ, .
, chúng tôi chắc chắn rằng toàn bộ chuỗi là Unicode hợp lệ.
Vì đây là tất cả phụ thuộc vào ngữ cảnh, tốt nhất nên thực hiện bất kỳ mã hóa nào trong thời điểm mới nhất — ngay trước khi trình bày đầu ra cho người dùng. Việc thực hành này cũng giúp bạn dễ dàng xem bất kỳ địa điểm nào bạn đã bỏ lỡ.
OWASP cung cấp nhiều thông tin về số XSS prevention cheat sheet của chúng tôi.
Hãy chắc chắn và sử dụng các câu lệnh chuẩn bị để tránh việc tiêm SQL. http://php.net/manual/en/pdo.prepared-statements.php –