网络攻防学什么语言 最稳定安全的编程语言( 四 )


对进入数据库的特殊字符(’ 。” 。。< 。> 。& 。* 。; 等)进行转义处理 。或编码转换 。基本上所有的后端语言都有对字符串进行转义处理的方法 。比如 lodash 的 lodash._escapehtmlchar 库 。
所有的查询语句建议使用数据库提供的参数化查询接口 。参数化的语句使用参数而不是将用户输入变量嵌入到 SQL 语句中 。即不要直接拼接 SQL 语句 。例如 Node.js 中的 mysqljs 库的 query 方法中的 ? 占位参数 。
1mysql.query(`SELECT * FROM user WHERE username = ? AND psw = ?`, [username, psw]);在应用发布之前建议使用专业的 SQL 注入检测工具进行检测 。以及时修补被发现的 SQL 注入漏洞 。网上有很多这方面的开源工具 。例如 sqlmap、SQLninja 等 。
避免网站打印出 SQL 错误信息 。比如类型错误、字段不匹配等 。把代码里的 SQL 语句暴露出来 。以防止攻击者利用这些错误信息进行 SQL 注入 。
不要过于细化返回的错误信息 。如果目的是方便调试 。就去使用后端日志 。不要在接口上过多的暴露出错信息 。毕竟真正的用户不关心太多的技术细节 。只要话术合理就行 。
碰到要操作的数据库的代码 。一定要慎重 。小心使得万年船 。多找几个人多来几次 code review 。将问题都暴露出来 。而且要善于利用工具 。操作数据库相关的代码属于机密 。没事不要去各种论坛晒自家站点的 SQL 语句 。万一被人盯上了呢?
命令行注入命令行注入漏洞 。指的是攻击者能够通过 HTTP 请求直接侵入主机 。执行攻击者预设的 shell 命令 。听起来好像匪夷所思 。这往往是 Web 开发者最容易忽视但是却是最危险的一个漏洞之一 。看一个实例:
假如现在需要实现一个需求:用户提交一些内容到服务器 。然后在服务器执行一些系统命令去产出一个结果返回给用户 。接口的部分实现如下:
1 2 3 4 5// 以 Node.js 为例 。假如在接口中需要从 github 下载用户指定的 repo const exec = require('mz/child_process').exec; let params = {/* 用户输入的参数 */}; exec(`git clone ${params.repo} /some/path`);这段代码确实能够满足业务需求 。正常的用户也确实能从指定的 git repo 上下载到想要的代码 。可是和 SQL 注入一样 。这段代码在恶意攻击者眼中 。简直就是香饽饽 。
如果 params.repo 传入的是https://github.com/zoumiaojiang/zoumiaojiang.github.io.git 当然没问题了 。可是如果 params.repo 传入的是https://github.com/xx/xx.git && rm -rf /* && 恰好你的服务是用 root 权限起的就惨了 。
具体恶意攻击者能用命令行注入干什么也像 SQL 注入一样 。手法是千变万化的 。比如「反弹 shell 注入」等 。但原理都是一样的 。我们绝对有能力防止命令行注入发生 。防止命令行注入需要做到以下几件事情:
后端对前端提交内容需要完全选择不相信 。并且对其进行规则限制(比如正则表达式) 。
在调用系统命令前对所有传入参数进行命令行参数转义过滤 。
不要直接拼接命令语句 。借助一些工具做拼接、转义预处理 。例如 Node.js 的 shell-escape npm 包 。
还是前面的例子 。我们可以做到如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22const exec = require('mz/child_process').exec; // 借助 shell-escape npm 包解决参数转义过滤问题 const shellescape = require('shell-escape'); let params = {/* 用户输入的参数 */}; // 先过滤一下参数 。让参数符合预期 if (!/正确的表达式/.test(params.repo)) { return; } let cmd = shellescape([ 'git', 'clone', params.repo, '/some/path' ]); // cmd 的值: git clone 'https://github.com/xx/xx.git && rm -rf / &&' /some/path // 这样就不会被注入成功了 。exec(cmd);无论是在何种后端语言环境中 。凡是涉及到代码调用系统 shell 命令的时候都一定要谨慎 。
DDoS 攻击DDoS 又叫分布式拒绝服务 。全称 Distributed Denial of Service 。其原理就是利用大量的请求造成资源过载 。导致服务不可用 。这个攻击应该不能算是安全问题 。这应该算是一个另类的存在 。因为这种攻击根本就是耍流氓的存在 。「伤敌一千 。自损八百」的行为 。出于保护 Web app 不受攻击的攻防角度 。还是介绍一下 DDoS 攻击吧 。毕竟也是挺常见的 。
DDoS 攻击可以理解为:「你开了一家店 。隔壁家点看不惯 。就雇了一大堆黑社会人员进你店里干坐着 。也不消费 。其他客人也进不来 。导致你营业惨淡」 。为啥说 DDoS 是个「伤敌一千 。自损八百」的行为呢?毕竟隔壁店还是花了不少钱雇黑社会但是啥也没得到不是?DDoS 攻击的目的基本上就以下几个:

推荐阅读