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 ...
随机推荐
- 计算机基础 ---- 编码(er)
1.字符集与编码 字符集:字符组成的集合,汉字,字母,符号被收录到标准的字符集合 编码:规定每个字符使用一个字节还是多个字节存储,那些字节来存储的规定 术语:字符编码(character encodi ...
- logical函数
logical函数(逻辑函数) logical(x):x ~=0时,logical(x)=1:x = 0时,logical(x)=0
- centos crontab定时任务用法
一.安装crond服务 yum -y update yum -y install cronie yum-cron 二.crontab任务语法 crontab任务配置基本格式: * * * * * co ...
- jdbc:mysql:/// jdbc连接数据url简写方式
正常情况下我们写jdbc连接本地mysql数据库的时候通常是这样写 jdbc:mysql:localhost:3306/数据库名 下面就是要提到的简单的方法 jdbc:mysql:///数据库名
- js、jquery、css属性及出错集合
*)注意使用jquery设置css的语法 css("propertyname","value");#单个时时逗号 css({"propertyname ...
- var变量
# Aduthor:CCIP-Ma name = "ma" name2 = name name = "ccip-ma" print("My name ...
- 小鸟初学Shell编程(五)输入输出重定向
重定向作用 一个进程默认会打开标准输入.标准输出.错误输出三个文件描述符. 重定向可以让我们的程序的标准输出.错误输出的信息重定向文件里,那么这里还可以将文件的内容代替键盘作为一种标准输入的方式. 重 ...
- Java网络编程 -- Netty中的ByteBuf
由于JDK中提供的ByteBuffer无法动态扩容,并且API使用复杂等原因,Netty中提供了ByteBuf.Bytebuf的API操作更加便捷,可以动态扩容,提供了多种ByteBuf的实现,以及高 ...
- element实现vue级联多选
已经有大神完成element的改造github:https://github.com/webCoderJ/ele-multi-cascader#Attributes 已实践可用
- windows elasticsearch使用ik分词器插件后启动报错java.security.AccessControlException: access denied ("java.io.FilePermission" "D:...........\plugins\ik-analyzer\config\IKAnalyzer.cfg.xml" "read")
删除es安装文件夹中空格,遂解决......(哭