亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于PHP+MySQL的用戶登錄系統(tǒng)SQL注入實(shí)例及防范

        2020-01-10 12:43:48段壽建
        現(xiàn)代計(jì)算機(jī) 2019年34期
        關(guān)鍵詞:用戶名后臺語句

        段壽建

        (保山學(xué)院信息學(xué)院,保山 678000)

        0 引言

        PHP原名為Personal Home Page的縮寫,后更名為“PHP:Hypertext Preprocessor”,這種將名稱放到定義中的寫法被稱作遞歸縮寫[1]。PHP是一種開源的、跨平臺的、獨(dú)立架構(gòu)的、解釋性的、面向?qū)ο蟮?、快速的、健壯的、安全性高的Web編程語言。PHP是一個開放源代碼的項(xiàng)目,用戶可以免費(fèi)使用PHP來開發(fā)中小型的Web項(xiàng)目。PHP能運(yùn)行在Windows、Linux等絕大多數(shù)操作系統(tǒng)環(huán)境中。

        MySQL是一個小型關(guān)系型數(shù)據(jù)庫管理系統(tǒng),由瑞典MySQL AB公司開發(fā),目前屬于Oracle旗下產(chǎn)品[2]。MySQL被廣泛地應(yīng)用在Internet上的中小型網(wǎng)站中,由于其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點(diǎn),許多中小型網(wǎng)站為了降低網(wǎng)站總體擁有成本而選擇了MySQL作為網(wǎng)站數(shù)據(jù)庫。

        PHP常與開源免費(fèi)的Web服務(wù)Apache和數(shù)據(jù)庫MySQL配合使用于Linux平臺上(簡稱LAMP),具有最高的性價比,號稱“Web架構(gòu)黃金組合”。

        1 SQL注入原理

        SQL注入是存在于Web應(yīng)用程序中的一種漏洞,Web應(yīng)用程序?qū)τ脩糨斎霐?shù)據(jù)的合法性沒有判斷,攻擊者通過構(gòu)造一些畸形輸入,在應(yīng)用程序中預(yù)先定義好的查詢語句結(jié)尾加上額外的SQL語句元素,欺騙數(shù)據(jù)庫服務(wù)器執(zhí)行非授權(quán)的任意查詢,獲取其沒有合法權(quán)限查詢的信息[3]。SQL注入不是Web或數(shù)據(jù)庫服務(wù)器中的缺陷,而是由于編程實(shí)踐較差且缺乏經(jīng)驗(yàn)而導(dǎo)致的。SQL注入漏洞的產(chǎn)生需要滿足以下兩個條件:一是參數(shù)用戶可控,前端傳給后端的參數(shù)內(nèi)容是用戶可以控制的;二是參數(shù)代入數(shù)據(jù)庫查詢,傳入的參數(shù)拼接到SQL語句,并且?guī)霐?shù)據(jù)庫查詢。當(dāng)黑客想要對Web程序進(jìn)行滲透注入時,需要做以下準(zhǔn)備:搜集目標(biāo)信息;尋找注入點(diǎn);構(gòu)造SQL語句進(jìn)行注入[4]。

        2 后臺登錄系統(tǒng)實(shí)例

        本文以一個實(shí)際的網(wǎng)站后臺登錄系統(tǒng)開發(fā)為例,開發(fā)環(huán)境為如下:WampServer版本:2.2,Apache版本:2.2.22,PHP 版本:5.4.3,MySQL 版本:5.5.24。

        2.1 管理員數(shù)據(jù)表設(shè)計(jì)

        數(shù)據(jù)庫命名為news,管理員數(shù)據(jù)表命名為ad?min_user,包含用戶名、密碼、真實(shí)姓名、電話號碼、電子郵箱、權(quán)限6個字段,各字段的定義如表1所示。

        表1 管理員用戶表

        用PHPMyAdmin創(chuàng)建數(shù)據(jù)表,插入一條數(shù)據(jù),用戶名為“abc”,密碼為“123”的 md5 值,即:“202cb962ac 59075b964b07152d234b70”。

        2.2 登錄頁面login.php的設(shè)計(jì)

        (1)基本頁面布局

        將登錄頁面命名為login.php,制作用戶登錄表單,命名為 form1,method="post"action="check.php",用表格布局頁面如圖1所示。

        圖1 用戶登錄界面布局圖

        用戶名框命名為:userName,類型為單行文本,密碼框命名為:userPassword,類型為密碼,驗(yàn)證碼框命名為yzm,類型為單行文本,驗(yàn)證碼圖片由yzm.php隨機(jī)生成四位字符,并生成有干擾的圖片輸出在頁面,生成的字符放入Session變量中,以備一下步的驗(yàn)證。

        (2)使用JavaScript實(shí)現(xiàn)客戶端驗(yàn)證

        在提交按鈕上增加事件onClick="return jc()",在login.php中加入JavaScript代碼如下:

        <script>

        functionjc()

        {

        if(document.form1.userName.value=="")//檢查用戶名是否為空

        {

        window.alert("用戶名不能為空!");//彈出提示

        document.form1.userName.focus();//讓用戶名框獲得焦點(diǎn)

        return false;//不提交表單

        }

        if(document.form1.userPassword.value=="")//檢查密碼是否為空

        {

        window.alert("密碼不能為空!");//彈出提示

        document.form1.userPassword.focus();//讓密碼框獲得焦點(diǎn)

        return false;//不提交表單

        }

        i(fdocument.form1.yzm.value.length<4)

        {

        window.alert("請輸入 4 位驗(yàn)證碼!");//檢查驗(yàn)證碼是否為空

        document.form1.yzm.focus();//讓驗(yàn)證框獲得焦點(diǎn)

        return false;//不提交表單

        }

        return true;//提交表單

        }

        </script>

        2.3 驗(yàn)證頁面check的設(shè)計(jì)

        login.php頁面填報的數(shù)據(jù)經(jīng)客戶端驗(yàn)證通過后,將數(shù)據(jù)提交到check.php頁面,功能是檢測驗(yàn)證碼是否正確,然后檢測用戶名和密碼是否正確,代碼如下:

        <?php

        //1.設(shè)置Session路徑并開啟Session功能

        session_save_path("session/");

        session_start();

        //2.獲取用戶輸入的三個參數(shù)

        $userName=$_POST["userName"];

        $userPassword=md5( $_POST["userPassword"]);//使 用 md5加密

        $yzm=$_POST["yzm"];

        //3.先檢查驗(yàn)證碼是否正確

        if(strtoupper($yzm)!=strtoupper($_SESSION["yzm"]))

        {

        echo"<script>window.alert('驗(yàn)證碼錯誤!')</script>";

        echo"<meta http-equiv=REFRESH CONTENT='0;URL=log?in.php'>";

        }

        //4.連接數(shù)據(jù)庫、設(shè)置時區(qū)和字符集

        $dblink=mysqli_connect("127.0.0.1","root","","news")or die("數(shù)據(jù)庫打開失敗");

        date_default_timezone_set("Asia/Shanghai");

        mysqli_set_charset($dblink,"gbk");

        //5.判斷用戶名和密碼是否正確

        $sql="SELECT*FROM admin_user where userName='$user?Name'and userPassword='$userPassword'";

        $result=mysqli_query($dblink,$sql);

        $hs=mysqli_num_rows($result);

        if($hs>0)//如果正確,跳轉(zhuǎn)到后臺主頁index.php

        {

        $_SESSION["isLogin"]=1;

        $_SESSION["userName"]=$userName;

        echo"<meta http-equiv=REFRESH CONTENT='0;URL=in?dex.php'>";

        }

        else//如果不正確,跳轉(zhuǎn)到后臺登錄頁面login.php

        {

        echo"<script>window.alert('用戶名或密碼錯誤!')</script>";

        echo"<meta http-equiv=REFRESH CONTENT='0;URL=log?in.php'>";

        }

        ?>

        2.4 后臺主頁面index.php的設(shè)計(jì)

        當(dāng)驗(yàn)證碼、用戶名和密碼都正確后,頁面跳轉(zhuǎn)到后臺主頁index.php,該頁面的布局如圖2所示,具體代碼與本文的SQL注入關(guān)系不大,就不再贅述。

        圖2 后臺主頁布局圖

        3 數(shù)據(jù)注入場景演示

        3.1 SQL注入

        程序員按以上步驟完成login.php、check.php和in?dex.php的開發(fā),正常情況下,在login.php中,輸入用戶名為:abc,密碼:123,即可以正常登錄到index.php。但此時程序存在SQL注入漏洞,如瀏覽者在用戶名處輸入“1’or 1=1#”,密碼處輸入任意字符,輸入正確的驗(yàn)證碼,如圖3所示,就可以登錄后臺了。

        3.2 原因分析

        在check.php中,驗(yàn)證用戶名和密碼是否正確的SQL語句是:

        $sql="SELECT*FROM admin_user where userName='$userName'and userPassword='$userPassword'"

        當(dāng)瀏覽者按上述的方式輸入,運(yùn)行后構(gòu)造的語句是:

        SELECT*FROM admin_user where userName='1'or 1=1#'and userPassword='c4ca4238a0b923820dcc509a6f75849b'

        以上加粗部分為的用戶名的內(nèi)容,注入在SQL語句中,就把原本的and條件變成了or條件,而且其中一個為真,后面的內(nèi)容被當(dāng)作注釋處理了,“1=1”部分也可以換成其他的為真的表達(dá)式,效果是一樣的,如“1'or 1#”。另外,將“#”換成“--(空格)”也是同樣的效果。

        圖3

        3.3 安全防范辦法

        產(chǎn)生以上問題的關(guān)鍵在于單引號的區(qū)配,和#注釋的作用,在正常的登錄中,用戶名是不應(yīng)該包含單引號或#號的,所以防范措施可以先過濾如單引、#號這樣的特殊字符,可以用PHP的str_replace函數(shù)過濾,如:在check.php中接收到用戶名后做過濾,即在:$userName=$_POST["userName"]后增加如下代碼:

        $userName=str_replace("'","",$userName);//替換單引號

        $userName=str_replace("#","",$userName);//替換#

        $userName=str_replace("-","",$userName);//替換-

        $userName=str_replace("","",$userName);//替換空格

        將單引號、#號、-號、空格替換后,上例的SQL注入就會失效,在實(shí)際編程中,可以把以上的替換做成函數(shù),把與MySQL相關(guān)的一些特殊字符一并過濾。

        另外,PHP的addslashes()函數(shù)也可以解決以上問題,addslashes()函數(shù)的作用是返回在預(yù)定義字符之前添加反斜杠的字符串,預(yù)定義字符是:單引號(')、雙引號(")、反斜杠()、NULL。

        在上例中,也可以將 $userName=$_POST["user?Name"],修改為:

        $userName=addslashes($_POST["userName"]);

        即可在單引號上進(jìn)行轉(zhuǎn)義,同樣能解決上例中的注入問題。

        4 結(jié)語

        SQL注入是從正常的WWW端口訪問,而且表面上跟一般的Web頁面沒什么區(qū)別,所以目前市面的防火墻都不會對SQL注入發(fā)出警報,SQL注入攻擊主要針對的是Web開發(fā)過程中,程序員編程的不嚴(yán)密、編程實(shí)踐較差且缺乏經(jīng)驗(yàn)而產(chǎn)生的程序漏洞,因此要防范SQL注入攻擊的主要方法就是提高編程能力,同時也需要對服務(wù)器端進(jìn)行合理配置[5]。本文通過詳細(xì)介紹使用PHP和MySQL技術(shù)制作通用的用戶登錄程序,通過實(shí)例演示SQL注入攻擊,分析原因并實(shí)現(xiàn)安全防范的教學(xué)案例,對便于程序員理解SQL注入的原理、舉一反三、提高編程能力防范SQL注入有一定的指導(dǎo)意義。

        猜你喜歡
        用戶名后臺語句
        《護(hù)士進(jìn)修雜志》投稿程序
        重點(diǎn):語句銜接
        后臺暗戀
        精彩語句
        機(jī)智的快遞員
        故事會(2017年17期)2017-09-04 17:36:42
        前臺、后臺精彩花絮停不了
        如何搞定語句銜接題
        語文知識(2014年4期)2014-02-28 21:59:52
        電力調(diào)度中后臺監(jiān)控系統(tǒng)的應(yīng)用
        河南科技(2014年11期)2014-02-27 14:10:03
        后臺
        中國攝影(2013年6期)2013-04-29 21:58:19
        作文語句實(shí)錄
        青青草视频视频在线观看| 日韩精品无码一区二区三区视频| 亚洲精品中文字幕无乱码麻豆| 久久精品国产亚洲AV古装片| 日本少妇又色又紧又爽又刺激| 一区二区三区人妻少妇| 又大又粗又爽18禁免费看| 国产精品jizz观看| 久久成人黄色免费网站| 国产黄色一区二区在线看| 五月丁香六月综合缴清无码 | 欧美性xxxx狂欢老少配| 在线亚洲AV成人无码一区小说| 亚洲中文字幕一二区精品自拍| 欧美怡春院一区二区三区| 婷婷久久久亚洲欧洲日产国码av | 被三个男人绑着躁我好爽视频| 狠狠躁夜夜躁人人爽超碰97香蕉| 久久青青草视频免费观看| 野花视频在线观看免费| 2020无码专区人妻系列日韩| 男人无码视频在线观看| 精品国产又大又黄又粗av| 日本一区三区三区在线观看| 国产精品亚洲αv天堂无码| 亚洲一区综合精品狠狠爱| 亚洲中文字幕诱惑第一页| 久久日日躁夜夜躁狠狠躁| 国产麻豆精品久久一二三| 欧美色图50p| 国产av一级二级三级| 国产无夜激无码av毛片| 亚洲国产一区二区三区亚瑟| 美女福利一区二区三区在线观看| 日本免费在线不卡一区二区| аⅴ资源天堂资源库在线| 91华人在线| 日本频道一区二区三区| 国模吧无码一区二区三区| 亚洲日本三级| 日本成年少妇人妻中文字幕|