接下来我们连续学习MYSQL的内容:

MySQL 及 SQL 注入

如果您通过网页获取用户输入的数据并将其插入一个MySQL数据库,那么就有可能发生SQL注入安全的问题。

我们大略解释如何防止SQL注入,并通过脚本来过滤SQL中注入的字符。

phpmysql转义数据库简略应用语句十四最后一堂MySQL Webpack

所谓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攻击等。

防止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}'\"大众);

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 导出数据

MySQL中你可以利用SELECT...INTO OUTFILE语句来大略的导出数据到文本文件上。

利用 SELECT ... INTO OUTFILE 语句导出数据

以下实例中我们将数据表 jrtt_table 数据导出到D:\jrtt_table.txt文件中:

select from jrtt_table

into outfile 'D:\jrtt_table.txt';

实行完上面的命令,就可以在d盘中找到我们导出的数据了

如下天生一个文件,各值用逗号隔开。
这种格式可以被许多程序利用。

SELECT FROM jrtt_table INTO OUTFILE '/tmp/tutorials.txt'

character set gbk

FIELDS TERMINATED BY ',' ENCLOSED BY '\"大众'

LINES TERMINATED BY '\r\n';

SELECT ... INTO OUTFILE 语句有以下属性:

LOAD DATA INFILE是SELECT ... INTO OUTFILE的逆操作,SELECT句法。
为了将一个数据库的数据写入一个文件,利用SELECT ... INTO OUTFILE,为了将文件读回数据库,利用LOAD DATA INFILE。

SELECT...INTO OUTFILE 'file_name'形式的SELECT可以把当选择的行写入一个文件中。
该文件被创建到做事器主机上,因此您必须拥有FILE权限,才能利用此语法。

输出不能是一个已存在的文件。
防止文件数据被修改。

你须要有一个上岸做事器的账号来检索文件。
否则 SELECT ... INTO OUTFILE 不会起任何浸染。

在UNIX中,该文件被创建后是可读的,权限由MySQL做事器所拥有。
这意味着,虽然你就可以读取该文件,但可能无法将其删除。

导出表作为原始数据

mysqldump是mysql用于转存储数据库的实用程序。
它紧张产生一个SQL脚本,个中包含从头重新创建数据库所必需的命令CREATE TABLE INSERT等。

利用mysqldump导出数据须要利用 --tab 选项来指定导出文件指定的目录,该目标必须是可写的。

以下实例将数据表 runoob_tbl 导出到 /tmp 目录中:

mysqldump -uroot -p123456 --no-create-info --tab=d:\ jrttdb jrtt_table

导出SQL格式的数据

导出SQL格式的数据到指定文件,如下所示:

mysqldump -uroot -p123456 jrttdb jrtt_table > d:\jrtt_table_data.txt

打开天生的内容如下:

如果你须要导出全体数据库的数据,可以利用以下命令:

$ 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 及往后版本加入。

该方法可用于实现数据库的备份策略。

将数据表及数据库拷贝至其他主机

如果你须要将数据拷贝至其他的 MySQL 做事器上, 你可以在 mysqldump 命令中指天命据库名及数据表。

在源主机上实行以下命令,将数据备份至 dump.txt 文件中:

$ mysqldump -u root -p database_name table_name > dump.txtpassword

如果完全备份数据库,则无需利用特定的表名称。

如果你须要将备份的数据库导入到MySQL做事器中,可以利用以下命令,利用以下命令你须要确认数据库已经创建:

$ mysql -u root -p database_name < dump.txt

password

你也可以利用以下命令将导出的数据直接导入到远程的做事器上,但请确保两台做事器是相通的,是可以相互访问的:</p>

$ mysqldump -u root -p database_name \

| mysql -h other-host.com database_name

以上命令中利用了管道来将导出的数据导入到指定的远程主机上。

MySQL 导入数据

MySQL中可以利用两种大略的办法来导入MySQL导出的数据。

利用 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);

利用 mysqlimport 导入数据

mysqlimport客户端供应了LOAD DATA INFILEQL语句的一个命令行接口。
mysqlimport的大多数选项直接对应LOAD DATA INFILE子句。

从文件 dump.txt 中将数据导入到 mytbl 数据表中, 可以利用以下命令:

$ mysqlimport -u root -p --local database_name dump.txt

password

mysqlimport命令可以指定选项来设置指定格式,命令语句格式如下:

$ mysqlimport -u root -p --local --fields-terminated-by=\"大众:\"大众 \

--lines-terminated-by=\"大众\r\n\公众 database_name dump.txt

password

mysqlimport 语句中利用 --columns 选项来设置列的顺序:

$ mysqlimport -u root -p --local --columns=b,c,a \

database_name dump.txt

password

mysqlimport的常用选项先容

选项功能-d or --delete新数据导入数据表中之前删除数据数据表中的所有信息-f or --force不管是否碰着缺点,mysqlimport将逼迫连续插入数据-i or --ignoremysqlimport跳过或者忽略那些有相同唯一 关键字的行, 导入文件中的数据将被忽略。
-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)等。

2017.12.29

头条新手:不懂世事的庸人

2018年连续更新其他技能学习的内容,喜好就关注我吧。