精华内容
下载资源
问答
  •  二维码的重要性不言而喻。二维条形码最早发明于日本,它是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的,在代码编制上巧妙地利用构成计算机内部逻辑基础的“0”、...

    一 简介     

            二维码的重要性不言而喻。二维条形码最早发明于日本,它是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的,在代码编制上巧妙地利用构成计算机内部逻辑基础的“0”、“1”比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设备自动识读以实现信息自动处理。它具有条码技术的一些共性:每种码制有其特定的字符集;每个字符占有一定的宽度;具有一定的校验功能等。同时还具有对不同行的信息自动识别功能、及处理图形旋转变化等特点。
           常用的二维码开发工具包有QRCode,ZXing和barcode4j。QRCode是日本人开发的,也是最早的二维码开发包; ZXing是google开发的,barcode4j也是老美开发的,barcode4j对一维条形码处理的很好,而且支持的格式很多,当然也可以对二维码进行处理,效果个人感觉没有前两种好。这里以QRCode为例阐述二维码的开发应用。

    二  案例

    工程结构图

    二维码实现类MyQrCodeImage.java

    package com.accp.utils;
    
    import java.awt.image.BufferedImage;
    
    import jp.sourceforge.qrcode.data.QRCodeImage;
    /**
     * 二维码实现类
     * @author wx
     * 解析二维码时需要
     */
    public class MyQrCodeImage implements QRCodeImage{
    	BufferedImage bufferedImage;
    
        public MyQrCodeImage(BufferedImage bufferedImage) {
            this.bufferedImage = bufferedImage;
        }
    
        public int getHeight() {
            return bufferedImage.getHeight();
        }
    
        public int getPixel(int arg0, int arg1) {
            return bufferedImage.getRGB(arg0, arg1);
        }
    
        public int getWidth() {
            return bufferedImage.getWidth();
        }
    }
    

    二维码工具类,直接调用里面的方法可以直接生成不带logo的二维码和带logo的二维码,请看代码详细注释

    package com.accp.utils;
    
    import java.awt.Color;
    import java.awt.Graphics2D;
    import java.awt.Image;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
    import java.io.OutputStream;
    
    import javax.imageio.ImageIO;
    
    import jp.sourceforge.qrcode.QRCodeDecoder;
    import jp.sourceforge.qrcode.data.QRCodeImage;
    
    import com.swetake.util.Qrcode;
    
    public class QrCodeUtil {
    	/**
    	 * 产生不带logo的二维码
    	 * @param os 输出流,即验证码图片的目的地
    	 * @param qrData 二维码中包含的信息(即扫描出来的结果)
    	 * @param size 二维码大小 7,8,9等
    	 * @throws IOException
    	 */
    	public static void createQrCode(OutputStream os, String qrData, int size)
    			throws IOException {
    		// 创建一个生成二维码对象
    		Qrcode code = new Qrcode();
    		// 设置二维码排错率,可选L(7%)、M(15%)、Q(25%)、H(30%),
    		// 排错率越高可存储的信息越少,但对二维码清晰度的要求越小
    		code.setQrcodeErrorCorrect('M');
    		// N代表数字,A代表a-Z,B代表其它字符
    		code.setQrcodeEncodeMode('B');
    		// 设置设置二维码版本,取值范围1-40,值越大尺寸越大,可存储的信息越大
    		code.setQrcodeVersion(size);
    		// 二维码图片的宽和高
    		int width = 67 + 12 * (size - 1);
    		int height = 67 + 12 * (size - 1);
    		// 定义一个图片对象
    		BufferedImage bufferedImage = new BufferedImage(width, height,
    				BufferedImage.TYPE_INT_RGB);
    		Graphics2D gs = bufferedImage.createGraphics();
    		// 设置画笔
    		gs.setBackground(Color.WHITE);
    		gs.setColor(Color.BLACK);
    		gs.clearRect(0, 0, width, height);
    		int pixoff = 2;// 偏移量
    		byte[] d = qrData.getBytes("utf-8");
    		if (d.length > 0 && d.length < 120) {
    			boolean[][] s = code.calQrcode(d);
    			for (int i = 0; i < s.length; i++) {
    				for (int j = 0; j < s.length; j++) {
    					if (s[j][i]) {
    						// 往画板中填充内容
    						gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3);
    					}
    				}
    			}
    		}
    		gs.dispose();
    		bufferedImage.flush();
    		ImageIO.write(bufferedImage, "png", os);
    	}
    	
    	/**
    	 * 创建带logo的二维码
    	 */
    	public static void createLogoCode(String imgPath, String logoPath,
    			String qrData, int size) throws IOException {
    		// 创建一个生成二维码对象
    		Qrcode code = new Qrcode();
    		// 设置二维码排错率,可选L(7%)、M(15%)、Q(25%)、H(30%),
    		// 排错率越高可存储的信息越少,但对二维码清晰度的要求越小
    		code.setQrcodeErrorCorrect('M');
    		// N代表数字,A代表a-Z,B代表其它字符
    		code.setQrcodeEncodeMode('B');
    		// 设置设置二维码版本,取值范围1-40,值越大尺寸越大,可存储的信息越大
    		code.setQrcodeVersion(size);
    		// 二维码图片的宽和高
    		int width = 67 + 12 * (size - 1);
    		int height = 67 + 12 * (size - 1);
    		// 定义一个图片对象
    		BufferedImage bufferedImage = new BufferedImage(width, height,
    				BufferedImage.TYPE_INT_RGB);
    		Graphics2D gs = bufferedImage.createGraphics();
    		// 设置画笔
    		gs.setBackground(Color.WHITE);
    		gs.setColor(Color.BLACK);
    		gs.clearRect(0, 0, width, height);
    		int pixoff = 2;// 偏移量
    		byte[] d = qrData.getBytes("utf-8");
    		if (d.length > 0 && d.length < 120) {
    			boolean[][] s = code.calQrcode(d);
    			for (int i = 0; i < s.length; i++) {
    				for (int j = 0; j < s.length; j++) {
    					if (s[j][i]) {
    						// 往画板中填充内容
    						gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3);
    					}
    				}
    			}
    		}
    		//实例化一个Image对象。
    		Image img = ImageIO.read(new File(logoPath));
    		//定义二维码的宽和高,一般设置为版本的3倍
    		int logoWidth=size*3;
    		int logoHeight=size*3;
    		//把logo画到二维码的中心上去
    		gs.drawImage(img, width/2-logoWidth/2, 
    				  height/2-logoHeight/2, logoWidth, logoHeight, null); 
    		gs.dispose();
    		bufferedImage.flush();
    		File imgFile = new File(imgPath);
    		ImageIO.write(bufferedImage, "png", imgFile);
    	}
    
    	/**
    	 * 读取二维码
    	 * 
    	 * @param imgPath
    	 *            二维码路径
    	 * @return 二维码包含信息
    	 * @throws Exception
    	 */
    	public static String readQrCode(String imgPath) throws Exception {
    		File file = new File(imgPath);
    		BufferedImage bufferedImage = ImageIO.read(file);
    		QRCodeDecoder codeDecoder = new QRCodeDecoder();
    		QRCodeImage codeImg = new MyQrCodeImage(bufferedImage);
    		String result = new String(codeDecoder.decode(codeImg), "utf-8");
    		return result;
    	}
    
    }
    

    ===============================

    编写测试类,生成纯二维码

    package com.accp.utils;
    
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    public class TestReadCode {
    	public static void main(String[] args) {
    		FileOutputStream fos=null;
    		//验证码中包含的信息
    		String qrData = "http://wap.baidu.com/";  
    		try {
    			fos=new FileOutputStream("c:\\temp\\qrcode.png");
    			//生成二维码
    			QrCodeUtil.createQrCode(fos,qrData,15);
    			String path="c:\\temp\\qrcode.png";
    			//解析二维码中包含的数据
    			String result=QrCodeUtil.readQrCode(path);
    			System.out.println(result);
    		} catch (Exception e) {
    			e.printStackTrace();
    		}finally{
    			try {
    				if(fos!=null){
    					fos.close();
    				}
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    		}
    	}
    }
    

    结果如下

    手机扫描后直接打开百度页面

    ======================================

    编写测试类,生成带logo的二维码

    package com.accp.utils;
    
    import java.io.IOException;
    
    public class TestLogoCode {
    	public static void main(String[] args) {
    		//最后生成的图片地址
    		String qrCodePath = "C:\\temp\\LogoCode.png";
    		//加入的logo照片
    		String logoPath = "C:\\temp\\aa.png";
    		String content = "http://wap.baidu.com/";
    		try {
    			QrCodeUtil.createLogoCode(qrCodePath, logoPath, content, 15);
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    }
    

    结果如图

    手机扫描后的结果和上一相同

    =========================================

    三   用jquery生成二维码

    请自行下载jquery的二维码开发包jquery.qrcode.min.js,引入到工程中,如图:

    UnicodeToUtf8.js是自己编写的一个解决中文乱码的js库,代码如下:

    /* 把unicode字符转换为utf8格式 */
    function utf16to8(str) {   
         var out, i, len, c;   
         out = "";   
         len = str.length;   
         for(i = 0; i < len; i++) {   
             c = str.charCodeAt(i);   
             if ((c >= 0x0001) && (c <= 0x007F)) {   
                 out += str.charAt(i);   
             } else if (c > 0x07FF) {   
                 out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));   
                 out += String.fromCharCode(0x80 | ((c >>  6) & 0x3F));   
                 out += String.fromCharCode(0x80 | ((c >>  0) & 0x3F));   
             } else {   
                 out += String.fromCharCode(0xC0 | ((c >>  6) & 0x1F));   
                 out += String.fromCharCode(0x80 | ((c >>  0) & 0x3F));   
             }   
         }   
         return out; 
    }

    具体代码如下:

    <%@ page language="java" import="java.util.* " pageEncoding="UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <c:set var="path" value="${pageContext.request.contextPath}"></c:set>
    <c:set var="scheme" value="${pageContext.request.scheme}"></c:set>
    <c:set var="serverName" value="${pageContext.request.serverName}"></c:set>
    <c:set var="serverPort" value="${pageContext.request.serverPort}"></c:set>
    <c:set var="basePath" value="${scheme}://${serverName }:${serverPort }${path }/"></c:set>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <base href="${basePath }">
        <title>js生成二维码</title>
    	<meta http-equiv="pragma" content="no-cache">
    	<meta http-equiv="cache-control" content="no-cache">
    	<meta http-equiv="expires" content="0">    
    <script type="text/javascript" src="js/jquery.min.js"></script>
    <script type="text/javascript" src="js/jquery.qrcode.min.js"></script>
    <script type="text/javascript" src="js/UnicodeToUtf8.js"></script>
    <script type="text/javascript">
    $(document).ready(function(e){
    	$("#qrcode").hide();
    	$("#myCode").click(function(e){
    		var content=$("[name=content]").val();
    		content=$.trim(content);
    		if(content==""){
    			window.alert("请输入二维码中存储的信息,输入网址扫描后可自动跳转");
    			return;
    		}
    		$("#qrcode").html("");
    		$("#qrcode").show();
    		//生成二维码
    		$("#qrcode").qrcode({
    		    width: 256,        //设置宽度 
    		    height: 256,       //设置高度
    		    render:'canvas',   //设置渲染方式
    		    text:utf16to8(content)    //设置内容
            });
    	});
    });
    </script>
    </head>
    <body>
    <h2><input type="text" name="content"/>
    <input type="button" value="生成验证码" id="myCode"/></h2>
    <div align="center" id="qrcode" 
         style="border: 2px solid red; width:600px;" ></div>
    </body>
    </html>
    

    运行结果如下:

    手机扫描后的结果

    展开全文
  • 二维码登录 随着智能机的普及,在手持设备端做用户验证是一种较为高效,安全的手段,而在pc端利用已经鉴权过的手持设备扫码登录不仅方便,而且安全。 redis数据说明 ...后期要考虑ddos攻击等安全问题
  • 路人甲 · 2015/12/02 12:420x00 前言现在Android App几乎都有二维码扫描功能,如果没有考虑到二维码可能存在的安全问题,将会导致扫描二维码就会受到漏洞攻击,严重的可能导致手机被控制,信息泄漏等风险。...

    路人甲 · 2015/12/02 12:42

    0x00 前言


    现在Android App几乎都有二维码扫描功能,如果没有考虑到二维码可能存在的安全问题,将会导致扫描二维码就会受到漏洞攻击,严重的可能导致手机被控制,信息泄漏等风险。

    0x01 拒绝服务


    低版本的zxing这个二维码库在处理畸形二维码时存在数组越界,导致拒绝服务。扫描下面的二维码,可能导致主程序崩溃:

    通过程序的崩溃日志可以看出是个数组越界:

    11-23 10:39:02.535: E/AndroidRuntime(1888): FATAL EXCEPTION: Thread-14396 
    11-23 10:39:02.535: E/AndroidRuntime(1888): Process: com.xxx, PID: 1888 
    11-23 10:39:02.535: E/AndroidRuntime(1888): java.lang.ArrayIndexOutOfBoundsException: length=9; index=9 
    11-23 10:39:02.535: E/AndroidRuntime(1888):   at com.google.zxing.common.BitSource.readBits(Unknown Source) 
    11-23 10:39:02.535: E/AndroidRuntime(1888):   at com.google.zxing.qrcode.decoder.DecodedBitStreamParser.decodeAlphanumericSegment(Unknown Source) 
    11-23 10:39:02.535: E/AndroidRuntime(1888):   at com.google.zxing.qrcode.decoder.DecodedBitStreamParser.decode(Unknown Source) 
    11-23 10:39:02.535: E/AndroidRuntime(1888):   at com.google.zxing.qrcode.decoder.Decoder.decode(Unknown Source) 
    11-23 10:39:02.535: E/AndroidRuntime(1888):   at com.google.zxing.qrcode.QRCodeReader.decode(Unknown Source) 
    11-23 10:39:02.535: E/AndroidRuntime(1888):   at com.google.zxing.MultiFormatReader.decodeInternal(Unknown Source) 
    11-23 10:39:02.535: E/AndroidRuntime(1888):   at com.google.zxing.MultiFormatReader.decodeWithState(Unknown Source) 
    复制代码

    0x02 本地文件读取


    之前Wooyun上爆了一个利用恶意二维码攻击快拍的漏洞,识别出来的二维码默认以html形式展示(Android+Iphone),可以执行html和js。将下面的js在cli.im网站上生成二维码:

    #!js
    <script>
    x=new XMLHttpRequest(); 
    if(x.overrideMimeType) 
    x.overrideMimeType('text/xml'); 
    x.open("GET", "file:/default.prop", false); 
    x.send(null); 
    alert(x.responseText); 
    </script>
    复制代码

    用快拍扫描之后,就能读取本地文件内容:

    0x03 UXSS


    去年,Android平台上的Webview UXSS漏洞被吵的沸沸扬扬,由于低版本的Android系统自带的Webview组件使用Webkit作为内核,导致Webkit的历史漏洞就存在于Webview里面,其中就包括危害比较大的UXSS漏洞。

    Webview组件几乎存在于所有Android App中,用来渲染网页。如果扫描二维码得到的结果是个网址,大部分App会直接用Webview来打开,由于Webview存在UXSS漏洞,很容易导致资金被窃、帐号被盗或者隐私泄露。漏洞介绍可参考TSRC博文:Android Webview UXSS 漏洞攻防

    0x04 远程命令执行


    大部分Android App扫描二维码之后,如果识别到的二维码内容是个网址时,会直接调用Webview来进行展示。如果Webview导出了js接口,并且targetSDK是在17以下,就会受到远程命令执行漏洞攻击风险。

    苏宁易购Android版扫描二维码会用Webview打开网页,由于苏宁易购导出多个js接口,因此扫描二维码即会受到远程命令执行漏洞攻击(最新版本已修复)。

    com.suning.mobile.ebuy.host.webview.WebViewActivity导出多个js接口:

    #!java
    this.b(this.a);
                this.s = this.findViewById(2131494713);
                this.d = this.findViewById(2131494100);
                this.d.a(((BaseFragmentActivity)this));
                this.l = new SNNativeClientJsApi(this);
                this.d.addJavascriptInterface(this.l, "client");
                this.d.addJavascriptInterface(this.l, "SNNativeClient");
                this.d.addJavascriptInterface(new YifubaoJSBridge(this), "YifubaoJSBridge");
    复制代码

    由于targetSDKversion为14,因此所有Android系统版本都受影响:

    <uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="14"
    >
    </uses-sdk>
    复制代码

    苏宁易购Android版首页有个扫描二维码的功能:

    扫描二维码时,如果二维码是个网页链接,就会调用上面的Webview组件打开恶意网页:

    恶意二维码如下:

    0x05 总结


    二维码可能攻击的点还不止上面列的那些,发散下思维,还有zip目录遍历导致的远程代码执行漏洞,还有sql注入漏洞,说不定还有缓冲区溢出漏洞。思想有多远,攻击面就有多宽!Have Fun!

    展开全文
  • 生成二维码

    2018-01-22 09:27:10
    /** * 生成二维码 * * @param text 二维码内容 */ public static void zxingCodeCreate(String text, String filePath) throws Exception { int width = 208; // 图像宽度 int height = ...
     /**
         * 生成二维码
         *
         * @param text 二维码内容
         */
        public static void zxingCodeCreate(String text, String filePath) throws Exception {
            int width = 208; // 图像宽度
            int height = 208; // 图像高度
            String format = "png";//图片格式
            Map<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>();
            hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");//字符编码格式
            hints.put(EncodeHintType.MARGIN, 0);//边框宽度
            BitMatrix bitMatrix = new MultiFormatWriter().encode(text,
                    BarcodeFormat.QR_CODE, width, height, hints);// 生成矩阵
            BufferedImage image = MatrixToImageWriter.toBufferedImage(bitMatrix);
            File file = new File(filePath);
            if (!file.getParentFile().exists()) {//如果文件夹不存在,创建文件夹
                file.mkdirs();
            }
            if (!file.exists()) {//如果文件不存在,创建文件
                file.createNewFile();
            }
            ImageIO.write(image, format, file);
        }

    ImageIO的write方法提供了上面的3种重载形式,第2种方式是将图片写入服务器。1,3种可将图片输出到浏览器端;

    相对上面生成二维码图片到本地(或服务器),以下是使用ImageIO生成图片验证码到浏览器的方法

    /**
         * 生成验证码
         *
         * @param response
         */
        @RequestMapping("/valicode")
        public void actionValicode(HttpServletResponse response) {
            BufferedImage image = new BufferedImage(90, 30, BufferedImage.TYPE_INT_RGB);
            String valicode = Valicode.drawImage(image);
            String encryptString = BaseUtil.encrypt(valicode.toUpperCase(), BaseUtil.VALICODE_SALT);
            Cookie cookie = new Cookie("vali", encryptString);
            //cookie.setHttpOnly(true);	//增强安全,避免一定程度的跨站攻击,tomcat7
            cookie.setMaxAge(600);
            cookie.setPath("/");
            response.addCookie(cookie);
            response.setHeader("Pragma", "no-cache");
            response.setHeader("Cache-Control", "no-cache");
            response.setDateHeader("Expires", 0);
            response.setContentType("image/jpeg");
            ServletOutputStream output = null;
            try {
                output = response.getOutputStream();
                ImageIO.write(image, "jpeg", output);
                output.flush();
                output.close();
            } catch (IOException e) {
    
            }
        }


    展开全文
  • Java面试系列-webapp文件夹和WebContent文件夹的区别? 程序员面试系列:Spring MVC能响应HTTP请求的原因? Java程序员面试系列-什么是Java Marker Interface(标记接口) 使用JDK自带的工具jstack找出造成运行...

    我写的程序员面试系列

    Java面试系列-webapp文件夹和WebContent文件夹的区别?

    程序员面试系列:Spring MVC能响应HTTP请求的原因?

    Java程序员面试系列-什么是Java Marker Interface(标记接口)

    使用JDK自带的工具jstack找出造成运行程序死锁的原因

    编程面试题:编写一个会造成数据库死锁的应用

    JavaScript面试系列:JavaScript设计模式之桥接模式和懒加载

    使用JavaScript ES6的新特性计算Fibonacci(非波拉契数列)

    单例模式在很多Java程序员的眼中,应该是设计模式里最简单的一种了。那么单例模式可能会被攻击,您听说过么?

    说到“单例模式被攻击”这个话题,大家最容易想到的可能就是通过序列化/反序列化来攻击单例模式,因为一个对象实例序列化再反序列化后,得到的新的对象虽然各字段内容和原字段一致,然而对象地址和原始对象地址相比已经发生了变化,因此它们是两个不同的对象。

    上面的结论完全正确,然而除了序列化/反序列化,单例模式还可能遭受另一种方式的攻击,即反射攻击(Reflection attack)。

    看一个具体例子:

    public class JerrySingleton {
    
       private String name;
    
       private JerrySingleton(){
    
       name = "Jerry";
    
    }
    
    private static class SingletonHolder{
    
          private static final JerrySingleton INSTANCE = new JerrySingleton();
    
    }
    
    public static JerrySingleton getInstance() {
    
          return SingletonHolder.INSTANCE;
    
          }
    
    }

    上面是一个饿汉式单例。

    然而我只需要将这个单例类JerrySingleton的构造函数通过反射设置成可以访问Accessible,然后就能通过反射调用该构造函数,进而生成新的对象实例。这样就破坏了单例模式。

    Class<?> classType = JerrySingleton.class;
    
    Constructor<?> c = classType.getDeclaredConstructor(null);
    
    c.setAccessible(true);
    
    JerrySingleton e1 = (JerrySingleton)c.newInstance();
    
    JerrySingleton e2 = JerrySingleton.getInstance();
    
    System.out.println(e1 == e2);

    第6行代码会打印false。

    针对这种攻击,一种可行的防御措施是在单例类的构造函数内定义一个布尔变量,初始化为false。当构造函数执行后,该变量被置为true。如果接下来构造函数再次被执行,则人为抛出异常,避免构造函数重复执行。

    public class JerrySingletonImproved {
    
        private static boolean flag = false;
    
        private JerrySingletonImproved(){
    
             synchronized(JerrySingletonImproved.class) {
    
                if(flag == false) {
    
                      flag = !flag;
    
                }
    
          else {
    
                  throw new RuntimeException("Singleton violated");
    
          }
    
      }
    
    }
    
    }

    这种防御措施无法从根本上杜绝Singleton被攻击,因为攻击者仍旧可以通过反射来修改布尔变量flag的值,从而绕过这个检查。

    最理想的不会受到攻击的单例模式实现是借助Java里枚举类Enumeration的特性:

    这种实现类型的单例模式的消费代码:

    System.out.println(“Name:” + JerrySingletonAnotherApproach.INSTANCE.getName());

    如果攻击者通过前面介绍的反射代码对这种实现方式的单例进行攻击,JDK会抛出NoSuchMethodException异常:

    Exception in thread "main" java.lang.NoSuchMethodException: singleton.JerrySingletonAnotherApproach.<init>()
    
    at java.lang.Class.getConstructor0(Class.java:3082)
    
    at java.lang.Class.getDeclaredConstructor(Class.java:2178)
    
    at singleton.SingletonAttack.test3(SingletonAttack.java:31)
    
    at singleton.SingletonAttack.main(SingletonAttack.java:43)

    究其原因,是因为现在我们是通过Java枚举方式实现的单例,枚举类没有传统意义上的构造函数,因此对这种反射攻击免疫。

    要获取更多Jerry的原创技术文章,请关注公众号”汪子熙”或者扫描下面二维码:

    展开全文
  • java实现微信扫码登录以及授权

    千次阅读 2020-12-30 17:16:13
    "snsapi_login,snsapi_userinfo",//你的权限 redirect_uri:encodeURIComponent("你自己配置回调地址"),//url要进行encodeURIComponent编码 state: "STATE",//微信官方接口为了防止跨域攻击要加的参数 可以自己定义 ...
  • 百度人Api人脸识别登入,二维码生成

    千次阅读 2019-10-07 20:46:13
    //活体检测 NONE: 不进行控制 LOW:较低的活体要求(高通过率 低攻击拒绝率) NORMAL: 一般的活体要求(平衡的攻击拒绝率, 通过率) HIGH: 较高的活体要求(高攻击拒绝率 低通过率) //3.构造图片 String path = "C:\\...
  • 1、微信扫描登录生成二维码 微信官方开放文档:https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html 生成微信二维码:直接请求微信提供固定的地址,向地址后面拼接参数...
  • 秒懂,Java 注解 (Annotation)你可以这样学

    万次阅读 多人点赞 2017-06-27 21:48:30
    文章开头先引入一处...Annotation 中文译过来就是注解、标释的意思,在 Java 中注解是一个很重要的知识点,但经常还是有点让新手不容易理解。 我个人认为,比较糟糕的技术文档主要特征之一就是:用专业名词来...
  • 即生鲜电商中API接口防止参数篡改和重放攻击 目录 1. 什么是API参数篡改? 说明:API参数篡改就是恶意人通过抓包的方式获取到请求的接口的参数,通过修改相关的参数,达到欺骗服务器的目的,常用的防止篡改的方式是...
  • 微信网页二维码授权登陆

    千次阅读 2016-01-13 14:09:42
    )编码,不然微信会一直报redirect_uri参数异常,APPID填入上面申请好的scope填写snsapi_login,state主要防止csrf攻击(跨站请求伪造攻击),你自己可以生成随机或者sessionid ;"> ...
  • 10万字208道Java经典面试题总结(附答案)

    万次阅读 多人点赞 2021-08-01 16:05:55
    JDK(Java Development Kit),Java开发工具包 JRE(Java Runtime Environment),Java运行环境 JDK中包含JRE,JDK中有一个名为jre的目录,里面包含两个文件夹bin和lib,bin就是JVM,lib就是JVM工作所需要的类库。...
  • 【18】哈希算法

    2019-10-07 18:55:53
    18 哈希算法 1.... 这个公众号主要是分享和记录自己每日的技术学习,不定期整理子类分享,主要涉及 C – > Python – > Java,计算机基础知识,机器学习,职场技能等,简单说就是一句话,成长的见证!
  • 在这种方法中,身份验证将通过物理资产(二维码)的解密来完成,该资产将与当时系统的输入(人脸识别模式和密码)进行比较。 这样就不需要保留数据库,并且系统对基于网络的攻击和存储在其中的凭据的更改免疫。 该...
  • 微信扫描登录(生成二维码

    千次阅读 2020-08-10 21:44:28
    添加配置 application.properties添加相关配置信息 # 微信开放平台 appid wx.open.app_id=你的appid # 微信开放平台 appsecret wx.open.app_secret=你的...创建util包,创建ConstantPropertiesUtil.java常量类 @C
  • Java面试知识点总结

    2019-04-11 17:26:32
    文章目录java中的数据类型内置数据类型(基本数据类型)关于Integer引用数据类型java中的修饰符关于static面向对象基础多态重写重载隐藏成员变量静态方法Java虚函数、抽象函数、抽象类、接口Java虚函数Java抽象函数...
  • 网页应用java实现微信扫码登录授权

    千次阅读 热门讨论 2018-08-03 15:10:19
    这里只需要拼接好这个链接,就可以获取到微信提供的一个微信二维码链接,如果获取不了二维码说明就仔细检查参数看看有没有问题。最后看到的登录页面如下:   第二步:用code换取access_token 通过扫码,...
  • Java面试题总结(附答案)

    万次阅读 多人点赞 2020-08-04 23:56:28
    2012年毕业,2016年转行,没有一个体面的工作,机缘巧合之下,来到了大连,Java培训,一个全新的领域,迷茫、困惑、漫无目的的努力,转行真的被歧视,真的不行吗?我命由我不由天,我觉得我行!相信我,只要你足够...
  • 阿里巴巴Java开发手册(第2版)中国人自己原创的Java编程规约,更为完善的版本,新增59条规约,修正202处原有规约,完善8个示例;阿里经济体全球技术开发准则。《阿里巴巴Java开发...
  • 扫描下面的二维码关注我 后台回复"技术",加入技术群 后台回复“k8s”,可领取k8s资料 【精彩推荐】 ClickHouse到底是什么?为什么如此牛逼! 原来ElasticSearch还可以这么理解 面试官:InnoDB中一棵B+树可以存放...
  • JAVA小型三国杀的制作_1

    千次阅读 多人点赞 2017-02-26 11:28:44
    利用JAVA方面的知识制作
  •  最近公司新推出了一款自己产品 陌筹君 该项目是当下比较流行的一款众筹app 项目中有用到环信及时聊天,所以就想到了二维码加好友这种方便快捷的功能。最近在研究过程中看到博主文章 。  二维码扫码 google
  • 扫描二维码或搜索下图红色VX号,加VX好友,拉你进【程序员面试学习交流群】免费领取。也欢迎各位一起在群里探讨技术。 零、Java反序列化漏洞 java的安全问题首屈一指的就是反序列化漏洞,可以执行命令啊,甚至...
  • 近期很多读者询问关于《JAVA代码安全审计》一书的出版进展,统一回复下,目前新书《JAVA代码安全审计(入门篇)》11月底已经完成全部书稿并交付出版社,全书分为九章460页,共计...
  • throws Exception { // 防止csrf攻击(跨站请求伪造攻击) String state = UUID.randomUUID().toString().replaceAll("-", ""); // 存入redis。 CacheUtil为封装redis的工具类 CacheUtil.set(ThirdPartyLoginEnum....
  • 点击上方蓝色字体,选择“标星公众号” 优质文章,第一时间送达 作者 | Zzzkis 来源 | urlify....大家如果想要,直接使用以下方式获取高清PDF面试手册: 资料获取方法 必须关注下方二维码 在后台回复关键词:手册

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,531
精华内容 1,412
关键字:

java二维码攻击

java 订阅