作为一个开发者,Turst是不能存在的。来自于用户浏览器的请求?上游或终端系统?服务器与浏览器之间的信道?系统本身依赖的服务或者数据存储?
拒绝未知的表单输入
HTML的表单应该是确保安全的,表单的构建者需要限制输入类型、做数据校验,这样整个表单输入才是安全的。客户端地JavaScript脚本需要从安全地角度来说提供完整的校验。
Mock的HTTP
所有的HTTP请求都可以进行模拟,不管是什么请求,因此一个不合理的请求可以绕过校验。那么服务器端务必要进行数据校验。
sql注入
直接的sql的语法应当使用参数绑定来解决这个问题
void addStudent(String name) {
String sql = "select * from users where name=" + name;
getConnection().createStatement().execute(query);
}
void addStudent(String name) {
PreparedStatement stmt = getConnection().prepareStatement("select * from users where name=?");
stmt.setString(1, name);
stmt.execute();
}
``
所以,当用户输入 `'' or '1'='1'` 时,这个语句的功能就是搜索 users 全表的记录。
select * from users where name=’’ or ‘1’=’1’; ```
一般来说,一个功能比较全面地数据访问层都会提供这种参数绑定的功能,开发者在开发的时候就要注意将所有的不受信任的输入通过参数绑定生成SQL语句。使用绑定的参数不仅能使应用系统免于注入攻击,还能通过在代码与内容之间构建清晰的边界来增加整个代码的可读性,并且与手动拼接相比还能大大简化构造可用的SQL的过程。当你用参数绑定来代替原本的格式化字符串或者字符串拼接来构造SQL的时候,你会发现还能用全局的绑定方程来完成这一工作,这又会大大增加整个代码的整洁度与安全性。
传输过程的考虑
在使用原始的HTTP连接的时候,因为服务器与用户之间是直接进行的明文传输,导致了用户面临着很多的风险与威胁。攻击者可以用中间人攻击来轻易的截获或者篡改传输的数据。攻击者想要做些什么并没有任何的限制,包括窃取用户的Session信息、注入有害的代码等,乃至于修改用户传送至服务器的数据。可以使用HTTPS来保证传输的安全性。
密码的暴力破解
密码长一点
信息泄露
由于 Web 服务器或应用程序没有正确处理一些特殊请求,泄露 Web 服务器的一些敏感信息,如用户名、密码、源代码、服务器信息、配置信息等。
所以一般需注意:
- 应用程序报错时,不对外产生调试信息
- 过滤用户提交的数据与特殊字符
- 保证源代码、服务器配置的安全
目录遍历漏洞
攻击者向 Web 服务器发送请求,通过在 URL 中或在有特殊意义的目录中附加 ../、或者附加 ../ 的一些变形(如 ..\ 或 ..// 甚至其编码),导致攻击者能够访问未授权的目录,以及在 Web 服务器的根目录以外执行命令。
文件上传漏洞
如果对文件上传路径变量过滤不严,并且对用户上传的文件后缀以及文件类型限制不严,攻击者可通过 Web 访问的目录上传任意文件,包括网站后门文件(webshell),进而远程控制网站服务器。
所以一般需注意:
- 在开发网站及应用程序过程中,需严格限制和校验上传的文件,禁止上传恶意代码的文件
- 限制相关目录的执行权限,防范 webshell 攻击