72 个网络应用安全实操要点,全方位保护 Web 应用的安全( 二 )


38、创建安全的数据库查询语句,避免 SQL 注入漏洞
如果要避免 SQL 注入漏洞,那就记住绝不要自己用字符串拼接 SQL 查询语句 。采用一个对象关系映射框架(ORM)来实现,可以让开发更高效、应用更安全 。
如果想要构建更细粒度的查询,可以使用更底层一点的 ORM 。
如果不能使用 ORM,那就尝试预处理语句,但也要小心这类语句会比 ORM 更容易出现错误 。
警告:
ORM 框架也不是万能的,体现在两方面:一是,它对原生的 SQL 查询还是支持的,最好不要使用这类查询;二是,像其它任何软件一样,ORM 框架也会时不时被曝出漏洞 。所以,还是遵循我们一而再再而三强调的策略:对所有输入进行验证,采用网络应用程序防火墙(WAF),并保持软件包的更新,这样基本就可以放心了 。
39、谨慎使用操作系统的命令行,防止命令注入的相关漏洞
如果可以避免,最好不要执行操作系统命令 。如果不能避免,那最好遵循以下准则:
作为一种标记语言,XML 的危险性体现在它可以访问系统资源 。XSLT 的一些实现甚至支持嵌入代码 。因此,在处理时必须非常谨慎 。
URL 注入经常会在以下情况发生:
flavour = request.getParam("flavour");url = "https:/api.local/pizzas/" + flavour + "/";return get(url).json();
如果被设置为:
../admin/all-the-sensitive-things/
那么这个 API 请求将会变为,是不是很凶险?
解决方案依然是采用合适的 URL 构建库来为 URL 传参,从而能正确地对参数进行编码 。

72 个网络应用安全实操要点,全方位保护 Web 应用的安全

文章插图
42、采用合适的类构建路径,避免路径遍历漏洞
就像 URL 地址一样,如果攻击者设法在路径中的某个地方偷偷地插入 ../../../,文件路径可能最终指向意料之外的位置 。要避免这种情况,请创建一个类,采用这个类安全地构造路径,并验证最终路径是否在预期目录中 。避免在文件路径中使用不受信任的数据,或者更好的是,完全避免使用文件系统,直接采用云存储 。
43、谨慎采用文件系统,接收不受信任的内容
如果允许用户写入服务器的文件系统,可能会出现各种各样的问题 。改用云存储,或者在数据库中使用二进制 blob 。
如果您必须访问磁盘,则应遵循以下指导原则:
不要使用 eval 或等效函数 。找到一种其它的方法来实现代码执行 。否则,不受信任的数据将有可能进行函数调用,从而在有机会在服务器上执行恶意代码 。
45、合理采用序列化,避免反序列化漏洞
对不受信任的数据进行反序列化是很危险的,很容易导致远程代码执行 。
46、采用网络应用程序防火墙(WAF)
安装防火墙,会减少很多风险 。就是一个很好的开源选择 。
47、配置 Web 服务器,避免 HTTP攻击
HTTP,也称 HTTP 请求走私攻击,是指攻击者劫持随机用户向系统发出的 HTTP 请求 。这类攻击一般在以下情况下发生:
让目标应用隔离其他应用来运行 。这样,即使发生了攻击事件,攻击者也不会有权限去访问未经许可的文件、系统或网络资源 。因此,最好使用或一个云端环境来部署你的应用 。如果因为某种原因必须使用一台服务器,那么可以手动采用来约束应用 。
49、使用 /
即使通过容器来运行应用,也还是需要进一步采用或策略来进一步地对应用做出约束,从而减少容器漏洞引发的威胁 。
50、采用最少权限的服务账户
这种方法带来的好处是即使发生了被攻击事件,也能减少被攻击造成的损失 。再次重申,列出所有的情形是不可能的,这里仅列举一些例子帮助大家理解: