目录:

1、生成安全随机数

2、密码安全存储

3、文件上传

4、SQL注入

5、HMAC-SHA256

一、生成安全随机数

用于生成会话sessionid、防CSRF时的token、以及其他场景下的veritycode。

如下代码:生成安全随机数

package net.xdclass.demo;
import java.security.SecureRandom; /**
* 使用安全随机数生成器生成24byte的随机数
*/ public class OtherTest {
public static StringBuilder createToken(){
SecureRandom random = new SecureRandom();
byte bytes[] = new byte[24];
random.nextBytes(bytes);
StringBuilder token = new StringBuilder();
String hv;
for (int i=0;i<bytes.length;i++){
int j = bytes[i] & 0xFF;
hv = Integer.toHexString(j);
if (hv.length()==1){
hv = "0"+hv;
}
token.append(hv);
}
return token;
} public static void main(String[] args){
System.out.println(createToken());
System.out.println(createToken().length()); }
}

二、密码安全存储

  • 禁止使用MD5、SHA1不安全哈希算法
  • 可以使用SHA256+salt,salt随机生成,salt长度不低于8byte,每个用户的salt不一样,salt存数据库
  • 强烈建议使用PBKDF2秘钥推到函数,安全存储用户密码

如下代码:PBKDF2存储密码DEMO

package net.xdclass.demo;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.InvalidKeySpecException;
import java.sql.Array; /**
* 使用PBKDF2生成不可逆的密码
* DK = PBKDF2(PRF, Password, Salt, c, dkLen)
* * PRF是一个伪随机函数,例如HASH_HMAC函数,它会输出长度为hLen的结果。
* * Password是用来生成密钥的原文密码。
* * Salt是一个加密用的盐值。
* * c是进行重复计算的次数。
* * dkLen是期望得到的密钥的长度。
* * DK是最后产生的密钥。
*/ public class OtherTest {
public static StringBuilder savePassword(String password)throws NoSuchAlgorithmException, InvalidKeySpecException {
SecureRandom random = new SecureRandom();
byte salt[] = new byte[24];
random.nextBytes(salt);
int iterCount=5000;//迭代次数不低于5000次
char[] charPassword = password.toCharArray();
PBEKeySpec pbeKeySpec = new PBEKeySpec(charPassword,salt,iterCount,256);
SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
byte[] hashpassword = secretKeyFactory.generateSecret(pbeKeySpec).getEncoded();
StringBuilder finalPassword = new StringBuilder();
String hv;
for (int i=0;i<hashpassword.length;i++){
int j = hashpassword[i] & 0xFF;
hv = Integer.toHexString(j);
if (hv.length()==1){
hv = "0"+hv;
}
finalPassword.append(hv);
}
return finalPassword;
}
public static void main(String[] args) throws NoSuchAlgorithmException,InvalidKeySpecException {
System.out.println(savePassword("123456"));
}
}

三、文件上传

  • 服务端通过白名单限制上传的文件类型
  • 限制文件的大小
  • 限制文件保存的目录,禁止执行权限
  • 压缩包需要考虑解压后大小、文件名是否包含目录跳转字符
  • 对上传的文件重命名,上传的路径禁止返回客户端

如下代码:获取文件类型,并判断文件名是否包含空格DEMO

package net.xdclass.demo;
import java.io.File; /**
* 获取上传文件的文件类型,并判断文件名是否包含空
*/ public class OtherTest {
public static void main(String[] args) {
//取上传文件的文件名
String path="D:\\MyDocument\\3-java\\2-Code\\demo.java";
File file = new File(path);
String fileName = file.getName();
StringBuilder finalFileName = new StringBuilder();
//去除文件名中的空字符
for (int i=0;i<fileName.length();i++){
if ('\u0000' != fileName.charAt(i)){
finalFileName.append(fileName.charAt(i));
}
}
int i = finalFileName.lastIndexOf(".");
String fileExtension = finalFileName.substring(i+1);
System.out.println(fileExtension);
}
}

四、SQL注入

防范SQL注入的方法:

  • 预编译
  • 对不可信的数据进行处理
  • 对不可信的数据进行编码

如下代码:通过预编译的方式防范SQL注入漏洞

1、错误示例,拼接SQL语句,导致存在SQL注入漏洞

package Eleven;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.*; public class OtherTest {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/user_info?serverTimezone=UTC", "root", "123456");
Statement stmt = null;
ResultSet rsSet = null; String userName = "Eleven' or '1'='1'-- "; //拼接一个用户名,形成万能查询
String userPassword = "123456";
String sqlString = "select * from user where name = '" + userName +"' AND password = '" + userPassword + "'"; // 变量未经处理直接与SQL语句拼接在一起
stmt = conn.createStatement();
rsSet = stmt.executeQuery(sqlString);
while(rsSet.next()) {
String name = rsSet.getString("name");
String password = rsSet.getString("password");
System.out.println(name+" "+password); //输出结果为数据库所有的用户名密码。
}
}
}

2、正确示例

package Eleven;
import java.sql.*; public class Test {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/user_info?serverTimezone=UTC", "root", "123456");
String userName="Eleven";
String userPwd="123456";
String sql = " SELECT * FROM `user` WHERE name=? and password=? ";
PreparedStatement pstate = conn.prepareStatement(sql);
pstate.setString(1, userName);
pstate.setString(2, userPwd);
ResultSet rsSet = pstate.executeQuery(); while(rsSet.next()) {
String name = rsSet.getString("name");
String password = rsSet.getString("password");
System.out.println(name+" "+password);
}
rsSet.close();
pstate.cancel();
conn.close();
}
}

五、HMAC-SHA256

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec; public class Sha256_mac {
public static String sha256_mac(String message,String key){
String outPut= null;
try{
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key = new SecretKeySpec(key.getBytes(),"HmacSHA256");
sha256_HMAC.init(secret_key);
byte[] bytes = sha256_HMAC.doFinal(message.getBytes());
outPut = byteArrayToHexString(bytes);
}catch (Exception e){
System.out.println("Error HmacSHA256========"+e.getMessage());
}
return outPut;
}
public static String byteArrayToHexString(byte[] b) {
StringBuilder sb = new StringBuilder();
String stmp;
for (int n = 0; b != null && n < b.length; n++) {
stmp = Integer.toHexString(b[n] & 0XFF);
if (stmp.length() == 1)
sb.append('0');
sb.append(stmp);
}
return sb.toString().toLowerCase();
} }

六、

七、

web安全编码Demo的更多相关文章

  1. Nginx + FastCGI 程序(C/C++)搭建高性能web service的demo

    http://blog.csdn.net/chdhust/article/details/42645313 Nginx + FastCGI 程序(C/C++)搭建高性能web service的Demo ...

  2. 解析WEB开发编码问题

    解析WEB开发编码问题 URL: http://tcking.javaeye.com/blog/726643 在进行web开发的时候经常会遇到乱码的问题,乱码一般出现在: 1.写在jsp文件中的中文变 ...

  3. Web Service学习-CXF开发Web Service实例demo(一)

    Web Service是什么? Web Service不是框架.更甚至不是一种技术. 而是一种跨平台,跨语言的规范 Web Service解决什么问题: 为了解决不同平台,不同语言所编写的应用之间怎样 ...

  4. C# -- WebClient自动获取web页面编码并转换

    C# -- WebClient自动获取web页面编码并转换 抽个时间,写篇小文章,最近有个朋友,用vb开发一个工具,遇到WebClient获取的内容出现乱码,可惜对vb不是很熟悉,看了几分钟vb的语法 ...

  5. Nginx + FastCGI 程序(C/C++) 搭建高性能web service的Demo及部署发布

       FastCGI编程包括四部分:初始化编码.接收请求循环.响应内容.响应结束循环. FCGX_Request request; FCGX_Init(); ); FCGX_InitRequest(& ...

  6. 【入门篇】Nginx + FastCGI 程序(C/C++) 搭建高性能web service的Demo及部署发布

    http://blog.csdn.net/allenlinrui/article/details/19419721 1.介绍     Nginx - 高性能web server,这个不用多说了,大家都 ...

  7. 不可小觑的Web开发编码规范

    http://www.csdn.net/article/2013-10-21/2817235-coding-conventions-in-web-development 摘要:编码规范是一套规章制度, ...

  8. WEB前端 [编码] 规则浅析

    前言 说到前端安全问题,首先想到的无疑是XSS(Cross Site Scripting,即跨站脚本),其主要发生在目标网站中目标用户的浏览器层面上,当用户浏览器渲染整个HTML文档的过程中出现了不被 ...

  9. Web Service简单demo

    最近开发因需求要求需要提供Web Service接口供外部调用,由于之前没有研究过该技术,故查阅资料研究了一番,所以写下来记录一下,方便后续使用. 这个demo采用CXF框架进行开发,后续所提到的We ...

随机推荐

  1. RStudio 不中断下载依赖包

    修改下载方式:

  2. C#使用splitContainer控件制作收缩展开面板

    C#使用splitContainer控件制作收缩展开面板 原创 2011年07月19日 17:18:02 标签: c# / object / 扩展 / 测试 15690         最近对Squi ...

  3. 2.将视图添加到 ASP.NET Core MVC 应用

    在本部分中,将修改 HelloWorldController 类,进而使用 Razor 视图文件来顺利封装为客户端生成 HTML 响应的过程. 当前,Index 方法返回带有在控制器类中硬编码的消息的 ...

  4. Python TK编程第一部分 Hello Again

    当你想写大一点的程序的时候,将你的代码封装到一个或者多个类里会是一个不错的办法.下面'hello world'这个例子来自Matt Conway的Tkinter Life Preserver. fro ...

  5. Yapi接口管理平台 本地部署 windows环境 -

    YApi 是高效.易用.功能强大的 api 管理平台,旨在为开发.产品.测试人员提供更优雅的接口管理服务.可以帮助开发者轻松创建.发布.维护 API,YApi 还为用户提供了优秀的交互体验,开发人员只 ...

  6. 读 HeadFirst 设计模式

    以往虽也看过相关设计模式的书籍,但能和与HeadFirt设计模式这本书相比不是缺乏严谨性就是缺乏具体应用实例,还有幽默生动以及引人启发的观点. 设计原则 设计原则并不能光靠死记硬背,我们需要通过具体的 ...

  7. 【新手篇】搭建DCN漏洞靶机及简单的SQL手工注入

    很多新手小白入门后发现想要学好“网安”技术,除了掌握基础理论知识,更需要经常模拟不同的漏洞环境,但是如果使用外网服务器练习,会存在一定风险,因此能够搭建一个本地的模拟环境去测试漏洞将是一个不错的方案. ...

  8. LeetCode——Employees Earning More Than Their Managers

    The Employee table holds all employees including their managers. Every employee has an Id, and there ...

  9. 去除数组空格 php

    public function trimArray($params){ if (!is_array($params)) return trim($params); return array_map([ ...

  10. 关于VS2015 发布.net mvc 网站失败的问题

    问题:VS生成成功,发布失败,在“正在连接到***文件夹”处就不能继续了.. 项目开发告一段落,准备部署到服务器上进行最后测试,但是始终发布失败  生成成功,发布失败,没有任何提示信息 一开始以为是文 ...