防止sql注入方法 如何防止java中将MySQL的数据库验证密码加上 ' or '1'= '1 就可以出现万能密码 的PreparedStatement

package com.swift;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class LoginJDBC$PreparedStatement {

    public static void main(String[] args) {
        User userZhangsan=new User("swift","123456‘ or ‘1‘=‘1");
        if(login(userZhangsan)) {
            System.out.println("账号密码正确,登陆成功");
        }else {
            System.out.println("登陆失败");
        }
    }

    private static boolean login(User userZhangsan) {

        Connection conn=null;
        PreparedStatement ps=null;
        ResultSet rs=null;
        try {
            //1、装载驱动
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        try {
            //2、链接数据库,使用com.mysql.jdbc.Connection包会出错
            conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/sw_database?user=root&password=root");
            //3、创建连接语句
            ps=conn.prepareStatement("select * from sw_user where username=‘"+userZhangsan.getUsername()+"‘ and password=‘"+userZhangsan.getPassword()+"‘");
            //4、执行SQL语句获得结果集
            rs=ps.executeQuery();
            if(rs.next()) {
                return true;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            //关闭结果集
            try {
                if(rs!=null) {
                   rs.close();
                }
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            //关闭连接语句
            try {
                if(ps!=null) {
                   ps.close();
                }
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            //关闭数据库连接
            try {
                if(conn!=null) {
                    conn.close();
                }
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        return false;

    }

}
上面代码中的sql语句通过字符串连接的方式,虽然已经使用了PreparedStatement,但依然不能防止注入,因为字符串连接可以加入‘or ‘1‘=‘1ps=conn.prepareStatement("select * from sw_user where username=‘"+userZhangsan.getUsername()+"‘ and password=‘"+userZhangsan.getPassword()+"‘");将上面sql语句变为 select * from sw_user where username=? and password=?就不存在字符串连接,password 加上其他字符sql也无法执行所以代码修改如下:
package com.swift;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class LoginJDBC$PreparedStatement2 {

    public static void main(String[] args) {
        User userSwift=new User("zhangsan","123456");
        if(login(userSwift)) {
            System.out.println("账号密码正确,登陆成功");
        }else {
            System.out.println("登陆失败");
        }
    }

    private static boolean login(User userSwift) {

        Connection conn=null;
        PreparedStatement ps=null;
        ResultSet rs=null;
        try {
            //1、装载驱动
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        try {
            //2、链接数据库,使用com.mysql.jdbc.Connection包会出错
            conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/sw_database?user=root&password=root");
            //3、创建连接语句
            ps=conn.prepareStatement("select * from sw_user where username=? and password=?");
            ps.setString(1, userSwift.getUsername());
            ps.setString(2, userSwift.getPassword());
            //4、执行SQL语句获得结果集
            rs=ps.executeQuery();
            if(rs.next()) {
                return true;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            //关闭结果集
            try {
                if(rs!=null) {
                   rs.close();
                }
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            //关闭连接语句
            try {
                if(ps!=null) {
                   ps.close();
                }
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            //关闭数据库连接
            try {
                if(conn!=null) {
                    conn.close();
                }
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        return false;

    }

}
 

防止sql注入方法 如何防止java中将MySQL的数据库验证密码加上 ' or '1'= '1 就可以出现万能密码 的PreparedStatement

时间: 2024-10-23 02:53:44

防止sql注入方法 如何防止java中将MySQL的数据库验证密码加上 ' or '1'= '1 就可以出现万能密码 的PreparedStatement的相关文章

最全防止sql注入方法

最全防止sql注入方法 发布时间: 2012-04-5 浏览次数:19361 分类: PHP教程 (1)mysql_real_escape_string -- 转义 SQL 语句中使用的字符串中的特殊字符,并考虑到连接的当前字符集 使用方法如下: $sql = "select count(*) as ctr from users where username ='".mysql_real_escape_string($username)."' and password='&q

另类的SQL注入方法

前言:相比基于查询的SQL注入,使用insert.update和delete进行SQL注入显得略显另类 参考自:http://www.exploit-db.com/wp-content/themes/exploit/docs/33253.pdf 0x1 准备条件 a. mysql数据库 b. 创建用于实验的数据库和表 Create database newdb; use newdb CREATE TABLE users ( id int(3) NOT NULL AUTO_INCREMENT, u

SQL注入 转自 爱Java

Web网站最头痛的就是遭受攻击.Web很脆弱,所以基本的安防工作,我们必须要了解,今天带领了解SQL注入 所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令. 通过一下的例子更形象的了解SQL注入: 有一个Login画面,在这个Login画面上有两个文本框分别用来输入用户名和密码,当用户点了登录按钮的时候,会对输入的用户名和密码进行验证.验证的SQL语句如下:       select * from student w

通用的关于sql注入的绕过技巧(利用mysql的特性)

1 直接上语法   2 select * from users where id=8E0union select 1,2,3,4,5,6,7,8,9,0  3 select * from users where id=8.0union select 1,2,3,4,5,6,7,8,9,0  4 select * from users where id=\Nunion select 1,2,3,4,5,6,7,8,9,0  5 因为一般waf在防御的时候会识别union等关键词的单词边界,但是这个

java程序中sql注入分析及优化方案

先来看看百度百科的解释: 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句.比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到sql注入攻击. 1.java程序

转:PHP中防止SQL注入的方法

[一.在服务器端配置] 安全,PHP代码编写是一方面,PHP的配置更是非常关键. 我们php手手工安装的,php的默认配置文件在 /usr/local/apache2/conf/php.ini,我们最主要就是要配置php.ini中的内容,让我们执行 php能够更安全.整个PHP中的安全设置主要是为了防止phpshell和SQL Injection的攻击,一下我们慢慢探讨.我们先使用任何编辑工具打开 /etc/local/apache2/conf/php.ini,如果你是采用其他方式安装,配置文件

如何防止网站被SQL注入攻击之java网站安全部署

SQL注入攻击(SQL injection)是目前网站安全以及服务器安全层面上是最具有攻击性,危害性较高,被黑客利用最多的一个漏洞,基本上针对于网站代码,包括JAVA JSP PHP ASP apache tomcat 语言开发的代码都会存在sql注入漏洞.   随着JAVA JSP架构的市场份额越来越多,许多平台都使用JAVA开发,本文通过对sql注入的详细分析,从代码层面以及服务器层面,根本上来防止sql注入攻击.   SQL注入漏洞的原理很简单,通俗来讲:就是程序员在编写网站代码的时候,一

sql 注入 与解决

package cn.itcast.jdbc; import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement; import com.mysql.jdbc.PreparedStatement; public class SqlInject { /**     * @param args     * @throws SQLException   

Oracle数据库SQL注入浅析与防护建议

作者:安华金和 思成 SQL注入是在信息安全领域一种常见的攻击手段.但是大部分人理解的SQL注入就是通过把SQL命令插入到Web表单提交或在输入域名.页面请求时加入的查询字符串,最终达到欺骗服务器执行偏离预期的SQL命令.这种情况下的SQL注入,引发原因基本是网页对用户输入的信息缺乏校验而导致. 很多人认为只有网页才可以进行 SQL 注入,才有注入点.这是一个普遍对SQL 注入的错误认识.SQL注入严格来讲应该叫做数据库SQL注入.SQL注入的最终目的是获取数据库中存储的敏感信息.事实上,任何可