شرح صفوف ومحتوى الفقرة
لا يكفي استدعاء htmlspecialchars() على رابط أدخله المستخدم داخل <a href="...">؛ لأن الرابط الخبيث javascript:alert(1) لا يحتوي أصلاً على أي رموز خاصة في HTML!
- عندما ينقر المستخدم على رابط يبدأ بـ
javascript:...داخلhref، ينفذ المتصفح كود JavaScript فوراً. - حلل دائماً الروابط المدخلة عبر
parse_url($url, PHP_URL_SCHEME)واسمح فقط ببروتوكوليhttpوhttpsفي القائمة البيضاء. - تحقق كذلك من صحة بناء الرابط الكامل عبر
filter_var($url, FILTER_VALIDATE_URL)قبل عرضه.
تستخرج دالة safeUrl() بروتوكول الرابط، وترفض أي شيء غير http أو https بإرجاع "#"، ثم ترمّز الرابط الصالح.
PHP
<?php
function safeUrl(string $url): string {
$scheme = strtolower((string) parse_url($url, PHP_URL_SCHEME));
if (!in_array($scheme, ['http', 'https'], true)) {
return '#';
}
return htmlspecialchars($url, ENT_QUOTES, 'UTF-8');
}
echo "Attack : " . safeUrl("javascript:alert(1)") . "\n";
echo "Valid : " . safeUrl("https://closetag.com/php") . "\n";