PHP
whoami
-
fallnight
-
資工二甲
-
113屆 會長
-
女婕思
outline
-
什麼是PHP
-
怎麼撰寫並執行PHP
-
語法教學 ~
-
一些酷酷的東西
PHP是什麼?
PHP
-
世界上最好的語言
-
用於開發網頁應用程式
-
ex. 購物網站、社群媒體
-
-
腳本語言
-
弱型別語言
-
高容錯率

舉個栗子

網頁架構

HTTP請求方法
| GET | 取得資料 |
| POST | 提交資料 |
| HEAD | 要求與 GET 請求完全相同的回應 |
| PUT | 取代現有資料 |
| DELETE | 刪除資料 |
| CONNECT | 與目標資源識別的伺服器建立隧道 |
| OPTIONS | 描述目標資源的通信選項 |
| TRACE | 在目標資源的路徑上執行消息回送測試 |
| PATCH | 修改資料 |
GET & POST
-
GET 通常用於請求簡單的資訊,例如連結或圖片,以及查詢資源的信息
-
請求時資料會附在URL上,就像明信片上的地址
-
缺點:
-
大家都看得到訊息內容
-
會受 URL 的最大長度限制
-
GET & POST
-
POST 通常用於傳送登入的帳密、送出HTML表單
-
資料會寫在封包內部,就像裝進信封袋的信件
-
可傳遞的資訊較多,安全性也較高
-
不是絕對安全,可透過封包攔截找到相關資訊
看看 PHP 怎麼跟 POST 打配合
-
首先需要一個使用 POST 方法傳遞資料的表單
<form action="output.php" method="post">
<input type="text" name="username">
<input type="submit" value="傳送!">
</form>

實際在網頁中的效果 →
這就是前端
看看 PHP 怎麼跟 POST 打配合
-
然後要寫處裡表單資訊的 PHP
<?php
//output.php
$username = $_POST["username"];
echo "Hello, " . $username;
?>
實際在網頁中的效果 →


按下傳送後
這裡是後端
如何執行 PHP ?
下載 XAMPP


-
下載完畢後按 Apache 的 Start 按鈕
-
去瀏覽器打 http://localhost/
會自動導到 http://localhost/dashboard/
這個頁面,就代表安裝成功!

試著打開自己寫的PHP
-
去C槽找到剛剛下載的XAMPP的資料夾
-
在裡面找到 htdocs 這個資料夾
-
所有要執行的檔案都必須放在 htdocs
-
新增一個 php 檔案,
之後的課程就用它來測試 php 程式


<?php
echo 'Hello World!';
?>試著打開自己寫的PHP
-
去瀏覽器打 http://localhost/(剛剛創建的檔名)
ex. http://localhost/php0304.php -
看到 Hello World,就代表執行成功!

檔案路徑與網址的對應關係
-
以剛剛的檔案為例,它的檔案路徑是
C:\xampp\htdocs\php0304.php -
網址是
http://localhost/php0304.php
替換成
照抄
跟HTML同時使用?
<!DOCTYPE html>
<html lang="zh-Hant-TW">
<head>
<meta charset="utf-8">
<title>TRY!!</title>
<style>
h1{color: pink;}
</style>
</head>
<body style="background-color: powderblue;">
<h1 style="color: red;">fallnight</h1>
<img src="https://i.imgur.com/bp1EmIa.jpg" width="10%" height="10%" id=pic>
<h2>輔大資工二年級</h2>
<br>
<h1>Interest</h1>
<ul >
<li>遊戲 (原神啟動!</li>
<li>音樂</li>
<li>追劇</li>
</ul>
<br>
<h1>Who are u?</h1>
<input type="text" id=inputname>
<button onclick="change()">Hi</button>
<br>
<label id=who>(你誰)</label>
<label>, hello!</label>
</body>
</html><!DOCTYPE html>
<html lang="zh-Hant-TW">
<head>
<meta charset="utf-8">
<title>TRY!!</title>
<style>
h1{color: pink;}
</style>
</head>
<body style="background-color: powderblue;">
<h1 style="color: red;">
<?php
echo 'Welcome PHP';
?>
</h1>
<img src="https://i.imgur.com/bp1EmIa.jpg" width="10%" height="10%" id=pic>
<h2>輔大資工二年級</h2>
<br>
<h1>Interest</h1>
<ul >
<li>遊戲 (原神啟動!</li>
<li>音樂</li>
<li>追劇</li>
</ul>
<br>
<h1>Who are u?</h1>
<input type="text" id=inputname>
<button onclick="change()">Hi</button>
<br>
<label id=who>(你誰)</label>
<label>, hello!</label>
</body>
</html>語法教學時間~
變數
<?php
echo "echo 可以顯示文字<br>";
$num1 = 1;
$num2 = 0.123;
$str = "NISRA";
$c = true;
echo "整數num1 = $num1<br>";
echo "浮點數num2 = $num2<br>";
echo "字串str = $str<br>";
echo '單引號會將裡面的東東視為字串輸出,就算打上已宣告的變數 $str 也會直接顯示<br>';
echo "改成雙引號,就會輸出變數的值 $str ";
?>-
結尾記得加上分號 ;
-
變數名稱前面要加錢字號 $
-
// 註解
/* ... */ 多行註解 -
換行要使用 HTML 的 <br>
字串相連?相加?
<?php
$str = "123";
echo $str+"4"; // 127
echo "<br>";
echo $str."4"; // 1234
?>-
加號 + 是數學上的相加
-
想要連接多個字串、變數
可以用小數點 .
if 判斷式
<?php
date_default_timezone_set("Asia/Taipei");
$t = date("H");
if("6" <= $t && $t < "12"){
echo "Good morning!";
}
elseif("12" <= $t && $t < "18"){
echo "Good afternoon!";
}
else{
echo "Good night!";
}
?>迴圈
<?php
$num = array(1,2,3,4,5);
/*
$num = []; // 空陣列
$num[] = 1; // 索引值為0 = 1
$num[] = 2; // 索引值為1 = 2
$num[] = 3; // 索引值為2 = 3
$num[] = 4; // 索引值為3 = 4
$num[] = 5; // 索引值為4 = 5
*/
foreach($num as $n){
echo $n;
}
?><?php
$i = 1;
while($i < 10){
echo $i++;
}
?><?php
for($k = 1 ; $k <= 5 ; $k++)
{
if($k==5)
{
break;
}
elseif($k==3)
{
continue;
}
echo $k;
}
?><?php
$j = 9;
do{
echo $j--;
}while($j > 0);
?>- while
- do-while
- for
- foreach
Superglobal
| 名稱 | 說明 |
|---|---|
| $GLOBALS | 以陣列 (array) 方式儲存全域變數,變數 (variable) 名稱為字串 (string) 索引值 |
| $_SERVER | 以陣列方式儲存跟伺服器有關的變數,如使用者的 IP 、瀏覽器等 |
| $_GET | 以陣列方式儲存利用表單 get 傳送的變數 |
| $_POST | 以陣列方式儲存利用表單 post 傳送的變數 |
| $_FILES | 以陣列方式儲存利用表單檔案處理方面的變數 |
| $_COOKIE | 以陣列方式儲存利用 cookie 的變數 |
| $_SESSION | 以陣列方式儲存利用 session 的變數 |
| $_REQUEST | 接收 $_GET 、 $_POST 、 $_COOKIE 等變數 |
| $_ENV | 以陣列方式儲存環境相關變數 |
$_GET
<?php
if(isset($_GET['user']) && isset($_GET['age'])){
$name = $_GET['user'];
$years = $_GET['age'];
echo "Hello, $name<br>";
echo "U are $years years old.";
}
else echo "Who are you?";
?>-
isset(變數) → 檢查變數是否已宣告,且其值不為NULL
-
$_GET = [ 'user' => 'fallnight' , 'age' => '20' ]
索引鍵
索引鍵
值
URL
-
"統一資源定位器" = 網址
-
像地址可以在地圖找到正確的地點,透過網址可以找到對應的網頁
-
格式:
[協定類型]://[伺服器位址]:[埠號]/[檔案路徑][檔名]?[參數]#[片段ID] -
範例:
http://nisra.net:443/tmp/test.php?p=0&q=1#1
$_POST
<!-- php0304.php -->
<p>請輸入姓名:</p>
<form action="output.php" method="post">
<input type="text" name="user">
<input type="submit" value="確定">
</form><?php
//output.php
echo "Helloooooooo,".$_POST['user'];
?>- 先創建表單
- 新增 output.php,用來處理接收的表單內容

- 建議放在同一層資料夾且必須在 htdocs 裡面
放在一起
$_SERVER
<?php
echo $_SERVER['PHP_SELF']; // 當前正在執行的網頁檔案名稱
echo "<br>";
echo $_SERVER['SERVER_NAME']; // 當前運行網頁檔案所在的主機名稱
echo "<br>";
echo $_SERVER['HTTP_USER_AGENT']; // 瀏覽器的相關資訊
echo "<br>";
echo $_SERVER['SERVER_PORT']; // 伺服器網域的埠號
?>更多的 $_SERVER : https://www.php.net/manual/zh/reserved.variables.server.php
其他函式
<?php
date_default_timezone_set('Asia/Taipei');
echo date('Y/m/d H:i:s')."<br>"; // Y 年 m 月 d 日 H 點 i 分 s 秒
echo rand(1,10)."<br>"; // 1~10 內隨機輸出一個數字
$a = 1;
$b = 1.23;
$c = "NISRA";
var_dump($a,$b,$c);
?>preg_match()
-
用於比對字串是否與指定的模板格式相符
-
若相符函式會回傳 1 ,不符則回傳 0
-
preg_match(模板,輸入字串)
-
模板的頭尾要用 '/ 和 /' 框住
-
ex. 只能輸入5個0~9的數字
=> '/^[0-9]{5}$/' -
ex. 開頭必須是大寫,且只能輸入英文字母,字數不限
=> '/^[A-Z][a-zA-Z]*$/'
檢查輸入密碼的格式
<?php
//output.php
$pwd = $_REQUEST["pwd"];
if(preg_match('/(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])[a-zA-Z0-9]{8,}/',$pwd)){
echo "你輸入的密碼是: $pwd<br>格式正確!";
}
else{
echo "你輸入的密碼是: $pwd<br>格式錯誤!";
}
?><!-- php0304.php -->
<form action="output.php" method="post">
<p>請輸入密碼</p>
<p>密碼需要8個字以上,且包含小寫、大寫英文字母及數字至少各一個</p>
<input type="password" name="pwd">
<input type="submit" value="確定">
</form>- 先創建表單
- 新增 output.php,用來處理接收的表單內容
== vs ===
- 因為 PHP 是弱型別語言
- == 只比較值
=== 比較值跟型態
<?php
$a = 5;
$b = "5";
var_dump($a == $b);
var_dump($a === $b);
?>
這是使用 == 的各種結果
"php" == 0 是 TRUE???
如果是用 === 就非常嚴謹

MD5 驗證繞過
-
什麼是MD5 ?
-
一種雜湊函式
-
php有函式可以用
-
md5(變數)
-
-
暴力破解工具
-
Lab time - MD5 0x1
-
註冊需要的 token : NISRA{w3Lc0me_T0_N15RA_1132}
<?php
highlight_file(__FILE__);
$FROM_INCLUDE = true;
include("flag.php");
$msg = "";
if (isset($_GET['user']) && isset($_GET['password'])) {
$user = $_GET['user'];
$password = $_GET['password'];
$check = "QNKCDZO";
// the md5 of "QNKCDZO" is 0e830400451993494058024219903391
if ($user == "admin" && $password != $check && md5($password) == md5($check)) {
$msg = "Flag: ".$flag;
} else {
$msg = "Keep trying!";
}
}
echo $msg;
?>Lab time - MD5 0x2
<?php
highlight_file(__FILE__);
$FROM_INCLUDE = true;
include("flag.php");
$msg = "";
if (isset($_GET['user']) && isset($_GET['password'])) {
$user = $_GET['user'];
$password = $_GET['password'];
if($user === $password){
echo "user can not equal to password";
}
else if(md5($user) === md5($password)){
$msg = "Flag: ".$flag;
}
else{
$msg = "Keep trying!";
}
}
echo $msg;
?>PHP
By fallnight
PHP
- 91