Web XSS攻击分类
Web XSS攻击分类
引言
XSS跨站脚本是最常见的Web漏洞,黑客注入JS代码,在用户浏览器执行,盗取cookie、劫持页面。建站开发必须了解XSS三种类型,针对性做好防护。
XSS三大类型
- 存储型XSS:代码存入数据库,所有访问页面的用户都会触发,危害最大。例如评论区没有过滤,提交恶意js存入数据库。
- 反射型XSS:恶意代码放在URL参数,用户点击链接,页面直接输出参数触发,不会存入数据库。
- DOM型XSS:前端JS直接读取URL参数修改DOM,不经过后端服务,后端日志看不到攻击载荷。
基础防护方案
- 后端输出页面使用htmlspecialchars转义;
- 前端渲染数据不要直接innerHtml,优先textContent;
- 设置Cookie HttpOnly,防止JS读取cookie;
- 配置CSP内容安全策略。
简单示例漏洞代码
<?php
//危险代码,直接输出参数,存在反射XSS
echo $_GET['name'];
//安全写法
echo htmlspecialchars($_GET['name'],ENT_QUOTES);
?>
总结
XSS核心成因:把外部可控数据当成页面代码执行。存储型风险最高,DOM型容易被忽略。前后端配合做输出转义、CSP、HttpOnly Cookie,多层防护抵御XSS。
PHP请求参数过滤
PHP请求参数过滤
引言
Web接口接收GET、POST参数,如果不做过滤校验,容易出现SQL注入、XSS、业务逻辑漏洞。PHP开发接口时,参数过滤是安全第一道防线,所有外部输入都不可信。
基础过滤思路
- 类型强制转换:数字参数直接转为int;
- 长度限制,防止传入超大字符串;
- 正则匹配手机号、邮箱等固定格式;
- 输出到页面时做html转义,防止XSS;
- 入库前转义或者使用PDO预编译防止注入。
代码示例
<?php
// 获取GET参数
$id = isset($_GET['id']) ? intval($_GET['id']) : 0;
$name = trim($_GET['name'] ?? '');
// 长度校验
if(mb_strlen($name)>50){
exit("参数过长");
}
// 输出到页面,防XSS
echo htmlspecialchars($name,ENT_QUOTES);
框架层面最佳实践
TP6、Laravel等框架自带验证器,推荐优先使用框架验证,不用手写大量if判断。
// ThinkPHP6验证示例
$validate = new \think\Validate([
'id'=>'require|integer',
'name'=>'require|max:50'
]);
避坑点
不要简单依靠addslashes防御注入,推荐PDO预处理语句;参数过滤不要只在前端校验,后端必须二次校验,前端校验可被绕过。
总结
任何外部传入的数据都要校验,区分类型校验、长度校验、格式校验、输出转义四层防护,降低Web安全漏洞风险,是PHP项目开发的基础规范。
PHP 安全最佳实践
PHP 开发必须注意的安全问题
PHP 开发最容易出安全问题,几个常见坑一定要避开。
1. SQL 注入
最常见的安全漏洞。用户输入拼接到 SQL 里,被注入恶意 SQL。
解决方案:用预处理语句
// 不要这样
$sql = "SELECT * FROM users WHERE id = " . $_GET['id'];
// 要这样
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");
$stmt->execute([$_GET['id']]);
2. XSS 跨站脚本
用户输入直接输出到页面,被注入恶意 JS。
解决方案:输出时转义
echo htmlspecialchars($user_input);
3. CSRF 跨站请求伪造
别人伪造你的请求操作。
解决方案:加 Token 验证
// 表单里加 Token
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['token']; ?>">
// 后端验证
if ($_POST['csrf_token'] !== $_SESSION['token']) {
die('CSRF 攻击');
}
4. 文件上传漏洞
用户上传 PHP 文件,直接拿到 webshell。
解决方案:
- 限制文件类型
- 重命名文件
- 上传目录不执行 PHP
5. 密码明文存储
数据库被拖库,密码全泄露。
解决方案:用 password_hash
$hash = password_hash($password, PASSWORD_DEFAULT);
// 验证
password_verify($password, $hash);
6. 错误信息泄露
生产环境把报错直接展示给用户,暴露路径和代码。
解决方案:关闭 display_errors
display_errors = Off
log_errors = On
总结
PHP 安全的核心:用户输入都不可信,所有输出都要转义,数据库操作用预处理。安全开发意识比工具更重要。