web安全编码Demo
目录:
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的更多相关文章
- Nginx + FastCGI 程序(C/C++)搭建高性能web service的demo
http://blog.csdn.net/chdhust/article/details/42645313 Nginx + FastCGI 程序(C/C++)搭建高性能web service的Demo ...
- 解析WEB开发编码问题
解析WEB开发编码问题 URL: http://tcking.javaeye.com/blog/726643 在进行web开发的时候经常会遇到乱码的问题,乱码一般出现在: 1.写在jsp文件中的中文变 ...
- Web Service学习-CXF开发Web Service实例demo(一)
Web Service是什么? Web Service不是框架.更甚至不是一种技术. 而是一种跨平台,跨语言的规范 Web Service解决什么问题: 为了解决不同平台,不同语言所编写的应用之间怎样 ...
- C# -- WebClient自动获取web页面编码并转换
C# -- WebClient自动获取web页面编码并转换 抽个时间,写篇小文章,最近有个朋友,用vb开发一个工具,遇到WebClient获取的内容出现乱码,可惜对vb不是很熟悉,看了几分钟vb的语法 ...
- Nginx + FastCGI 程序(C/C++) 搭建高性能web service的Demo及部署发布
FastCGI编程包括四部分:初始化编码.接收请求循环.响应内容.响应结束循环. FCGX_Request request; FCGX_Init(); ); FCGX_InitRequest(& ...
- 【入门篇】Nginx + FastCGI 程序(C/C++) 搭建高性能web service的Demo及部署发布
http://blog.csdn.net/allenlinrui/article/details/19419721 1.介绍 Nginx - 高性能web server,这个不用多说了,大家都 ...
- 不可小觑的Web开发编码规范
http://www.csdn.net/article/2013-10-21/2817235-coding-conventions-in-web-development 摘要:编码规范是一套规章制度, ...
- WEB前端 [编码] 规则浅析
前言 说到前端安全问题,首先想到的无疑是XSS(Cross Site Scripting,即跨站脚本),其主要发生在目标网站中目标用户的浏览器层面上,当用户浏览器渲染整个HTML文档的过程中出现了不被 ...
- Web Service简单demo
最近开发因需求要求需要提供Web Service接口供外部调用,由于之前没有研究过该技术,故查阅资料研究了一番,所以写下来记录一下,方便后续使用. 这个demo采用CXF框架进行开发,后续所提到的We ...
随机推荐
- 升级 ASP.NET Core 3.0 设置 JSON 返回 PascalCase 格式与 SignalR 问题
由于一些 JS 组件要求 JSON 格式是 PascalCase 格式,新版本 ASP.NET Core 3.0 中默认移除了 Newtonsoft.Json ,使用了微软自己实现的 System.T ...
- 2019-11-25-win10-uwp-发布旁加载自动更新
原文:2019-11-25-win10-uwp-发布旁加载自动更新 title author date CreateTime categories win10 uwp 发布旁加载自动更新 lindex ...
- WEB网站发布服务器IIS报错问题终极解决方案,查到问题点
4本次错误webservice发布新服务器后,出现此错误. 解决方法: 找到dmp文件 dmp文件是啥?自己百度.简单的说就是黑匣子,记录程序崩溃前的操作,那么如何找到这个黑匣子呢? 1.启动 Win ...
- vue 获取视频时长
参考资料:js获取上传音视频文件的时长 直接通过element-ui自带的上传组件结合js即可,代码如下: HTML: <el-upload class="upload-demo&qu ...
- VS Code 自动修改和保存 代码风格 == eslint+prettier
最近因为用到VS Code,需要统一所有人的代码风格(前端语言js/html/css等,或者后端语言 go/python等也可以这么用). 所以参考了一些网络资料,记录下设置步骤,以便后续查阅. St ...
- Vue.js项目实战-多语种网站(租车)
首先来看一下网站效果,想写这个项目的读者可以自行下载哦,地址:https://github.com/Stray-Kite/Car: 在这个项目中,我们主要是为了学习语种切换,也就是右上角的 中文/En ...
- vue学习指南:第三篇(详细) - vue的生命周期
今天小编给大家详细讲解一下 vue 的生命周期.希望大家多多指教,哪里有遗漏的地方,也请大家指点出来 谢谢. 一. 怎么理解 Vue 的生命周期的? 生命周期:从无到有,到到无的一个过程.Vue的生命 ...
- 修改host指定域名指向ip,Windows脚本与Linux脚本
修改host指定域名指向ip,Windows脚本与Linux脚本 一,Windows系统修改hosts文件 Windows系统下hosts文件位置:C:\Windows\System32\driver ...
- linux 网站目录权限设置
Linux下Apache网站目录读写权限的设置 网站目录文件权限的设置对网站的安全至关重要,下面简单介绍网站目录文件权限的基本设定. 我们假设http服务器运行的用户和用户组是www,网站用户为cen ...
- 2.1 Scala语言概述
一.编程范式 命令式编程没有办法充分利用多核CPU: 函数式编程很多变量是不可修改的. 二.Scala简介 特点 scala运行在JVM上,兼容现有的Java程序: 面向对象的编程语言: 一门函数式语 ...