安全开发应该注意哪些事?安全工程师说了6点【上】

前段时间,有一个客户给我们悬镜工作人员打电话,大概意思是:我们公司打算开发一个网站,但是我们前期想咨询一些关于网站开发安全相关的问题,网站开发需要注意哪些安全问题?网站开发从哪几个方面来关注安全开发?

我们会分【上】、【下】来介绍下从安全工程师的角度上,来谈谈安全开发方面的事儿。

以下内容来自:先知安全技术论坛,已获得先知技术论坛授权,如需转载,请联系该论坛。

原文链接地址:https://xianzhi.aliyun.com/forum/read/1752.html

很多技术研发不了解安全,也不重视安全,只有在自己的服务器被黑掉、被挂马、被脱裤才想起关注安全,但是这个时候,技术架构已经成型、代码已经在线上稳定运行,再亡羊补牢,改代码、改策略,往往成本巨大、而收效很低;所以,开发安全,从娃娃抓起……

一、什么是信息安全?

信息安全是一个庞大的概念,包含大量不同方向的分支技术,但是都涉及几个概念:

机密性(Confidentiality):即保证信息在产生、传输、存储、使用等环节不会被泄漏、被恶意窃取。

在技术上典型的实现方式就是加密算法。加密算法主要分对称加密和非对称加密,对称加密的加解密密钥是一样的,所以在密钥在存储、传输时会有一定泄漏的风险,但加解密效率会相对高一些。

非对称加密的密钥不同,各自不会互相影响,所以相对安全,但同样的,效率会低一些。

因此,也随之产生多种可变的方案,比如,使用对称加密算法,密钥通过非对称加密算法进行加密,可以在效率和安全性上取得一定的平衡。加解密是一门很深的学科,也是信息安全领域一个方向。

完整性(Integrity):即保证信息在产生、传输、存储、使用等环节是真实完整的,不会被恶意篡改。在技术上典型的应用有数字签名、MD5、校验和等。

其实在网络协议诞生的初期就已经存在完整性校验的概念,最典型的就是TCP/IP协议中各种报文的校验和。

而现在互联网产品,尤其是移动端APP产品很多也都采用签名的策略,通过将接口传参、时间戳等进行一次签名,来防止业务数据在传输的过程中被篡改。

可用性(Availability):即保证信息在产生、传输、存储、使用等环节不会被破坏损毁。在技术上典型的应用,安全方面当然就是防DDoS了,DDoS攻击成本低,效果好,无论大小企业,现在俨然已成为难题之一。DDoS又分很多种,防护起来十分复杂。

以上是信息安全的基本属性,即CIA属性。此外,后期还衍生出其他的属性,如可控性、不可否认性等,总之都是对信息安全概念的补充。

而安全人员的工作,尤其是做企业安全建设的工作,就是围绕保护数据安全的过程,在事前、事中、事后三个阶段,技术上建立扫描、发现、监控、防御、应急、加固等一系列措施,在管理上完善流程、制度、规范,从而使以上几个安全属性得到保障。

概念说了很多,落地到实际是什么样子呢,简单总结了一个安全架构图,比较全的涵盖了企业安全建设的要点。

以上是宏观层面,那具体到每个技术研发同学的身上,最常见的就是对各种安全漏洞、安全风险的处理修复。下面介绍开发过程中常见的安全风险点。

二、SQL注入

sql注入危害很大,也很常见,可以导致企业数据直接被泄漏出去。典型的sql注入漏洞是这样产生的:

void doPost(HttpServletRequest request,

HttpServletResponse response){

JdbcConnection conn = new JdbcConnection();

final String sql = "select * from product where

pname like '%” + request.getParameter("name") +

"%'";

conn.execqueryResultSet(sql); }

在sql中直接拼接了字符串,导致用户可以通过插入恶意代码来控制sql执行。比如这样:

select * from product where pname like '%name%';

如果name变量输入 qudian';drop database;// 就变成了

select * from product where name like '%qudian';drop database;//%';

那么怎么防御sql注入呢?最简单正确的方式就是预编译。 为什么用预编译,首先要了解sql注入的原理:

sql注入产生在数据库的编译阶段,拼接字符串时,sql和用户可控的数据部分拼接到一起,一次发送到数据库, 数据库编译时就会把sql指令和数据编译到一起,如果用户可控的数据部分有非法的命令,也会被数据库编译执行,这样就产生了sql注入。

而预编译的方式的简单原理是:

sql和用户可控的部分是分两次发给数据库的,第一次发sql指令,也就是上个例子的select * from product where pname like '%name%';,

数据库收到后先进行编译,第二次再发送数据qudian';drop database;//,此时数据库不会重新编译第一次收到的指令, 而是把指令和数据区分开,这样不论用户输入的是什么非法数据,数据库都会认为是数据部分,也就不会产生sql注入了。

上面的过程通过抓包可以看到。


预编译的一般简单写法:

// 正常查询

conn = createConnection();

String sql = "select name,password from manager

where name=? and password=?";

stat = conn.prepareStatement(sql);

stat.setString(1, name);

stat.setString(2, password);

stat.executeQuery(sql);

// 模糊查询

conn = createConnection();

String sql = "select * from table where url

like ?";

stat = con.prepareStatement(sql);

String data="data";

stat.setString(1, "%"+data+"%");

stat.executeQuery(sql);

今天先分享到这里,明天小编将继续给大家分享:跨站脚本攻击:XSS、跨站请求伪造CSRF、登录注册安全风险,以及在使用第三方系统时需要注意的一些安全因素。

目前悬镜安全实验室推广一款针对Linux服务器进行系统漏洞扫描产品-云鉴漏洞检测平台,只需在您的服务器中输入一个执行命令,即可自动检测系统漏洞,出具报告。操作简单,使用方便,提前帮您发现系统中潜在的漏洞。


点击“云鉴”,立刻体验。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章