:::

4-2 用PDO寫入資料庫

  1. 基本語法(需自行過濾變數,擋掉 SQL injection 隱碼攻擊或 SQL 注入攻擊):
    $sql = "INSERT INTO `資料表` (`欄1`, `欄2`, ...) VALUES('值1', '值2', ...)";
    $db->exec($sql);

    關於隱碼攻擊可參考:https://medium.com/@gordonfang_85054/%E8%B3%87%E5%AE%89%E6%BB%B2%E9%80%8F%E6%94%BB%E9%98%B2%E7%AD%86%E8%A8%98-1-c9a6b8ada5fa

  2. 比較安全的prepare寫法(會自動處理SQL injection 攻擊),這是使用命名方式:
    $sql = "INSERT INTO `資料表` (`欄1`, `欄2`, ...) VALUES(:欄1,:欄2,...)";
    $sth = $db->prepare($sql);
    $values= [':欄1' => '值1',':欄2' => '值2', ...];
    $sth->execute($values);

    或更簡單的用 ? 佔位符

    $sql = "INSERT INTO `資料表` (`欄1`, `欄2`, ...) VALUES(?, ?,...)";
    $sth = $db->prepare($sql);
    $values= ['值1', '值2', ...];
    $sth->execute($values);


    為了安全性,我們後續將都直接採用prepare寫法

  3. 以我們的例子來說,admin/index.php目前的內容便是:
    <?php
    $dbhost = 'localhost'; //一般是 localhost 或 127.0.0.1
    $dbuser = 'root'; //一般是 root
    $dbpasswd = '12345';
    $dbname = 'blog';
    $dbcharacter = 'utf8mb4'; //一般是 utf8
    try
    {
        $db = new PDO("mysql:host={$dbhost};dbname={$dbname};charset={$dbcharacter}", $dbuser, $dbpasswd);
        $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); //禁用prepared statements的模擬效果
        $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //讓資料庫顯示錯誤原因
        // echo "連線成功";
    } catch (PDOException $e) {
        die("無法連上資料庫:" . $e->getMessage());
    }
    
    
    // 寫入資料庫
    $sql = "INSERT INTO `articles`
    (`title`, `info`, `date`, `content`, `cate_id`)
    VALUES(?, ?, ?, ?, ?)";
    $sth = $db->prepare($sql);
    $values = [
        $_POST['title'],
        $_POST['info'],
        $_POST['date'],
        $_POST['content'],
        $_POST['cate_id'],
    ];
    $sth->execute($values);
    
    // 取得該資料的流水號
    $id = $db->lastInsertId();
    
    //執行後轉向
    header("location: ../admin.html");
    exit;

     

  4. 由於流水號是自動產生,所以,我們可以用lastInsertId()去抓取該編號,以方便之後運用,例如儲存完就轉向到該編號頁面。

  5. 儲存後,我們必須轉向,避免一直停留在新增的狀態,所以,會用 header("location: 轉向位址"); 將會面導向到另一頁(我們目前儲存後暫時轉到上一層的發布界面,因為前台還未完成)

  6. 然後連到 admin.html 發個新文章(目前還無法上傳檔案)

  7. 送出後,會回到首頁,但首頁目前是假的,所以先直接到phpMyAdmin去看看有無寫入資料即可

  8. 請在標題輸入框分別輸入底下內容試試(XSS攻擊),若是無法順利寫入,那就是有問題:
    <img src="https://www.fairworkcenter.org/wp-content/uploads/2018/04/hacked-skull.jpg">
    
    <script>alert('這就是XSS攻擊')</script>
  9. 例如:
  10. 如果可以順利寫入表示已經可以防禦隱碼攻擊了

:::

書籍目錄

展開 | 闔起

https%3A%2F%2Fcampus-xoops.tn.edu.tw%2Fmodules%2Ftad_book3%2Fpage.php%3Ftbsn%3D52%26tbdsn%3D1799

計數器

今天: 4261426142614261
昨天: 5069506950695069
總計: 5134709513470951347095134709513470951347095134709