目录:

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. javascript 写一个 map方法

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. C#猜测识别文件编码

    项目 gitee地址:https://gitee.com/dhclly/IceDog.SmallProject/tree/master/src/IceDog.SmallProject.CodeConv ...

  3. .net webapi跨域问题

    2019年11月8日,近期做项目开始实行前后端分离的方式开发,前端使用vue的框架,打包发布后,调用后端接口出现跨域的问题,网上搜索出来的都是以下的配置方式: 但是,在我的项目中,按这种方式配置没有效 ...

  4. webservice因引用Oracle.DataAccess.dll导致发布前预编译不通过

    这个问题最初是什么问题已经忘了,虽然就在几小时前/

  5. NIO你真正了解多少?

    解释一下java.io.Serializable接口 类通过实现 Java.io.Serializable 接口以启用其序列化功能.未实现此接口的类将无法使其任何状态序列化或反序列化. IO操作最佳实 ...

  6. Spring Boot 使用 Log4j2 & Logback 输出日志到 EKL

    文章目录 1.ELK 介绍 2.环境.软件准备 3.ELK 环境搭建 4.Spring Boot 配置示例 4.1.Log4j2 方式配置 4.2.Logback 方式配置 1.ELK 介绍 ELK ...

  7. AJAX小示例

    一. 基本内容 定义:AJAX(Asynchronous Javascript And XML)翻译成中文就是"异步的Javascript和XML",即使用Javascript语言 ...

  8. Invalid left-hand side in assignment

    今天遇到一个问题,算不上什么技术问题,但是感觉这个坑值得记录一下 说一下我们的环境,我们的项目都是本地启动服务的,所以直接在idea中打开前端代码进行开发的 原来的前端的代码都是es5的没有使用过箭头 ...

  9. Windows+Qt+MinGW使用gRPC

    本文参考博客文章Qt gRPC 简单应用进行了亲自尝试,特此记录以下过程,为后人提供经验.我的环境:Windows10 x64需要依赖MSYS2环境(一个类Unix环境,包管理器)MSYS2 gith ...

  10. Qt发送邮件

    首先下载支持库 https://download.csdn.net/download/zhangxuechao_/10598108 #ifndef MAIL_H #define MAIL_H #inc ...