Phương thức Post và Get dùng để làm gì?
Phương thức POST và GET là hai phương thức chính để gửi dữ liệu từ trình duyệt web của người dùng đến máy chủ web.
-
Phương thức GET:
- Được sử dụng để yêu cầu dữ liệu từ máy chủ.
- Dữ liệu được gửi qua URL dưới dạng query string, được đính kèm sau dấu “?”.
- Thường được sử dụng cho các yêu cầu không nhạy cảm như việc lấy dữ liệu từ máy chủ như tìm kiếm, lọc dữ liệu, vv.
- Dễ dàng nhìn thấy các tham số trong URL, không nên chứa dữ liệu cần bảo mật như mật khẩu.
-
Phương thức POST:
- Được sử dụng để gửi dữ liệu từ form hoặc từ một yêu cầu khác đến máy chủ.
- Dữ liệu được gửi như một phần của body của yêu cầu HTTP, không hiển thị trực tiếp trong URL.
- Thường được sử dụng cho các yêu cầu cần bảo mật như việc gửi mật khẩu, thông tin cá nhân, vv.
- Dữ liệu được gửi đi dưới dạng ẩn danh, không dễ dàng nhìn thấy hoặc sửa đổi.
Khi lựa chọn giữa POST và GET, bạn cần cân nhắc mức độ bảo mật và tính chất của dữ liệu bạn đang gửi đi:
- Sử dụng GET cho các yêu cầu không làm thay đổi dữ liệu trên máy chủ và không chứa dữ liệu cần bảo mật.
- Sử dụng POST cho các yêu cầu làm thay đổi dữ liệu trên máy chủ hoặc chứa dữ liệu cần bảo mật.
Một ví dụ về sử dụng phương thức Post trong php
Tạo 1 file html có nội dung code như sau:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Form Example</title>
</head>
<body>
<form action="process.php" method="post">
<label for="username">Username:</label>
<input type="text" id="username" name="username">
<br>
<label for="password">Password:</label>
<input type="password" id="password" name="password">
<br>
<button type="submit">Submit</button>
</form>
</body>
</html>
Tạo file php process.php có nội dung code như sau:
<?php if ($_SERVER["REQUEST_METHOD"] == "POST") { $username = $_POST['username']; $password = $_POST['password']; // Xử lý dữ liệu ở đây, chẳng hạn kiểm tra đăng nhập, lưu vào cơ sở dữ liệu, vv. echo "Welcome, $username!"; } ?>
Kết quả thu được có thể như sau:
Một ví dụ về sử dụng phương thức Get trong php
Khi sử dụng phương thức GET trong PHP, dữ liệu được gửi từ form sẽ được thêm vào URL như các tham số query string. Đây là một ví dụ minh họa:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Form Example</title>
</head>
<body>
<form action="process.php" method="get">
<label for="username">Username:</label>
<input type="text" id="username" name="username">
<br>
<label for="password">Password:</label>
<input type="password" id="password" name="password">
<br>
<button type="submit">Submit</button>
</form>
</body>
</html>
Khi người dùng nhấn nút “Submit”, dữ liệu từ form sẽ được gửi dưới dạng query string đính kèm vào URL, ví dụ: process.php?username=haipm&password=123456
.
<?php if ($_SERVER["REQUEST_METHOD"] == "GET") { if (isset($_GET['username']) && isset($_GET['password'])) { $username = $_GET['username']; $password = $_GET['password']; // Xử lý dữ liệu ở đây, chẳng hạn kiểm tra đăng nhập, lưu vào cơ sở dữ liệu, vv. echo "Welcome, $username!"; } else { echo "Please provide both username and password."; } } ?>
Kết quả thu được sau khi điền thông tin như sau:
Trong PHP, khi sử dụng phương thức POST, dữ liệu được gửi từ form sẽ không xuất hiện trong URL, điều này giúp bảo mật hơn so với phương thức GET. Tuy nhiên, để đảm bảo an toàn dữ liệu, bạn cần lưu ý các điều sau:
-
- Validation: Luôn kiểm tra và xác nhận tính hợp lệ của dữ liệu được gửi từ form trước khi sử dụng nó. Điều này giúp ngăn chặn các cuộc tấn công như SQL injection và XSS (Cross-Site Scripting).
- Escape Output: Trước khi hiển thị dữ liệu từ người dùng (ví dụ: trong HTML), hãy đảm bảo rằng bạn đã sử dụng các hàm như
htmlspecialchars()
để tránh các cuộc tấn công XSS. - Sử dụng HTTPS: Đảm bảo rằng trang web của bạn được bảo vệ bằng HTTPS để mã hóa dữ liệu giữa trình duyệt và máy chủ.
- Ngăn chặn CSRF (Cross-Site Request Forgery): Sử dụng các biện pháp như token CSRF để ngăn chặn các cuộc tấn công CSRF, trong đó hacker có thể thực hiện các hành động không mong muốn trên tài khoản của người dùng.
- Xác thực: Yêu cầu người dùng xác thực trước khi cho họ truy cập vào các chức năng nhạy cảm hoặc thông tin cá nhân.
- Bảo mật dữ liệu: Không nên sử dụng phương thức GET để truyền dữ liệu nhạy cảm như mật khẩu, vì thông tin sẽ hiển thị trực tiếp trong URL.
- Giới hạn dữ liệu: Trong một số trường hợp, có thể giới hạn kích thước của dữ liệu được gửi bằng phương thức GET để tránh URL quá dài và gây ra lỗi hoặc tấn công từ chối dịch vụ (DoS).
Phần tử biểu mẫu
Mã HTML của biểu mẫu, chỗ <form sẽ có dạng như thế này:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
Khi biểu mẫu được gửi, dữ liệu biểu mẫu sẽ được gửi bằng phương thức = “post”.
Biến $_SERVER[“PHP_SELF”] là gì?
$_SERVER[“PHP_SELF”] là một biến siêu toàn cục trả về tên tệp của tập lệnh hiện đang thực thi.
Vì vậy, $_SERVER[“PHP_SELF”] gửi dữ liệu biểu mẫu đã gửi đến chính trang đó, thay vì chuyển sang một trang khác. Bằng cách này, người dùng sẽ nhận được thông báo lỗi trên cùng một trang với biểu mẫu.
Hàm htmlspecialchars() là gì?
Hàm htmlspecialchars() chuyển đổi các ký tự đặc biệt thành thực thể HTML. Điều này có nghĩa là nó sẽ thay thế các ký tự HTML như < và > bằng < và >. Điều này ngăn chặn kẻ tấn công khai thác mã bằng cách chèn mã HTML hoặc Javascript (tấn công Cross-site Scripting) vào biểu mẫu.
Xác thực dữ liệu biểu mẫu bằng PHP
Chúng tôi cũng sẽ thực hiện thêm hai việc nữa khi người dùng gửi biểu mẫu:
- Loại bỏ các ký tự không cần thiết (thêm khoảng trắng, tab, dòng mới) khỏi dữ liệu đầu vào của người dùng (với hàm PHP Trim())
- Xóa dấu gạch chéo ngược (\) khỏi dữ liệu đầu vào của người dùng (bằng hàm Striplashes() của PHP)
Bước tiếp theo là tạo một hàm sẽ thực hiện tất cả việc kiểm tra cho chúng ta (điều này thuận tiện hơn nhiều so với việc viết đi viết lại cùng một mã).
Chúng ta sẽ đặt tên hàm là test_input().
Bây giờ, chúng ta có thể kiểm tra từng biến $_POST bằng hàm test_input() và tập lệnh trông như thế này:
<?php
// define variables and set to empty values
$username = $password = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$username = test_input($_POST['username']);
$password = test_input($_POST['password']);
}
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
?>
Lưu ý rằng khi bắt đầu tập lệnh, chúng tôi kiểm tra xem biểu mẫu đã được gửi bằng $_SERVER[“REQUEST_METHOD”] hay chưa. Nếu REQUEST_METHOD là POST thì biểu mẫu đã được gửi – và nó sẽ được xác thực. Nếu nó chưa được gửi, hãy bỏ qua xác nhận và hiển thị một biểu mẫu trống.
Ngoài ra, bạn nên kiểm tra dữ liệu hợp lệ đầu vào lúc nhập dữ liệu. Xem thêm Tạo form html có kiểm tra dữ liệu đầu vào