sql注入

防止sql注入:替换危险字符

ぃ、小莉子 提交于 2020-03-19 17:22:52
在用户名或者密码框中输入“11‘ or ’1‘ = '1”时,生成的sql语句将为“selec * from userInfo where name = '11' or '1' = '1' and pwd = '11' or '1' = '1'”;该语句永远为真。为了防止sql语句的注入,提高程序的安全性。需要替换危险字符。 Java代码段: public class Checkstr { public String dostring(String str){ str=str.replaceAll(";",""); str=str.replaceAll("&","&amp;"); str=str.replaceAll("<","&lt;"); str=str.replaceAll(">","&gt;"); str=str.replaceAll("'",""); str=str.replaceAll("--",""); str=str.replaceAll("/",""); str=str.replaceAll("%",""); return str; } } 来源: https://www.cnblogs.com/wuyifu/archive/2012/04/26/2471416.html

JDBC

旧巷老猫 提交于 2020-03-19 03:43:26
JDBC 一、JDBC常用接口、类介绍 JDBC提供对独立于数据库统一的API,用以执行SQL命令。API常用的类、接口如下: DriverManager 管理JDBC驱动的服务类,主要通过它获取Connection数据库链接,常用方法如下: public static synchronized Connection getConnection(String url, String user, String password) throws Exception; 该方法获得url对应的数据库的连接。 Connection 常用数据库操作方法: Statement createStatement throws SQLException: 该方法返回一个Statement对象。 PreparedStatement prepareStatement(String sql) throws SQLException;该方法返回预编译的Statement对象, 即将SQL语句提交到数据库进行预编译。 CallableStatement prepareCall(String sql) throws SQLException:该方法返回CallableStatement对象, 该对象用于存储过程的调用。 上面的三个方法都是返回执行SQL语句的Statement对象

JDBC常用接口、类介绍

故事扮演 提交于 2020-03-19 03:36:04
JDBC常用接口、类介绍 JDBC提供对独立于数据库统一的API,用以执行SQL命令。API常用的类、接口如下: DriverManager 管理JDBC驱动的服务类,主要通过它获取Connection数据库链接,常用方法如下: public static synchronized Connection getConnection(String url, String user, String password) throws Exception; 该方法获得url对应的数据库的连接。 Connection 常用数据库操作方法: Statement createStatement throws SQLException: 该方法返回一个Statement对象。 PreparedStatement prepareStatement(String sql) throws SQLException;该方法返回预编译的Statement对象, 即将SQL语句提交到数据库进行预编译。 CallableStatement prepareCall(String sql) throws SQLException:该方法返回CallableStatement对象, 该对象用于存储过程的调用。 上面的三个方法都是返回执行SQL语句的Statement对象,PreparedStatement

sql语句应考虑哪些安全性?

人走茶凉 提交于 2020-03-18 08:02:58
简述项目中优化sql语句执行效率的方法,从哪些方面,sql语句性能如何分析? (1)尽量选择较小的列; (2)将where中用的比较频繁的字段建立索引; (3)select中避免使用*; (4)避免在索引列上使用计算、not in和<>等操作; (5)当只需要一行数据时候使用limit1; (6)保证单表数据不超过200w,实时分割表; 针对查询较慢的语句,可以使用explain来分析该语句具体的执行情况。 sql语句应考虑哪些安全性? (1)少使用root账户,应该为不同的动作分配不同的账户; (2)sql执行出错后,不能把数据库中显示的出错信息,直接展示给用户。防止泄露服务器和数据库相关信息; (3)防止sql注入,对特殊字符进行转义、过滤或者使用预编译的sql语句绑定变量 接下来重点说下Mysql半同步复制, 从MySQL5.5开始,MySQL以插件的形式支持半同步复制 。先来区别下mysql几个同步模式概念: 异步复制(Asynchronous replication) MySQL默认的复制即是异步的,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理,这样就会有一个问题,主如果crash掉了,此时主上已经提交的事务可能并没有传到从上,如果此时,强行将从提升为主,可能导致新主上的数据不完整。 全同步复制(Fully synchronous

Python pymysql模块

谁说胖子不能爱 提交于 2020-03-18 06:59:52
pymysql模块 1.什么是pymysql:PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使用mysqldb。 2.pymysql模块是第三方的需要自己安装: # 1.安装:pip3 insatll pymysql 安装pynysql库 3.基本语法使用 # 导入pymysql模块 import pymysql # 连接到数据库 conn = pymysql.connect( host = '127.0.0.1', # 数据库ip地址 port = 3306, # 数据库端口号 user = 'root', # 用户名 password = '123', # 密码 database = 'day38', # 数据库 charset = 'utf8', # 编码千万不要加- 如果写成了utf-8会直接报错 autocommit = True # 这个参数配置完成后 增删改操作都不需要在手动加conn.commit()了 ) # 产生游标对象 cursor = conn.cursor(pymysql.cursors.DictCursor) # 产生一个游标对象 每行数据 以字典的形式或列表套元组展现 键是表的字段名 值是表的字段值,不设置查询结果解释元组或元组套元组 # sql语句拼接 sql = sql语句 # 例:#

Java之JDBC

▼魔方 西西 提交于 2020-03-18 05:36:50
JDBC的全称为:Java DataBase Connectivity(Java数据库连接)。 是一种执行SQL语句的Java API,可以为多种关系型数据库提供统一的访问。 1.JDBC的API (1)JDBC入门 package com.imooc.jdbc.demo1; import com.mysql.cj.jdbc.Driver; import java.sql.*; public class JDBCDemo1 { public void demo1() throws SQLException { //这里需要接受异常 //1.加载驱动 DriverManager.registerDriver(new Driver()); //2.获取连接 Connection conn = DriverManager.getConnection("jdbc:mysql://18.0.51.10:3306/jdbctest","root","123456"); //3.创建执行SQL语句的对象 String sql = "select * from user"; Statement stmt = conn.createStatement(); //4.执行sql语句 ResultSet resultSet = stmt.executeQuery(sql); while

mybatis是如何防止SQL注入的

坚强是说给别人听的谎言 提交于 2020-03-17 11:05:41
SQL注入是一种很简单的攻击手段,但直到今天仍然十分常见。究其原因不外乎:No patch for stupid。为什么这么说,下面就以JAVA为例进行说明: 假设数据库中存在这样的表: table user( id varchar(20) PRIMARY KEY , name varchar(20) , age varchar(20) ); 然后使用JDBC操作表: private String getNameByUserId(String userId) { Connection conn = getConn();//获得连接 String sql = "select name from user where id=" + userId; PreparedStatement pstmt = conn.prepareStatement(sql); ResultSet rs=pstmt.executeUpdate(); ...... } 上面的代码经常被一些开发人员使用。想象这样的情况,当传入的userId参数为"3;drop table user;"时,执行的sql语句如下: select name from user where id=3; drop table user; 数据库在编译执行之后,删除了user表。瞧,一个简单的SQL注入攻击生效了!之所以这样

mybatis是如何防止SQL注入的

青春壹個敷衍的年華 提交于 2020-03-17 10:02:04
SQL注入是一种很简单的攻击手段,但直到今天仍然十分常见。究其原因不外乎:No patch for stupid。为什么这么说,下面就以JAVA为例进行说明: 假设数据库中存在这样的表: table user( id varchar(20) PRIMARY KEY , name varchar(20) , age varchar(20) ); 然后使用JDBC操作表: private String getNameByUserId(String userId) { Connection conn = getConn();//获得连接 String sql = "select name from user where id=" + userId; PreparedStatement pstmt = conn.prepareStatement(sql); ResultSet rs=pstmt.executeUpdate(); ...... } 上面的代码经常被一些开发人员使用。想象这样的情况,当传入的userId参数为"3;drop table user;"时,执行的sql语句如下: select name from user where id=3; drop table user; 数据库在编译执行之后,删除了user表。瞧,一个简单的SQL注入攻击生效了!之所以这样

MyBatis 的 DAO 接口跟 XML 文件里面的 SQL 是如何建立关系的

与世无争的帅哥 提交于 2020-03-16 12:49:22
MyBatis 会先 解析这些 XML 文件 ,通过 XML 文件里面的 命名空间 (namespace)跟 DAO 建立关系 ;然后 XML 中的每段 SQL 会有一个id 跟 DAO 中的接口进行关联。 首先我们要知道每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为中心的, SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。 但 SqlSessionFactory 是一个接口,它里面其实就两个方法: openSession 、 getConfiguration 其中, openSession 方法是为了获取一个 SqlSession 对象,完成必要数据库增删改查功能。但是, SqlSessionFactory 属性太少了,所以需要 getConfiguration 的配合;来配置 mapper 映射文件、SQL 参数、返回值类型、缓存等属性。 /** * Creates an {@link SqlSession} out of a connection or a DataSource * * @author Clinton Begin */ public interface SqlSessionFactory { SqlSession openSession();

【转】适用于WebApi的SQL注入过滤器

梦想与她 提交于 2020-03-15 11:31:31
原地址:https://www.cnblogs.com/yechangzhong-826217795/p/10450581.html 开发工具:Visual Studio 2017 C#版本:C#7.1 最有效的防止SQL注入的方式是调用数据库时使用参数化查询。 但是如果是接手一个旧的WebApi项目,不想改繁多的数据库访问层的代码,应该如何做。 我的解决方案是加一个过滤器。 先写过滤方法,上代码 using System; using System.Collections.Generic; using System.Web; namespace Test { /// <summary> /// 防止SQL注入 /// </summary> public class AntiSqlInject { public static AntiSqlInject Instance = new AntiSqlInject(); /// <summary> /// 初始化过滤方法 /// </summary> static AntiSqlInject() { SqlKeywordsArray.AddRange(SqlSeparatKeywords.Split('|')); SqlKeywordsArray.AddRange(Array.ConvertAll(SqlCommandKeywords