PHP代码安全2-登录方面

登录方面代码简易分析及可能产生的问题

登录主要产生的问题无非就是三大类:

  • SQL注入(万能密码)
  • Cookie伪造
  • Session劫持
一.SQL注入

造成SQL注入的主要原因基本上都是过滤不严,造成可以进行sql语句的拼接.

<meta charset="UTF-8">
<form action="" method="post">
    用户名: <input type="text" name="username"><br>
    密码: <input type="password" name="password"><br>
    <input type="submit" value="提交">
</form>

<?php
    include ('..\..\config.php');
$username=$_POST['username'];
$password=md5($_POST['password']);

$sql="select * from sy_adminuser where username='$username' and password='$password'";
//此处还可能触发SQL注入等系列相关
echo $sql."<br>";



$res = mysqli_query($con,$sql);
if(mysqli_fetch_row($res)){
    echo "登录成功";
    header("Location:/index.php");
    setcookie("usr",$username);
}else{
    echo "登录失败";
}

?>

**此处便可在输入框中进行SQL拼接,假设输入的内容为如下,则拼接后逻辑判断都为真,因此便能骗过机制进而进入后台。 **

 ' or 1=1;#
 拼接后:
 $sql="select * from sy_adminuser where username='' or 1=1;#and password='$password'";

二.Cookie伪造

个人理解的Cookie无非就是一种存储于客户端一种登录凭证,不同身份的人自然凭证也不同,就像身份牌一样。而Cookie伪造便是去通过伪造Cookie进而骗过服务器的验证。

某CMS登录界面

<?php 
ob_start();
require '../inc/conn.php';
$login=$_POST['login'];
$user=$_POST['user'];
$password=$_POST['password'];
$checkbox=$_POST['checkbox'];

if ($login<>""){
$query = "SELECT * FROM manage WHERE user='$user'";
$result = mysql_query($query) or die('SQL语句有误:'.mysql_error());
$users = mysql_fetch_array($result);

if (!mysql_num_rows($result)) {  
echo "<Script language=JavaScript>alert('抱歉,用户名或者密码错误。');history.back();</Script>";
exit;
}else{
$passwords=$users['password'];
if(md5($password)<>$passwords){
echo "<Script language=JavaScript>alert('抱歉,用户名或者密码错误。');history.back();</Script>";
exit;	
	}
//写入登录信息并记住30天
if ($checkbox==1){
setcookie('user',$user,time()+3600*24*30,'/');
}else{
setcookie('user',$user,0,'/');
}
echo "<script>this.location='?r=index'</script>";
exit;
}
exit;
ob_end_flush();
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <meta charset="utf-8">
  <!-- Title and other stuffs -->
  <title>登录 - 熊海CMS后台管理系统</title> 
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta name="author" content="">
  <!-- Stylesheets -->
  <link href="style/bootstrap.css" rel="stylesheet">
  <link rel="stylesheet" href="style/font-awesome.css">
  <link href="style/style.css" rel="stylesheet">
  <link href="style/bootstrap-responsive.css" rel="stylesheet">
  
  <!-- HTML5 Support for IE -->
  <!--[if lt IE 9]>
  <script src="js/html5shim.js"></script>
  <![endif]-->

  <!-- Favicon -->
  <link rel="shortcut icon" href="../images/favicon.ico">
</head>

<body>

<!-- Form area -->
<div class="admin-form">
  <div class="container">

    <div class="row">
      <div class="col-md-12">
        <!-- Widget starts -->
            <div class="widget worange">
              <!-- Widget head -->
              <div class="widget-head">
                <i class="icon-lock"></i> 管理登录 
              </div>

              <div class="widget-content">
                <div class="padd">
                  <!-- Login form -->
                  <form method="post" class="form-horizontal" action="">
                    <!-- Email -->
                    <div class="form-group">
                      <label class="control-label col-lg-3" for="inputEmail">帐号</label>
                      <div class="col-lg-9">
                        <input type="text" name="user" class="form-control" id="inputEmail" placeholder="user">
                      </div>
                    </div>
                    <!-- Password -->
                    <div class="form-group">
                      <label class="control-label col-lg-3" for="inputPassword">密码</label>
                      <div class="col-lg-9">
                        <input type="password" name="password" class="form-control" id="inputPassword" placeholder="Password">
                      </div>
                    </div>
                    <!-- Remember me checkbox and sign in button -->
                    <div class="form-group">
					<div class="col-lg-9 col-lg-offset-3">
                      <div class="checkbox">
                        <label>
                          <input type="checkbox" name="checkbox" value="1"> 记住一个月
                        </label>
						</div>
					</div>
					</div>
                        <div class="col-lg-9 col-lg-offset-2">
							<button type="submit" class="btn btn-danger" name="login" value="yes">登录</button>
							<button type="reset" class="btn btn-default">重置</button>
						</div>
                    <br />
                  </form>
				  
				</div>
                </div>
              
                <div class="widget-foot">
                  不是管理员? <a href="/">返回首页</a>
                </div>
            </div>  
      </div>
    </div>
  </div> 
</div>
	
		

<!-- JS -->
<script src="js/jquery.js"></script>
<script src="js/bootstrap.js"></script>
</body>
</html>

其后台验证:

<?php
$user=$_COOKIE['user'];
if ($user==""){
header("Location: ?r=login");
exit;	
}
?>

从中可以看出其后台验证相对比较鸡肋,只判断了Cookie中的user字段是否为空,若不为空便让其登录后台。因此这里可以采取Cookie伪造(即让user为任意值),进而触发一个未授权登录漏洞。


三.Session

Session机制是另一种验证机制,其与Cookie不同的是其是存储于服务端。也就是说每次需要客户端和服务端相对应才能验证成功,且不可进行修改伪造。而每次又会参生唯一字段SessionID。Session的周期便是每次会话启动开始到结束(即浏览器的访问url开始到关闭)。

登录界面

<form action="" method="POST">

    帐号:<input type="text" name="user">
    密码:<input type="password" name="pass">
    <input type="submit" value="提交">

</form>
<?php
header("Content-Type:text/html;charset=utf-8");
include('..\..\config.php');

$username=$_POST['user'];
$password=md5($_POST['pass']);
$captcha=$_POST['captcha'];
//echo $password;
$sql="select * from sy_adminuser where username='$username' and password='$password'";
echo $sql;
$result=mysqli_query($con,$sql);
while($row=mysqli_fetch_row($result)){
    session_start(); //启动Session
    $_SESSION['username'] = $row[1];
    //echo $_SESSION['username'];
    header('Location: index.php');
}
?>

后台验证:

<?php
/**
     2022年1月13日16:10:56
 *   功能:Session验证
 *      登录验证时的Session的验证是存储在服务端的一种验证,且存活的周期为客户端与服务端之间
 *   建立连接到,浏览器关闭,且每次都是动态的。因此大多采用的策略便是会话劫持操作。
 **/
header("Content-Type:text/html;charset=utf-8");
     session_start();
     $username = $_SESSION['username'];
     if ($username == 'admin'){
          echo "进入管理员界面!";
     }else{
          echo "进入非管理员界面!";
     }
?>
为什么会出现Cookie和Session机制?

因为服务器需要对登录的人的身份进行一个验证,再对不同权限的人执行不同的操作。

还有其他登录时可能产生的问题?

有验证码也不是绝对安全的,还可能因程序员验证码周期处理不当进而导致验证码复用问题,且验证码也能通过Python中OCR技术或是云打码平台进行识别。

												**才疏学浅,如有谬误,不吝赐教,谢谢!**
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值