接下来我们连续学习MYSQL的内容:
MySQL 及 SQL 注入如果您通过网页获取用户输入的数据并将其插入一个MySQL数据库,那么就有可能发生SQL注入安全的问题。
我们大略解释如何防止SQL注入,并通过脚本来过滤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攻击等。
防止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)
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的常用选项先容
mysqlimport命令常用的选项还有-v 显示版本(version), -p 提示输入密码(password)等。
2017.12.29
头条新手:不懂世事的庸人
2018年连续更新其他技能学习的内容,喜好就关注我吧。