MySQL-SQL注入,导入,导出
一、MySQL 及 SQL 注入
SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令
以下实例中,输入的用户名必须为字母、数字及下划线的组合,且用户名长度为 8 到 20 个字符之间
if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches)){$result = mysqli_query($conn, "SELECT * FROM users WHERE username=$matches[0]");
} else {echo "username 输入异常";
}
在没有过滤特殊字符时,出现的SQL情况:
// 设定$name 中插入了我们不需要的SQL语句
$name = "Qadir'; DELETE FROM users;";mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}'");
以上的注入语句中,我们没有对 $name 的变量进行过滤,$name 中插入了我们不需要的SQL语句,将删除 users 表中的所有数据。
在PHP中的 mysqli_query() 是不允许执行多个 SQL 语句的,但是在 SQLite 和 PostgreSQL 是可以同时执行多条SQL语句的,所以我们对这些用户的数据需要进行严格的验证。
防止SQL注入,我们需要注意以下几个要点:
1、永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和 双"-"进行转换等。
2、永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。
3、永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
4、不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。
5、应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装
6、sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全平台检测工具。MDCSOFT SCAN等。采用MDCSOFT-IPS可以有效的防御SQL注入,XSS攻击等。
1、防止SQL注入
在脚本语言,如Perl和PHP可以对用户输入的数据进行转义从而来防止SQL注入。
PHP的MySQL扩展提供了mysqli_real_escape_string()函数来转义特殊的输入字符。
if (get_magic_quotes_gpc())
{$name = stripslashes($name);
}
$name = mysqli_real_escape_string($conn, $name);mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}'");
2、Like语句中的注入
like查询时,如果用户输入的值有"_"和"%",则会出现这种情况:用户本来只是想查询"abcd_",查询结果中却有"abcd_"、"abcde"、"abcdf"等等;用户要查询"30%"(注:百分之三十)时也会出现问题。
在PHP脚本中我们可以使用addcslashes()函数来处理以上情况,如下实例:
$sub = addcslashes(mysqli_real_escape_string($conn, "%something_"), "%_");
// $sub == \%something\_mysqli_query($conn, "SELECT * FROM messages WHERE subject LIKE '{$sub}%'");
addcslashes() 函数在指定的字符前添加反斜杠。
语法格式:
addcslashes(string,characters)
参数 | 描述 |
---|---|
string | 必需。规定要检查的字符串。 |
characters | 可选。规定受 addcslashes() 影响的字符或字符范围。 |
二、MySQL 导出数据
1、使用 SELECT ... INTO OUTFILE 语句导出数据
(1)将数据表 MyDB_user 数据导出到 /tmp/mydb_user.txt 文件中
SELECT * FROM MyDB_userINTO OUTFILE '/tmp/mydb_user.txt';
(2)可以通过命令选项来设置数据输出的指定格式,以下实例为导出 CSV 格式:
SELECT * FROM user INTO OUTFILE '/tmp/user.txt'FIELDS TERMINATED BY ',' ENCLOSED BY '"'LINES TERMINATED BY '\r\n';
(3)生成一个文件,各值用逗号隔开。这种格式可以被许多程序使用
SELECT a,b,a+b INTO OUTFILE '/tmp/result.text'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM test_table;
SELECT ... INTO OUTFILE 语句有以下属性:
(1)LOAD DATA INFILE是SELECT ... INTO OUTFILE的逆操作,SELECT句法。为了将一个数据库的数据写入一个文件,使用SELECT ... INTO OUTFILE,为了将文件读回数据库,使用LOAD DATA INFILE。
(2)SELECT...INTO OUTFILE 'file_name'形式的SELECT可以把被选择的行写入一个文件中。该文件被创建到服务器主机上,因此您必须拥有FILE权限,才能使用此语法。
(3)输出不能是一个已存在的文件。防止文件数据被篡改。
(4)需要有一个登陆服务器的账号来检索文件。否则 SELECT ... INTO OUTFILE 不会起任何作用
(5)在UNIX中,该文件被创建后是可读的,权限由MySQL服务器所拥有。这意味着,虽然你就可以读取该文件,但可能无法将其删除
2、导出表作为原始数据
mysqldump 是 mysql 用于转存储数据库的实用程序。它主要产生一个 SQL 脚本,其中包含从头重新创建数据库所必需的命令 CREATE TABLE INSERT 等。
使用 mysqldump 导出数据需要使用 --tab 选项来指定导出文件指定的目录,该目标必须是可写的。
以下实例将数据表 runoob_tbl 导出到 /tmp 目录中:
$ mysqldump -u root -p --no-create-info \--tab=/tmp RUNOOB runoob_tbl
password ******
3、导出 SQL 格式的数据
导出 SQL 格式的数据到指定文件,如下所示:
$ mysqldump -u root -p RUNOOB runoob_tbl > dump.txt
password ******
以上命令创建的文件内容如下:
-- MySQL dump 8.23
--
-- Host: localhost Database: RUNOOB
---------------------------------------------------------
-- Server version 3.23.58--
-- Table structure for table `runoob_tbl`
--CREATE TABLE runoob_tbl (runoob_id int(11) NOT NULL auto_increment,runoob_title varchar(100) NOT NULL default '',runoob_author varchar(40) NOT NULL default '',submission_date date default NULL,PRIMARY KEY (runoob_id),UNIQUE KEY AUTHOR_INDEX (runoob_author)
) TYPE=MyISAM;--
-- Dumping data for table `runoob_tbl`
--INSERT INTO runoob_tbl VALUES (1,'Learn PHP','John Poul','2007-05-24');
INSERT INTO runoob_tbl VALUES (2,'Learn MySQL','Abdul S','2007-05-24');
INSERT INTO runoob_tbl VALUES (3,'JAVA Tutorial','Sanjay','2007-05-06');
如果需要导出整个数据库的数据,可以使用以下命令:
$ mysqldump -u root -p RUNOOB > database_dump.txt
password ******
如果需要备份所有数据库,可以使用以下命令:
$ mysqldump -u root -p --all-databases > database_dump.txt
password ******
--all-databases 选项在 MySQL 3.23.12 及以后版本加入。
该方法可用于实现数据库的备份策略。
4、将数据表及数据库拷贝至其他主机
如果需要将数据拷贝至其他的 MySQL 服务器上, 你可以在 mysqldump 命令中指定数据库名及数据表。
在源主机上执行以下命令,将数据备份至 dump.txt 文件中:
$ mysqldump -u root -p database_name table_name > dump.txt
password *****
如果完整备份数据库,则无需使用特定的表名称。
如果需要将备份的数据库导入到MySQL服务器中,可以使用以下命令,使用以下命令需要确认数据库已经创建:
$ mysql -u root -p database_name < dump.txt
password *****
也可以使用以下命令将导出的数据直接导入到远程的服务器上,但请确保两台服务器是相通的,是可以相互访问的:
$ mysqldump -u root -p database_name \| mysql -h other-host.com database_name
以上命令中使用了管道来将导出的数据导入到指定的远程主机上
三、MySQL 导入数据
1、mysql 命令导入
使用 mysql 命令导入语法格式为:
mysql -u用户名 -p密码 < 要导入的数据库数据(runoob.sql)
实例:
# mysql -uroot -p123456 < runoob.sql
以上命令将将备份的整个数据库 runoob.sql 导入。
2、source 命令导入
source 命令导入数据库需要先登录到数库终端:
mysql> create database abc; # 创建数据库
mysql> use abc; # 使用已创建的数据库
mysql> set names utf8; # 设置编码
mysql> source /home/abc/abc.sql # 导入备份数据库
3、使用 LOAD DATA 导入数据
MySQL 中提供了LOAD DATA INFILE语句来插入数据。 以下实例中将从当前目录中读取文件 dump.txt ,将该文件中的数据插入到当前数据库的 mytbl 表中。
mysql> LOAD DATA LOCAL INFILE 'dump.txt' INTO TABLE mytbl;
如果指定LOCAL关键词,则表明从客户主机上按路径读取文件。如果没有指定,则文件在服务器上按路径读取文件。
你能明确地在LOAD DATA语句中指出列值的分隔符和行尾标记,但是默认标记是定位符和换行符。
两个命令的 FIELDS 和 LINES 子句的语法是一样的。两个子句都是可选的,但是如果两个同时被指定,FIELDS 子句必须出现在 LINES 子句之前。
如果用户指定一个 FIELDS 子句,它的子句 (TERMINATED BY、[OPTIONALLY] ENCLOSED BY 和 ESCAPED BY) 也是可选的,不过,用户必须至少指定它们中的一个。
mysql> LOAD DATA LOCAL INFILE 'dump.txt' INTO TABLE mytbl-> FIELDS TERMINATED BY ':'-> LINES TERMINATED BY '\r\n';
LOAD DATA 默认情况下是按照数据文件中列的顺序插入数据的,如果数据文件中的列与插入表中的列不一致,则需要指定列的顺序。
如,在数据文件中的列顺序是 a,b,c,但在插入表的列顺序为b,c,a,则数据导入语法如下:
mysql> LOAD DATA LOCAL INFILE 'dump.txt' -> INTO TABLE mytbl (b, c, a);
4、使用 mysqlimport 导入数据
mysqlimport 客户端提供了 LOAD DATA INFILEQL 语句的一个命令行接口。mysqlimport 的大多数选项直接对应 LOAD DATA INFILE 子句。
从文件 dump.txt 中将数据导入到 mytbl 数据表中, 可以使用以下命令:
$ mysqlimport -u root -p --local mytbl dump.txt
password *****
mysqlimport 命令可以指定选项来设置指定格式,命令语句格式如下:
$ mysqlimport -u root -p --local --fields-terminated-by=":" \--lines-terminated-by="\r\n" mytbl dump.txt
password *****
mysqlimport 语句中使用 --columns 选项来设置列的顺序:
$ mysqlimport -u root -p --local --columns=b,c,a \mytbl dump.txt
password *****
mysqlimport的常用选项介绍
选项 | 功能 |
---|---|
-d or --delete | 新数据导入数据表中之前删除数据数据表中的所有信息 |
-f or --force | 不管是否遇到错误,mysqlimport将强制继续插入数据 |
-i or --ignore | mysqlimport跳过或者忽略那些有相同唯一 关键字的行, 导入文件中的数据将被忽略。 |
-l or -lock-tables | 数据被插入之前锁住表,这样就防止了, 你在更新数据库时,用户的查询和更新受到影响。 |
-r or -replace | 这个选项与-i选项的作用相反;此选项将替代 表中有相同唯一关键字的记录。 |
--fields-enclosed- by= char | 指定文本文件中数据的记录时以什么括起的, 很多情况下 数据以双引号括起。 默认的情况下数据是没有被字符括起的。 |
--fields-terminated- by=char | 指定各个数据的值之间的分隔符,在句号分隔的文件中, 分隔符是句号。您可以用此选项指定数据之间的分隔符。 默认的分隔符是跳格符(Tab) |
--lines-terminated- by=str | 此选项指定文本文件中行与行之间数据的分隔字符串 或者字符。 默认的情况下mysqlimport以newline为行分隔符。 您可以选择用一个字符串来替代一个单个的字符: 一个新行或者一个回车。 |
mysqlimport 命令常用的选项还有 -v 显示版本(version), -p 提示输入密码(password)等
MySQL-SQL注入,导入,导出相关推荐
- docker导入MySQL文件_Docker容器中Mysql数据的导入/导出详解
前言 Mysql数据的导入导出我们都知道一个mysqldump命令就能够解决,但如果是运行在docker环境下的mysql呢? 解决办法其实还是用mysqldump命令,但是我们需要进入docker的 ...
- 如何在 MySQL / MariaDB 中导入导出数据,导入导出数据库文件、Excel、CSV
文章目录 本教程将详细讲解 1. MySQL / MariaDB 数据库数据「导出」 2. MySQL / MariaDB 数据库数据「导入」 3. 使用「卡拉云」一键导入导出 MySQL / Mar ...
- SQL语句导入导出大全
SQL语句导入导出大全 /******* 导出到excel EXEC master..xp_cmdshell ''bcp SettleDB.dbo.shanghu out c:\temp1.xls - ...
- perl导入文本至mysql_Perl 脚本实现MySQL 异机导入导出-阿里云开发者社区
单位的开发同事需要将一个mysql 中的库导入到本地mysql中 所以为了减少手工操作,就写了下面的一个用perl 实现的 mysql 异机导入导出脚本:如下 #!/usr/bin/perl -w ...
- MySQL数据库中导入导出方法以及工具介绍
MySQL数据库中导入导出方法以及工具介绍 1.MySQLimport的语法介绍: mysqlimport位于mysql/bin目录中,是mysql的一个载入(或者说导入)数据的一个非常有效的工具.这 ...
- SQL数据导入导出语句大全[英文部分比较全面]
简介:微软SQL Server数据库SQL语句导入导出大全,包括与其他数据库和文件的数据的导入导出. /******* 导出到excel EXEC master..xp_cmdshell 'bcp ...
- 数据库导入语句linux,数据库应用-SQL语句导入导出大全
数据库应用-SQL语句导入导出大全 发布时间:2006-06-03 09:59:43来源:红联作者:yo /******* 导出到excel EXEC master..xp_cmdshell 'bcp ...
- mysql sql注入工具_SQL注入工具实践
程序简介 超级SQL注入工具(SSQLInjection)是一款基于HTTP协议自组包的SQL注入工具,支持出现在HTTP协议任意位置的SQL注入,支持各种类型的SQL注入,支持HTTPS模式注入. ...
- 关于mysql字符集及导入导出
MySQL字符集设置 • 系统变量: – character_set_server:默认的内部操作字符集 – character_set_client:客户端来源数据使用的字符集 – characte ...
- concat mysql sql注入_sql注入-mysql注入基础及常用注入语句
最近在教学中,关于SQL注入,总发现学生理解起来有些难度,其实主要的原因是对各类数据库以及SQL语句不熟悉,今天先介绍mysql注入需要掌握的基础, Mysql内置information_schema ...
最新文章
- 聂聪:数据科学让我为城市规划注入创新价值 | 优秀毕业生专访
- Python Module_pdb_DEBUG 方法
- 使用auditd监控Linux的文件变化
- Linux学习之CentOS(三十六)--FTP服务原理及vsfptd的安装、配置
- resharper license server
- 魅族15系统是android,魅族15系列评测:性能够用王者荣耀优化
- 十年 | 在Java开发做了10年后,才学会此绝招,用于颠覆Java应用
- python3+arcface2.0 离线人脸识别 demo
- Dephi 的接口与回调 :ZT
- 在Windows mobile 5.0下操作INI文件
- win11无法下载steam怎么办 Windows11无法下载steam的解决教程
- BZOJ 2734: [HNOI2012]集合选数( 状压dp )
- JavaMail的使用
- 批量将PNG格式转化为JPG格式
- NUC980 PWM
- pythoninput算出bmi_python菜鸡——BMI计算
- Unity分屏显示效果
- Gitlab本地备份与远程机备份
- GPRS网络几种数据中心的接入方式
- Robot Framework 数据库连接和使用
热门文章
- BlueTooth: 无线技术之争谁将胜出 WiFi、蓝牙还是NFC?
- matlab nlm,NLM.m · hr_yang/MatlabCode - Gitee.com
- 中国科学院大学计算机考研好考吗,中国科学院大学考研难吗?一般要什么水平才可以进入?...
- 【熊猫TV】《程序员》:聚光灯下的熊猫TV技术架构演进
- 京东网站顶部导航条 (练习) HTML+CSS
- 蓝桥2——Beaver's Calculator
- Datawhale优秀学习者4月名单!
- 相关关系与因果关系之探讨——大数据时代读后感(1)
- LRC歌词原理和实现高仿Android网易云音乐
- 联想thinkpad E450如何进入bios