XSS防御秘籍:从“漏洞制造者”到“安全守卫者”上集回顾在之前的章节中,我们解锁了XSS攻击的十八般武艺,从偷Cookie到盲狙管理员,从绕过安全措施到PHP函数的暗坑,成功从“脚本小子”进化为“漏洞收割机”。 XSS防御两大神器神器一:输入过滤——把恶意代码“扼杀在摇篮”核心原则 “只允许该进的,挡住不该进的!”
实战代码(PHP示例)[code]// 手机号过滤:只保留数字和+ $phone = preg_replace('/[^0-9+]/', '', $_POST['phone']); // 用户名过滤:只允许字母数字和下划线 $username = preg_replace('/[^\w]/', '', $_POST['username']); // 评论内容过滤:移除危险标签 $comment = strip_tags($_POST['comment'], '<p><a><strong>'); // 只允许保留部分安全标签 [/code]神器二:输出转义——让恶意代码“变成哑巴”核心原则 “输出到哪里,就按哪里的规矩转义!” 场景1:输出到HTML正文[code]// PHP推荐写法:默认转义双引号+单引号 echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8'); // 转义效果:<script> → <script> [/code]场景2:输出到JavaScript代码[code]// 先HTML转义,再JSON编码 $js_data = json_encode(htmlspecialchars($user_input, ENT_QUOTES)); echo "<script>var data = $js_data;</script>"; // 转义效果:</script> → \u003C/script\u003E [/code]场景3:输出到URL参数[code]// URL编码 $url = "https://example.com?param=" . urlencode($user_input); // 转义效果:空格 → %20,& → %26 [/code]案例分析:那些年我们踩过的坑案例一:a标签的href属性
漏洞示例代码[code]<a href="<?php echo $_GET['url']; ?>">点击领红包</a> [/code]
修复方案[code]// 只允许http/https协议 $url = $_GET['url']; if (!preg_match('/^https?:\/\//', $url)) { $url = '#'; // 非法链接直接屏蔽 } echo '<a href="' . htmlspecialchars($url, ENT_QUOTES) . '">点击领红包</a>'; [/code]案例二:动态生成JavaScript
漏洞示例代码[code]<script> var username = "<?php echo $_GET['name']; ?>"; </script> [/code]
修复方案[code]<script> var username = <?php echo json_encode(htmlspecialchars($_GET['name'], ENT_QUOTES)); ?>; </script> // 输出效果:var username = "\";alert('XSS');\/\/"; [/code]总结XSS防御的本质是一场“输入与输出的攻防战”。记住:“永远不要相信用户输入,永远谨慎处理输出!” 最后,送大家一句安全界的至理名言:“安全不是功能,而是习惯!” 无论是前端还是后端,只有将安全思维融入每一行代码,才能真正做到“防患于未然”。 结束——下机免责声明:本内容来源于网络,如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |