新手站长必看:网站渗透测试基础防护技巧
新手站长必看:网站渗透测试基础防护技巧
最近经常有读者问我:“网站刚上线,就被提示存在安全漏洞,该怎么修?
”其实网站渗透测试基础防护技巧并不复杂,只要掌握几个核心方向,普通站长也能自己动手加固。
今天我就从准备条件开始,手把手带你走一遍防护流程。
动手前需要准备什么
在开始操作前,请确保满足以下条件:
- 服务器具备管理员权限(SSH登录或宝塔面板等面板权限)
- 能修改网站根目录下的配置文件(如Nginx的
nginx.conf、PHP的php.ini、Apache的.htaccess) - 准备一个文本编辑器(如Notepad++、VS Code)用于修改代码
- 如果使用宝塔面板,请提前开启“防火墙”和“安全”插件(免费版即可)
第一道防线:堵住SQL注入漏洞
SQL注入是最常见的攻击方式之一。
攻击者在用户输入中嵌入恶意SQL代码,窃取数据库数据。
最简单的防护方法就是对用户输入进行严格过滤。
修改配置文件
如果你使用PHP开发,打开php.ini(一般在/etc/php/版本号/fpm/php.ini),确保以下选项开启:
; 开启魔术引号(PHP 5.4 之前有效,较新版本请使用预处理语句)
magic_quotes_gpc = Off ; 建议设为Off,用代码层过滤
; 禁用危险的PHP函数
disable_functions = exec,system,passthru,shell_exec,popen,proc_open
代码层防御(以PHP为例)
在接收用户输入的位置(如$_GET['id']),使用强制类型转换或参数化查询:
// 强制转换为整数
$id = (int)$_GET['id'];
// 使用PDO预处理
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");
$stmt->execute([':id' => $id]);
如果你使用WordPress、ThinkPHP等框架,它们已经内置了参数绑定,只需确保使用官方提供的查询方法即可。
第二道防线:过滤XSS跨站脚本
XSS攻击让攻击者在网页中插入恶意JS代码。
最简单有效的措施是对输出内容进行HTML实体转义。
通用过滤函数(PHP)
function safe_output($data) {
return htmlspecialchars($data, ENT_QUOTES, 'UTF-8');
}
// 输出时调用
echo safe_output($user_input);
使用安全HTTP头
在Nginx配置中添加响应头,防止脚本注入:
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval';";
宝塔面板操作路径:网站 -> 设置 -> 配置文件,在server块中粘贴上述指令。
保存后重载Nginx。
第三道防线:拦截恶意文件上传
文件上传漏洞通常是因为未验证文件类型。
以PHP为例,禁止上传php、phtml等可执行脚本:
修改php.ini
; 只允许特定扩展名(需要在代码层面配合)
upload_max_filesize = 10M
; 关闭危险的函数
disable_functions = move_uploaded_file ; 如果不需要上传功能,直接禁用;需要则保留并在代码中验证
Nginx规则拦截
在网站配置文件(宝塔面板:网站 -> 设置 -> 配置文件)中添加:
location ~* \.(php|php5|phtml)$ {
deny all; # 禁止直接访问上传目录下的PHP文件
}
location /uploads {
location ~ \.(jpg|jpeg|png|gif|pdf|zip)$ { # 只允许安全扩展名
try_files $uri =404;
}
location ~ \.php$ { deny all; }
}
第四道防线:检查并加固弱口令
渗透测试中80%的漏洞源于弱口令。
请立即修改密码:
- SSH密码:长度不少于12位,包含大小写字母+数字+特殊符号
- 数据库密码:不要使用admin、123456等常见组合
- 后台管理员密码:定期更换,不要和邮箱、社交账号相同
宝塔面板操作路径:服务器 -> SSH管理 -> 修改密码;
数据库 -> root密码修改。
常用安全工具快速验证效果
执行完上述步骤后,可以用以下方式验证防护效果:
- 简单SQL注入测试:在浏览器地址栏输入
http://你的域名/?id=1' OR '1'='1,如果页面正常显示(而不是报错或显示所有数据),说明你代码里的过滤生效了。 - XSS测试:在搜索框输入
,如果弹窗不出现,说明输出转义生效。 - 文件上传测试:尝试上传一个
test.php文件,如果提示“不允许上传此类型文件”或被拦截,则防护成功。 - 使用在线安全检测工具:如阿里云云安全中心、腾讯云安全体检、或免费的“Quttera Website Scanner”,扫描全站查看报告。
高频问题与避坑提醒
Q:我改完配置后网站打不开了?
A:先检查配置有没有语法错误:执行 nginx -t(Nginx)或 apachectl configtest(Apache)。宝塔用户可在面板中点击“保存”并验证,如果报错会有提示。最常见的是花括号漏掉或引号不匹配。
Q:加了安全头后,网站部分JS功能失效了?
A:这是因为CSP策略太严格。可以将script-src中的'unsafe-inline'改为具体域名(如'self' cdn.example.com),或者使用nonce属性。新手建议先放开'unsafe-inline',等熟悉后再收紧。
Q:我用了编辑器,为什么还有漏洞?
A:很多富文本编辑器允许上传SVG文件,而SVG可以包含脚本。建议在服务器端二次验证文件内容,并关闭SVG上传(除非业务必需)。
写在最后
以上网站渗透测试基础防护技巧虽然基础,但能挡住绝大多数自动扫描攻击。
实际生产环境还需要结合WAF(Web应用防火墙)和定期安全审计。
如果你正在加固自己的网站,建议先按本文步骤完整执行一次,再根据自身业务做微调。
遇到异常异常时优先回看“避坑提醒”,一般都能快速解决。
记住:安全不是一次性工作,而是一种习惯。
每次更新代码或插件后,都顺手检查一下关键配置,就能让网站始终保持在相对安全的状态。