91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

記錄一下學習PDO技術防范SQL注入的方法

發布時間:2020-08-01 12:38:26 來源:網絡 閱讀:5139 作者:菜鵝小生 欄目:安全技術

最近學習了使用PDO技術防范SQL注入的方法,在博客里當做一次筆記。若果有新的感悟在來添上一筆,畢竟也是剛開始學習。
一、 什么是PDO

PDO全名PHP Data Object
PHP 數據對象 (PDO) 擴展為PHP訪問數據庫定義了一個輕量級的一致接口。
PDO 提供了一個數據訪問抽象層,這意味著,不管使用哪種數據庫,都可以用相同的函數(方法)來查詢和獲取數據。

二、如何去使用PDO防范SQL注入
/
防范sql注入這里使用quote()方法過濾特殊字符和通過預處理的一些方式以及bindParameter()方法綁定參數來防止SQL注入
/
三、 使用quate()方法防止sql注入。

Quate()方法返回帶引號的字符串,過濾特殊字符

1、首先創建一個登陸界面來提交用戶名和密碼。

</!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
        <form action="doAction1.php" method="post">
            <input type="text" name="username"></br>
            <input type="password" name="password"></br>
            <input type="submit" name="submit">
        </form>
</body>
</html>

2、然后創建后臺處理PHP文件,獲取用戶名和密碼,并在數據庫中查詢。基本的查詢方法來查詢。

<?php
header('content-type=text/html;charset=utf-8');
$username=$_POST['username'];
$password=$_POST['password'];
try{
    $pdo=new PDO('mysql:host=localhost;dbname=pdotest','root','123');
    $sql="select * from user where name=‘{$username}’ and password=‘{$password}’";
    echo $sql."</br>";
    $row=$pdo->query($sql);
    foreach ($row as $key => $value) {
        print_r($value);
    }

}catch(POOException $e){
    echo $e->getMessage();
}

這個處理界面是由SQL注入的界面。
3、我們來測試一下
(1)在文本框中輸入正確的用戶名和密碼,返回正常的信息
記錄一下學習PDO技術防范SQL注入的方法
但是當我們進行注入的時候,返回的信息:
(2)用戶名輸入’ or 1=1 #,密碼隨便輸入
記錄一下學習PDO技術防范SQL注入的方法
將數據庫中的用戶信息以數組的形式全部顯示了出來。
(3)我們在數據庫中執行這串查詢語句
記錄一下學習PDO技術防范SQL注入的方法
可以看到,數據庫照常顯示,這也是sql注入一個很大的危害。
4、接下來我們通過quote()方法來防止SQL注入
通過以下代碼,將new的對象$pdo通過調用quote()方法來重新返回用戶輸入的字符串,然后在通過查詢語句,去查詢數據庫中的數據。

<?php
header('content-type=text/html;charset=utf-8');
$username=$_POST['username'];
$password=$_POST['password'];
try{
    $pdo=new PDO('mysql:host=localhost;dbname=pdotest','root','123');
     $username=$pdo->quote($username);
     $password=$pdo->quote($password);
    $sql="select * from user where name='{$username}' and password='{$password}'";
    echo $sql."</br>";
    $row=$pdo->query($sql);
    foreach ($row as $key => $value) {
        print_r($value);
    }

}catch(POOException $e){
    echo $e->getMessage();
}

5、我們來使用同樣的方法來測試一下能不能防范sql注入呢?
(1)正確用戶名和正確密碼驗證:
記錄一下學習PDO技術防范SQL注入的方法
(2)正確用戶名和錯誤密碼訪問
記錄一下學習PDO技術防范SQL注入的方法
查詢不到數據
(3)使用sql注入:
記錄一下學習PDO技術防范SQL注入的方法
查詢失敗,我們可以清楚的看到我們輸入的引號在前面自動的加上了‘\’,將引號給轉義,失去了原來的作用。
(4)同時我們在數據庫中執行一下這個語句。
記錄一下學習PDO技術防范SQL注入的方法
查詢出錯。所以quote()方法能夠有效的防止sql注入
四、 使用預處理語句防止SQL注入
預處理語句中占位符形式來防止SQL注入。占位符有兩種形式,一種是通過命名參數,另一種是通過問好占位符的形式
1、通過命名參數防止注入
(1)首先在原來基礎的源碼上改正查詢語句。改為:
Select * from where name=:username and password=:password
整個源碼:

<?php
header('content-type:text/html;charset=utf-8');
$username=$_POST['username'];
$password=$_POST['password'];
try{
    $pdo=new PDO('mysql:host=localhost;dbname=pdotest','root','123');
    $sql='select * from user where name=:username and password=:password';
    $stmt=$pdo->prepare($sql);
    $stmt->execute(array(":username"=>$username,":password"=>$password));
    echo $stmt->rowCount();
}catch(PDOException $e){
    echo $e->getMessage();
}
?>

解釋:
a):命名用戶名參數:username密碼:password。
b):通過調用rowCount()方法,查看返回受sql語句影響的行數,返回0語句執行失敗,大于等于1,語句執行成功。
測試:
(1)正常訪問:用戶名zhangsan,密碼:123
記錄一下學習PDO技術防范SQL注入的方法
(2)錯誤密碼訪問:
記錄一下學習PDO技術防范SQL注入的方法
(3)Sql注入語句訪問:
記錄一下學習PDO技術防范SQL注入的方法
防止注入失敗

2、通過問號(?)占位符防止注入
(1)修改sql查詢語句:
Select * from user where name=? and password=?
完整代碼:

<?
header('content-type:text/html;charset=utf-8');
$username=$_POST['username'];
$password=$_POST['password'];
try{
    $pdo=new PDO('mysql:host=localhost;dbname=pdotest','root','123');
    $sql="select * from user where name=? and password=?";
    $stmt=$pdo->prepare($sql);
    $stmt->execute(array($username,$password));
    echo $stmt->rowCount();

}catch(PDOException $e){
    echo $e->getMessage();
}
?>

解釋:通過execute()方法直接傳遞數組array($username,$password)給sql語句查詢。
測試:
(1)正常訪問:用戶名:lisi,密碼:abc
記錄一下學習PDO技術防范SQL注入的方法
(2)錯誤用戶名或密碼訪問
記錄一下學習PDO技術防范SQL注入的方法
(3)Sql注入:
記錄一下學習PDO技術防范SQL注入的方法
注入失敗
五、 通過bindParam()方法綁定參數防御SQL注入。

<?php
header('content-type:text/html;charset=utf-8');
$username=$_POST['username'];
$password=$_POST['password'];
try{
    $pdo=new PDO('mysql:host=localhost;dbname=pdotest','root','123');
    $sql='select * from user where name=:username and password=:password';
    $stmt=$pdo->prepare($sql);
    $stmt->bindParam(":username",$username,PDO::PARAM_STR);
    $stmt->bindParam(":password",$password,PDO::PARAM_STR);
    $stmt->execute();
    echo $stmt->rowCount();

}catch(PDOException $e){
    echo $e->getMessage();
}
?>

(1)關鍵代碼:
$stmt->bindParam(":username",$username,PDO::PARAM_STR);
$stmt->bindParam(":password",$password,PDO::PARAM_STR);

解釋:
a)::username和:password為命名參數
b):$username;$password為獲取的變量,即用戶名和密碼。
c):PDO::PARAM_STR,表示參數變量的值一定要為字符串,即綁定參數類型為字符串。在bindparam()方法中,默認綁定的參數類型就是字符串。當你要接受×××的時候可以綁定參數為PDO::PARAM_INT.
測試:
(1)正常訪問測試:

記錄一下學習PDO技術防范SQL注入的方法
(2)測試sql注入:

記錄一下學習PDO技術防范SQL注入的方法

當做是一個筆記吧還有很多的知識點沒有寫出來,以后再慢慢補充吧!!!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

德阳市| 宜兰县| 德格县| 江安县| 台江县| 安乡县| 北辰区| 色达县| 营口市| 淮阳县| 祥云县| 孝义市| 甘南县| 沂源县| 上虞市| 留坝县| 兰州市| 霸州市| 哈尔滨市| 红桥区| 遵义县| 普格县| 宁乡县| 祁东县| 兰溪市| 拜城县| 阳新县| 河曲县| 阜平县| 德化县| 巴南区| 孟连| 休宁县| 广安市| 基隆市| 云梦县| 弥渡县| 西乡县| 马尔康县| 留坝县| 青海省|