安全意识是程序员最重要的基本功。写代码时,永远要假设所有用户输入都是恶意的。
攻击入口主要集中在:表单提交、文件上传、URL参数、第三方解析引擎等位置。
1、文件上传漏洞风险
攻击者上传动态脚本文件,例如 aspx、php、asp 等服务端可执行页面。
之后直接访问上传后的脚本地址,代码会在服务器上运行。
危害:篡改网站首页、植入广告、删除服务器文件、获取服务器权限。
开发要点:文件上传模块必须做校验,限制文件类型,禁止上传服务端脚本。
2、表单与输入点
表单提交处不可信任用户输入:
- 需要过滤危险HTML、JS脚本,防范XSS跨站脚本;
- SQL操作使用参数化查询,杜绝SQL注入;
- 第三方页面解析引擎,如果支持直接执行SQL,风险极高。
例如用户传入select username,直接查询拿到全部账号数据。
3、错误提示信息模糊处理
不好示例:
- “账号不存在”
- “密码错误”
推荐模糊提示:
“账号或者密码或者验证码输入不对”
如果分开提示,黑客可以暴力枚举,先探测哪些账号是系统真实存在的,再爆破密码。模糊错误提示增加攻击者猜测难度。
4、登录防护
- 增加输入错误锁定功能,密码多次输错后进行账号锁定,防止暴力破解;
- 修改后台管理默认登录地址,不要使用通用路径(如
/admin),减少被扫描器探测到的概率。
5、URL参数校验
对URL传递的参数做校验过滤,不能直接拿来拼接SQL、直接输出页面,防止传入恶意参数发起攻击。
总结
安全不是靠某一个单独功能,而是融入每一行代码。
所有来自浏览器的数据(表单、上传文件、url参数、cookie)全部都不可信,都要做校验、过滤、处理。
前面学习的SQL注入、XSS、CSRF、文件上传,根源大多都是程序员缺少安全意识,直接信任用户输入。
Previous: 钓鱼网站