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注入攻击生效了!之所以这样

SQL防注入攻击和SqlHelper类的完善

走远了吗. 提交于 2020-03-13 03:00:43
-----------------------------------SQL防注入攻击 此处的方法全带有参数集合的原因是SQL防注入攻击(注入攻击是用户登录的时候 用户名:随机文字+ ‘ or 1=1 --’ 就可以直接强登,添加SqlParameter以后可以避免该类问题) 此处通过C#监视可以看到该文本框里面的数据整体都被当作一个字符串 此处通过SQL事务监视查看 ---数据库连接语写在App.Config配置文件中 来源: https://www.cnblogs.com/Kai-YoungMaster/p/12484018.html

Oracle存储过程

无人久伴 提交于 2020-03-12 04:01:25
文章目录 一、存储过程的概念 二、存储过程的创建、调用和权限 1、创建存储过程 2、存储过程的调用 3、存储过程的权限 三、删除存储过程 四、PL/SQL语言 五、应用经验 1、存储过程的优点 2、存储过程的缺点 3、我的看法 六、Oracle的包 七、版权声明 一、存储过程的概念 存储过程(stored procedure)是Oracle数据库中为了完成某功能的PL/SQL代码集,就像没有返回值的自定义函数。 二、存储过程的创建、调用和权限 1、创建存储过程 create or replace procedure 存储过程名 ( 参数 1 模式 数据类型 , . . . . . . ) as / is -- 定义局部变量 变量 1 数据类型 ; . . . . . . begin -- 实现存储过程功能的PL / SQL代码。 . . . . . . exception -- 异常处理的PL / SQL代码。 . . . . . . end ; / 1)参数的模式有三种: in :只读模式,在函数中,参数只能被引用/读取,不能改变它的值。 out :只写模式,参数只能被赋值,不能被引用/读取。 in out :可读可写。 参数的模式可以不写,缺省为in,out和in out两种模式极少使用。 2)as/is二选一,在这里没有区别。 3)可以不定义局部变量。 4)可以没有异常

JDBC的常用方法

一曲冷凌霜 提交于 2020-03-11 17:12:17
在上一篇文章我们讲了一些基本使用 JDBC-DBCP-MYBATIS 。 1.防止SQL注入 我们在写sql语句时,为了方便可能会进行拼接字符串,这样做的弊端就是可能被sql注入攻击,解决的办法也很简单。 //获取数据库连接 Connection connection = DBUtils.getConnection(); //在写sql语句时,使用?代替变量 String sql = "select * from user where username=? and password=?"; //使用预编译对象进行预编译,就不使用原始的Statement对象 PreparedStatement preparedStatement = connection.prepareStatement(sql); //预编译后进行?的替换 preparedStatement.setString(1,"csdn"); preparedStatement.setString(2,"csdn123"); ResultSet resultSet = preparedStatement.executeQuery(); while(resultSet.next()){ System.out.println(resultSet.getString(1)); } 2.SQL批量操作

SQL注入详解

↘锁芯ラ 提交于 2020-03-11 17:02:08
今天跟大家分享SQL注入的知识。 前言 先来看一副很有意思的漫画: 相信大家对于学校们糟糕的网络环境和运维手段都早有体会,在此就不多做吐槽了。今天我们来聊一聊SQL注入相关的内容。 1 何谓SQL注入? SQL注入是一种非常常见的数据库攻击手段,SQL注入漏洞也是网络世界中最普遍的漏洞之一。大家也许都听过某某学长通过攻击学校数据库修改自己成绩的事情,这些学长们一般用的就是SQL注入方法。 SQL注入其实就是恶意用户通过在表单中填写包含SQL关键字的数据来使数据库执行非常规代码的过程。简单来说,就是数据「越俎代庖」做了代码才能干的事情。 这个问题的来源是,SQL数据库的操作是通过SQL语句来执行的,而无论是执行代码还是数据项都必须写在SQL语句之中,这就导致如果我们在数据项中加入了某些SQL语句关键字(比如说SELECT、DROP等等),这些关键字就很可能在数据库写入或读取数据时得到执行。 多言无益,我们拿真实的案例来说话。下面我们先使用SQLite建立一个学生档案表。 SQL数据库操作示例: import sqlite3 连接数据库: conn = sqlite3 . connect ( 'test.db' ) 建立新的数据表: conn . executescript ( '' 'DROP TABLE IF EXISTS students ; CREATE TABLE

基于约束条件的SQL攻击

隐身守侯 提交于 2020-03-09 07:24:37
一、背景 今天看了一篇 基于约束条件的SQL攻击 的文章,感觉非常不错,但亲自实践后又发现了很多问题,虽然利用起来有一定要求,不过作者的思想还是很值得学习的。原文中的主旨思想是利用数据库对空格符的特殊处理方式来达到水平越权的目的。以下内容以MySQL为例,其它数据库可能也存在这个问题(文章作者实验了MySQL和SQLite),我也在MySQL上复现了这个问题。 二、知识点 数据库字符串比较 :在数据库对字符串进行比较时,如果两个字符串的长度不一样,则会将较短的字符串末尾填充空格,使两个字符串的长度一致,比如,字符串A:[String]和字符串B:[String2]进行比较时,由于String2比String多了一个字符串,这时MySQL会将字符串A填充为[String ],即在原来字符串后面加了一个空格,使两个字符串长度一致。看如下两条查询语句: select * from users where username='Dumb' select * from users where username='Dumb ' 它们的查询结果是一致的,即第二条查询语句中Dumb后面的空格并没有对查询有任何影响。因为在MySQL把查询语句里的username和数据库里的username值进行比较时,它们就是一个字符串的比较操作,符合上述特征。 INSERT截断 :这是数据库的另一个特性

一种获取用户信息的sql攻击

无人久伴 提交于 2020-03-09 05:50:05
本文不是写SQL注入攻击,除了SQL注入攻击之外,还有一种SQL数据库的漏洞。写本文的目的主要是让开发者在构建网站时,能意思到这个安全问题。这个漏洞并不是太常见,我将为展示这种攻击手法,希望大家能引以为鉴,及时做好相应的防御措施。 在注册新用户时候,开发者可能会按照以下的逻辑来运行。 首先检查用户名密码: "SELECT * FROM users WHERE username='用户名'" 如果用户名在数据库中不存在,执行以下SQL语句 INSERT INTO users(username, password) VALUES ('用户名','密码')" 以下是验证用户的登录信息: "SELECT username FROM users WHERE username='用户名' AND password='密码' "; 按理说这并不存在安全问题。应该是不会出错了。 但是,事实并不是想的那样。攻击者仍然可以用任意用户的身份登录系统。 在进行攻击之前,首先要说一下几个注意点。 在SQL的执行过程中,字符串末尾的空格会被删除掉。比如,一个字符串“riyudeshui” ,其实等同于“ruyudeshui ” ,大部分的情况下是成立的。比如我们使用如下两个SQL语句进行查询: SELECT * FROM users WHERE username='ruyudeshui'; SELECT *

字符约束条件的SQL注入攻击

﹥>﹥吖頭↗ 提交于 2020-03-09 05:44:55
引言 目前值得高兴的是,开发者在建立网站时,已经开始关注安全问题了——几乎每个开发者都知道SQL注入漏洞了。在本文中,我将为读者介绍另一种与SQL数据库相关的漏洞,虽然它的危害性与SQL注入不相上下,但目前却很少为人所知。接下来,我将为读者详细展示这种攻击手法,以及相应的防御策略。 背景知识 最近,我遇到了一段有趣的代码,它尝试尽一切可能来保护数据库的访问安全,例如每当新用户进行注册时,将运行以下代码: <?php // Checking whether a user with the same username exists $username = mysql_real_escape_string($_GET[ 'username']); $ password = mysql_real_escape_string($_GET[ 'password']); $query = " SELECT * FROM users WHERE username= '$username'"; $res = mysql_query($query, $ database); if($res) { if(mysql_num_rows($res) > 0) { // User exists, exit gracefully . . } else { // If not, only then insert

详解SQL注入原理

无人久伴 提交于 2020-03-07 13:37:19
看到有好多人在问:什么是SQL注入?我尝试google后发现,网上只有怎么SQL注入,并没有解释什么是SQL注入。在此我给大家解释一下。 在说明什么是SQL注入前先提下什么是静态页面,什么是动态页面。静态页面是一种实际存在的网页,无需经过服务器的处理,就可以直接加载读取的页面。静态页面一旦制作出来,除非修改源码,否则是无法对页面内的内容进行更改的。而动态页面与静态页面正好相反。动态页面并不是一个实际存在的网页,它的所有数据不是存储于页面上,而是存储于数据库中。只有当用户请求网页的时候,服务器才会从数据库读取数据,从而返回一个网页。所以不同的用户得到的网页内容也可能不同。举个例子,蓝莓's Blog首页就是一个典型的动态页面,不同的浏览器登陆时页面右上角提示内容也会不同,如果你是通过搜索引擎找到我的Blog的,右上角也会显示你所来自于的那个搜索引擎,如果你是直接访问本站,他会提示“您直接访问了本站! 莫非您记住了我的域名.厉害~我倍感荣幸啊 嘿嘿”,在举一个例子,比如你登陆QQ安全中兴,登陆后网页最上边会显示你的帐号,和你的称昵,这个也是一个动态页面。这点是静态页面无法办到的。而这里我们所要讲到的SQL注入就是利用动态页面的这种特性来入侵的。 其实当你打开一个动态页面的时候,就是在向服务器提交信息,服务器会根据你提交的信息,对数据库进行查询,从而返回适合你的信息。我们可以举个例子

SQL注入

自古美人都是妖i 提交于 2020-03-06 08:47:09
SQL注入 SQL 注入即是指 web 应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在 web 应用程序中事先定义好的查询语句添加额外的 SQL 语句,从而实现非法操作,获取数据库数据,服务器提权等,很多机构将 SQL 注入作为第一危险的安全漏洞。 原理 SQL 注入攻击是通过操作输入来修改 SQL 语句,用以达到执行代码对 WEB 服务器进行攻击的方法。简单的说就是在 post/get 表单、输入域名或页面请求的查询字符串中插入 SQL 命令,最终使 web 服务器执行恶意命令的过程。 SQL 注入语句一般都嵌入在普通的 HTTP 请求中,比较难过滤,攻击者可以不断调整攻击的参数,导致 SQL 注入变种极多,而且互联网上有很多 SQL 注入工具,不需要专业知识也能自如运用。 简单实例 首先建立简单表,在 user_info 中写入账号 acc 与密码 pwd , qqq 表用来测试 drop CREATE TABLE ` user_info ` ( ` id ` int ( 11 ) NOT NULL AUTO_INCREMENT , ` account ` varchar ( 20 ) NOT NULL , ` password ` varchar ( 20 ) NOT NULL , PRIMARY KEY ( ` id ` ) ) ENGINE =