目录:

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. 升级 ASP.NET Core 3.0 设置 JSON 返回 PascalCase 格式与 SignalR 问题

    由于一些 JS 组件要求 JSON 格式是 PascalCase 格式,新版本 ASP.NET Core 3.0 中默认移除了 Newtonsoft.Json ,使用了微软自己实现的 System.T ...

  2. 2019-11-25-win10-uwp-发布旁加载自动更新

    原文:2019-11-25-win10-uwp-发布旁加载自动更新 title author date CreateTime categories win10 uwp 发布旁加载自动更新 lindex ...

  3. WEB网站发布服务器IIS报错问题终极解决方案,查到问题点

    4本次错误webservice发布新服务器后,出现此错误. 解决方法: 找到dmp文件 dmp文件是啥?自己百度.简单的说就是黑匣子,记录程序崩溃前的操作,那么如何找到这个黑匣子呢? 1.启动 Win ...

  4. vue 获取视频时长

    参考资料:js获取上传音视频文件的时长 直接通过element-ui自带的上传组件结合js即可,代码如下: HTML: <el-upload class="upload-demo&qu ...

  5. VS Code 自动修改和保存 代码风格 == eslint+prettier

    最近因为用到VS Code,需要统一所有人的代码风格(前端语言js/html/css等,或者后端语言 go/python等也可以这么用). 所以参考了一些网络资料,记录下设置步骤,以便后续查阅. St ...

  6. Vue.js项目实战-多语种网站(租车)

    首先来看一下网站效果,想写这个项目的读者可以自行下载哦,地址:https://github.com/Stray-Kite/Car: 在这个项目中,我们主要是为了学习语种切换,也就是右上角的 中文/En ...

  7. vue学习指南:第三篇(详细) - vue的生命周期

    今天小编给大家详细讲解一下 vue 的生命周期.希望大家多多指教,哪里有遗漏的地方,也请大家指点出来 谢谢. 一. 怎么理解 Vue 的生命周期的? 生命周期:从无到有,到到无的一个过程.Vue的生命 ...

  8. 修改host指定域名指向ip,Windows脚本与Linux脚本

    修改host指定域名指向ip,Windows脚本与Linux脚本 一,Windows系统修改hosts文件 Windows系统下hosts文件位置:C:\Windows\System32\driver ...

  9. linux 网站目录权限设置

    Linux下Apache网站目录读写权限的设置 网站目录文件权限的设置对网站的安全至关重要,下面简单介绍网站目录文件权限的基本设定. 我们假设http服务器运行的用户和用户组是www,网站用户为cen ...

  10. 2.1 Scala语言概述

    一.编程范式 命令式编程没有办法充分利用多核CPU: 函数式编程很多变量是不可修改的. 二.Scala简介 特点 scala运行在JVM上,兼容现有的Java程序: 面向对象的编程语言: 一门函数式语 ...