最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

萬(wàn)能密碼的SQL注入漏洞其PHP環(huán)境搭建及防御手段

 更新時(shí)間:2021年09月02日 12:17:45   作者:Zeker62  
這篇文章主要介紹了萬(wàn)能密碼的SQL注入漏洞其PHP環(huán)境搭建及防御手段,對(duì)此感興趣的小伙伴趕快收藏起來(lái)吧

萬(wàn)能密碼的SQL注入漏洞其PHP環(huán)境搭建及防御手段

一、環(huán)境搭建

這個(gè)滲透環(huán)境的搭建有以下幾點(diǎn):

  • 基于session的會(huì)話
  • 登錄界面
  • 登錄成功界面
  • 注銷界面
  • 數(shù)據(jù)庫(kù)搭建
  • 數(shù)據(jù)庫(kù)連接

二、session會(huì)話

  • 服務(wù)器端利用session_start()函數(shù)發(fā)起一次session的會(huì)話
  • 此時(shí)我們登錄成功后用戶的數(shù)據(jù)被保存在服務(wù)器端的Cookie: session= ,即sessionID
  • 如果需要再次訪問(wèn)
  • 服務(wù)器端的$_SESSION['...']會(huì)獲取用戶session
  • 然后與原本存在于服務(wù)器的sessionID進(jìn)行比對(duì),如果比對(duì)成功,則證明用戶正確

三、環(huán)境搭建代碼

1、創(chuàng)建數(shù)據(jù)庫(kù)腳本

在MySQL中使用source命令即可運(yùn)行腳本:

drop database if exists lab;
create database lab;
use lab;

create table users
(
    id int not null auto_increment,
    username char(32) not null,
    passcode char(32) not null,
    primary key(id)
);

insert into users(username,passcode) values('admin','admin123');
insert into users(username,passcode) values('alice','alice456');

2、登錄界面html

<html>

<head>
    <meta charset="UTF-8">
    <title>Login</title>
    <style>
        #a {
            width: 500px;
            text-align: center;
        }
        
        .b {
            width: 200px;
            height: 30px;
        }
    </style>
</head>

<body>
    <div id=a>
        <h2>Login!</h2>
        <form name="form_login" method="POST" action="check_login.php">
            Username:<input type="text" class="b" name="username" /><br> <br> 
  Password:<input type="password" class="b" name="password" /><br>
            <input type="submit" name="Submit" value="Submit" />
            <input type="reset" name="reset" value="Reset" />
        </form>
    </div>
</body>

</html>

3、查詢數(shù)據(jù)庫(kù)是否為正確的賬號(hào)密碼php代碼

<?php
include('con_database.php');

$username=isset($_POST['username'])?$_POST['username']:'';
$password=isset($_POST['password'])?$_POST['password']:'';
if($username=='' || $password==''){
    echo "<script>alert('請(qǐng)輸入賬號(hào)和密碼!')</script>";
    exit;
}

$sql="select * from users where username='$username' and passcode='$password'";

$query=mysqli_query($con,$sql) or die('SQL語(yǔ)句執(zhí)行失敗'.mysqli_error($con));
if ($row=mysqli_fetch_array($query)){
    session_start();
    $_SESSION['username']=$row[1];
    echo "<a href='welcome.php'>歡迎訪問(wèn)</a>";
}else{
    echo "<script>alert('登錄失??!');history.go(-1)</script>";
}
mysqli_close($con);
?>


4、連接數(shù)據(jù)庫(kù)php代碼:

<?php
$con=mysqli_connect('127.0.0.1','root','root') or die("數(shù)據(jù)庫(kù)連接失敗!");
mysqli_select_db($con,'lab')or die("數(shù)據(jù)庫(kù)連接失敗");
?>

5、注銷登錄代碼(即關(guān)閉session會(huì)話)

<?php
session_start();
session_unset();
session_destroy();
echo "注銷成功";
?>

6、登錄成功歡迎界面

<?php
session_start();
if(isset($_SESSION['username'])){
    echo "歡迎用戶".$_SESSION['username']."登錄";
    echo "<br>";
    echo "<a href=logout.php>退出登錄</a>";
}else{
    echo "您沒(méi)有權(quán)限訪問(wèn)";
}
?>


至此,我們的滲透環(huán)境就構(gòu)建好了

四、萬(wàn)能密碼漏洞剖析

  • 用戶名輸入' or 1=1 or',密碼隨意,發(fā)現(xiàn)可以登錄進(jìn)去
  • 密碼輸入 'or '1=1 也可以登錄進(jìn)去

當(dāng)然登錄方法不止一種:

原來(lái)查詢語(yǔ)句是這樣的:

$sql="select * from users where username='$username' and passcode='$password'";

經(jīng)過(guò)注入之后,變成:

$sql="select * from users where username='' or 1=1 or ' and passcode='****'";

我們觀察到,where后面呃字句中的username被閉合,并且字句分成三個(gè)句子并用or連接。
在SQL語(yǔ)句中 and的優(yōu)先級(jí)要大于or,所以1=1先判斷,為真,即where后面的語(yǔ)句為真,即整個(gè)SQL語(yǔ)句為真,即表示查詢正確
而形成的語(yǔ)句可以將整個(gè)users表查詢,后面的$row=mysqli_fetch_array($query)選擇的是查詢的第一行值,這樣滿足了SQL語(yǔ)句并跳過(guò)了登錄驗(yàn)證
由此可以引申出,只要where后面字句為真,即可跳過(guò)驗(yàn)證,有如下衍生方法:

  • ' or 1=1 #
  • ' or 1=1 -- (后面有空格)
  • 'or"="or'

五、萬(wàn)能密碼攻擊防護(hù)

1、使用正則表達(dá)式限制用戶輸入

可以使用正則表達(dá)式限制用戶的用戶名輸入,比如:/^[a-z0-9A-Z_]{5,16}$/
這個(gè)限制了用戶5位以上16位以下的字母數(shù)字下劃線為用戶名的輸入
這個(gè)限制在check_login.php中添加

<?php
include('con_database.php');

$username=isset($_POST['username'])?$_POST['username']:'';
$password=isset($_POST['password'])?$_POST['password']:'';
if (!preg_match("/^[a-Z0-9A-Z_]{5,16}$/",$username)){
    echo "<script>alert('用戶名格式錯(cuò)誤')</script>";
    exit;

if($username=='' || $password==''){
    echo "<script>alert('請(qǐng)輸入賬號(hào)和密碼!')</script>";
    exit;
}

$sql="select * from users where username='$username' and passcode='$password'";

$query=mysqli_query($con,$sql) or die('SQL語(yǔ)句執(zhí)行失敗'.mysqli_error($con));
if ($row=mysqli_fetch_array($query)){
    session_start();
    $_SESSION['username']=$row[1];
    echo "<a href='welcome.php'>歡迎訪問(wèn)</a>";
}else{
    echo "<script>alert('登錄失?。?);history.go(-1)</script>";
}
mysqli_close($con);
}
?>

2、使用PHP轉(zhuǎn)義函數(shù)

  • addslashes()函數(shù):能夠?qū)我?hào)、雙引號(hào)、反斜杠和null轉(zhuǎn)義
  • mysql_escape_string()函數(shù)、mysql_real_escape_string()函數(shù)這個(gè)是轉(zhuǎn)義SQL語(yǔ)句中的符號(hào),php7.x版本的都要變成mysqli
$username=isset($_POST['username'])?addslashes($_POST['username']):'';
$password=isset($_POST['password'])?mysqli_real_escape_string($con,$_POST['password']):'';

3、轉(zhuǎn)義函數(shù)的弊端

因?yàn)槭褂玫氖荱TF-8編碼,不是寬字節(jié)編碼,形成的'會(huì)被變成%5c%27
Windows下默認(rèn)的是寬字節(jié)的gbk編碼
如果在%5c前面加上一個(gè)字符形成一個(gè)復(fù)雜的漢字,那么單引號(hào)仍然會(huì)被輸出

六、MySQLi 參數(shù)化查詢

在使用參數(shù)化查詢的情況下,服務(wù)器不會(huì)將參數(shù)的內(nèi)容是為SQL指令中的一部分
而是在數(shù)據(jù)庫(kù)完成SQL指令的編譯之后,再代入?yún)?shù)運(yùn)行
此時(shí)就算參數(shù)里面有惡意數(shù)據(jù)
但是此時(shí)SQL語(yǔ)句以及編譯完成
就不會(huì)被數(shù)據(jù)庫(kù)運(yùn)行

PHP提供了三種訪問(wèn)mysql數(shù)據(jù)庫(kù)的拓展:

  • MySQL (PHP5.5起,已經(jīng)廢除)
  • MySQLi
  • PDO(PHP Data Object PHP數(shù)據(jù)對(duì)象)

PDO和MySQLi提供面向?qū)ο蟮腶pi
MySQLi也存在面向過(guò)程的api,所以容易從MySQL轉(zhuǎn)換到MySQLi

下面是mysqli形式的check_login.php 寫法,新建check_login_mysqli.php

<?php
include('con_database.php');

$username=isset($_POST['username'])?$_POST['username']:'';
$password=isset($_POST['password'])?$_POST['password']:'';

if($username==''||$password==''){
    echo "<script>alert('錯(cuò)誤!');history.go(-1);</script>";
    exit;
}
$sql="select * from users where username=? and passcode=? ;";//問(wèn)號(hào)表示需要一個(gè)參數(shù)
$stmt=$con->prepare($sql);//預(yù)編譯SQL語(yǔ)句
if(!$stmt){
    echo 'prepare 執(zhí)行錯(cuò)誤';
}
else{
    $stmt->bind_param("ss",$username,$password); //為預(yù)編譯綁定SQL參數(shù),ss表示兩個(gè)字符串
    //i——int d——double  s——string   b——boolean
    $stmt->execute();
    $result=$stmt->get_result();
    $row=$result->fetch_row();
    if($row){
        session_start();
        $_SESSION['username']=$row[1];
        echo $row[1]."<a href='welcome.php'>歡迎訪問(wèn)</a>";
    }else{
        echo "<script>alert('登錄失?。。?);history.go(-1);</script>";
    }
    $stmt->close();
}
$con->close();
?>

一些內(nèi)容已經(jīng)標(biāo)記在代碼的注釋里面
參數(shù)化的PHP代碼真的能夠很有效地防止SQL注入。

以上就是萬(wàn)能密碼的SQL注入漏洞其PHP環(huán)境搭建及防御手段的詳細(xì)內(nèi)容,更多關(guān)于萬(wàn)能密碼的SQL注入 PHP環(huán)境搭建 防御手段的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SQL Server 數(shù)據(jù)庫(kù)備份和還原認(rèn)識(shí)和總結(jié) (一)

    SQL Server 數(shù)據(jù)庫(kù)備份和還原認(rèn)識(shí)和總結(jié) (一)

    可能許多同學(xué)對(duì)SQL Server的備份和還原有一些了解,也可能經(jīng)常使用備份和還原功能,我相信除DBA之外我們大部分開(kāi)發(fā)員隊(duì)伍對(duì)備份和還原只使用最基礎(chǔ)的功能,對(duì)它也只有一個(gè)大概的認(rèn)識(shí),如果對(duì)它有更深入的認(rèn)識(shí),了解它更全面的功能豈不是更好,到用時(shí)會(huì)得心應(yīng)手
    2012-08-08
  • 分頁(yè) SQLServer存儲(chǔ)過(guò)程

    分頁(yè) SQLServer存儲(chǔ)過(guò)程

    分頁(yè) SQLServer存儲(chǔ)過(guò)程...
    2006-08-08
  • SQL Server利用bcp命令把SQL語(yǔ)句結(jié)果生成文本文件

    SQL Server利用bcp命令把SQL語(yǔ)句結(jié)果生成文本文件

    在SQL Server里可以調(diào)用DOS下的命令行工具bcp來(lái)實(shí)現(xiàn)把表里的數(shù)據(jù)或者SQL語(yǔ)句結(jié)果生成文本文件,詳細(xì)看下操作方法,感興趣的你可不要錯(cuò)過(guò)了哈
    2013-02-02
  • 大型項(xiàng)目中Java連接MSSQL的性能優(yōu)化

    大型項(xiàng)目中Java連接MSSQL的性能優(yōu)化

    在大型項(xiàng)目中,Java語(yǔ)言和MSSQL數(shù)據(jù)庫(kù)的結(jié)合應(yīng)用變得越來(lái)越流行,這不但是因?yàn)镴ava語(yǔ)言提供高度可移植性和高效處理大量數(shù)據(jù)的優(yōu)勢(shì),而且MSSQL具備高效便捷的存儲(chǔ)和數(shù)據(jù)查詢能力,今天我們將討論如何在Java項(xiàng)目中與MSSQL數(shù)據(jù)庫(kù)進(jìn)行交互
    2024-02-02
  • SQL Server 2000“設(shè)備激活錯(cuò)誤”的解決方法

    SQL Server 2000“設(shè)備激活錯(cuò)誤”的解決方法

    數(shù)據(jù)庫(kù)恢復(fù)時(shí)出現(xiàn)諸如“設(shè)備激活錯(cuò)誤,請(qǐng)使用with move選項(xiàng)來(lái)標(biāo)志該文件的有效位置”報(bào)錯(cuò)的解決方法
    2013-11-11
  • 使用SQL語(yǔ)句實(shí)現(xiàn)查詢排序,順序和倒序

    使用SQL語(yǔ)句實(shí)現(xiàn)查詢排序,順序和倒序

    這篇文章主要介紹了使用SQL語(yǔ)句實(shí)現(xiàn)查詢排序、順序和倒序,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • SQL Server數(shù)據(jù)類型char、nchar、varchar、nvarchar的區(qū)別淺析

    SQL Server數(shù)據(jù)類型char、nchar、varchar、nvarchar的區(qū)別淺析

    這篇文章主要介紹了SQL Server數(shù)據(jù)類型char、nchar、varchar、nvarchar的區(qū)別淺析,本文寫的比較容易明白,需要的朋友可以參考下
    2014-06-06
  • SQL?Server的徹底卸載與再次安裝方式

    SQL?Server的徹底卸載與再次安裝方式

    這篇文章主要介紹了SQL?Server的徹底卸載與再次安裝方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • sqlserver連接錯(cuò)誤之SQL評(píng)估期已過(guò)的問(wèn)題解決

    sqlserver連接錯(cuò)誤之SQL評(píng)估期已過(guò)的問(wèn)題解決

    很久沒(méi)用sqlserver了,現(xiàn)在出現(xiàn)評(píng)估期已過(guò)的問(wèn)題,本文就介紹一下sqlserver連接錯(cuò)誤之SQL評(píng)估期已過(guò)的問(wèn)題解決,文中根據(jù)圖文詳細(xì)介紹的十分詳盡,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • SQL中的分組查詢與聯(lián)合查詢舉例詳解

    SQL中的分組查詢與聯(lián)合查詢舉例詳解

    這篇文章主要介紹了GROUPBY分組查詢和聯(lián)合查詢?cè)跀?shù)據(jù)庫(kù)操作中的應(yīng)用,GROUPBY用于將數(shù)據(jù)分組并進(jìn)行聚合計(jì)算,而聯(lián)合查詢則通過(guò)連接多個(gè)表或子查詢的結(jié)果來(lái)獲取更復(fù)雜的數(shù)據(jù)集,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-02-02

最新評(píng)論

互助| 梅州市| 亳州市| 中阳县| 商河县| 丁青县| 剑河县| 沙田区| 资讯 | 彰化市| 本溪| 房产| 鲜城| 旺苍县| 汉寿县| 衡阳县| 万盛区| 赤水市| 横峰县| 固阳县| 扎囊县| 金溪县| 响水县| 乌苏市| 普定县| 蛟河市| 民和| 崇明县| 南郑县| 普安县| 镇赉县| 来宾市| 乐至县| 安平县| 桃园市| 新沂市| 钟山县| 合作市| 宁乡县| 丹东市| 昭通市|