PHP $_POST là một biến siêu toàn cầu PHP được sử dụng để thu thập dữ liệu biểu mẫu sau khi gửi biểu mẫu HTML với method="post". $_POST cũng được sử dụng rộng rãi để chuyển các biến
Ví dụ bên dưới hiển thị biểu mẫu có trường nhập và nút gửi. Khi người dùng gửi dữ liệu bằng cách nhấp vào "Gửi", dữ liệu biểu mẫu sẽ được gửi đến tệp được chỉ định trong thuộc tính hành động của
Khi người dùng điền vào biểu mẫu trên và nhấp vào nút gửi, dữ liệu biểu mẫu sẽ được gửi để xử lý thành tệp PHP có tên "welcome. php". Dữ liệu biểu mẫu được gửi bằng phương thức HTTP POST
Để hiển thị dữ liệu đã gửi, bạn chỉ cần lặp lại tất cả các biến. Sự đón chào. php" trông như thế này
Chào mừng
Địa chỉ email của bạn là.
Đầu ra có thể là một cái gì đó như thế này
Chào mừng John
Địa chỉ email của bạn là john. doe@ví dụ. com
Kết quả tương tự cũng có thể đạt được bằng cách sử dụng phương thức HTTP GET
Thí dụ
Tên.
E-mail.
và "welcome_get. php" trông như thế này
Chào mừng
Địa chỉ email của bạn là.
Đoạn mã trên khá đơn giản. Tuy nhiên, điều quan trọng nhất còn thiếu. Bạn cần xác thực dữ liệu biểu mẫu để bảo vệ tập lệnh của mình khỏi mã độc
Hãy nghĩ về BẢO MẬT khi xử lý các biểu mẫu PHP
Trang này không chứa bất kỳ xác thực biểu mẫu nào, nó chỉ hiển thị cách bạn có thể gửi và truy xuất dữ liệu biểu mẫu
Tuy nhiên, các trang tiếp theo sẽ chỉ ra cách xử lý các biểu mẫu PHP có tính đến bảo mật. Xác thực đúng dữ liệu biểu mẫu là rất quan trọng để bảo vệ biểu mẫu của bạn khỏi tin tặc và kẻ gửi thư rác
NHẬN so với. BƯU KIỆN
Cả GET và POST đều tạo một mảng [e. g. mảng [key1 => value1, key2 => value2, key3 => value3,. ]]. Mảng này chứa các cặp khóa/giá trị, trong đó khóa là tên của các điều khiển biểu mẫu và giá trị là dữ liệu đầu vào từ người dùng
Cả GET và POST đều được coi là $_GET và $_POST. Đây là các siêu toàn cầu, có nghĩa là chúng luôn có thể truy cập được, bất kể phạm vi - và bạn có thể truy cập chúng từ bất kỳ chức năng, lớp hoặc tệp nào mà không phải thực hiện bất kỳ điều gì đặc biệt
$_GET là một mảng các biến được truyền tới tập lệnh hiện tại thông qua các tham số URL
$_POST là một mảng các biến được truyền tới tập lệnh hiện tại thông qua phương thức HTTP POST
Khi nào thì sử dụng NHẬN?
Thông tin được gửi từ biểu mẫu bằng phương thức GET hiển thị cho mọi người [tất cả tên và giá trị biến được hiển thị trong URL]. GET cũng có giới hạn về lượng thông tin gửi. Giới hạn là khoảng 2000 ký tự. Tuy nhiên, vì các biến được hiển thị trong URL nên có thể đánh dấu trang. Điều này có thể hữu ích trong một số trường hợp
GET có thể được sử dụng để gửi dữ liệu không nhạy cảm
Ghi chú. KHÔNG BAO GIỜ được sử dụng GET để gửi mật khẩu hoặc thông tin nhạy cảm khác
Khi nào thì sử dụng POST?
Thông tin được gửi từ một biểu mẫu có phương thức POST sẽ ẩn đối với những người khác [tất cả các tên/giá trị được nhúng trong phần nội dung của yêu cầu HTTP] và không có giới hạn về lượng thông tin gửi
Ngoài ra, POST hỗ trợ chức năng nâng cao, chẳng hạn như hỗ trợ đầu vào nhị phân nhiều phần trong khi tải tệp lên máy chủ
Tuy nhiên, vì các biến không được hiển thị trong URL nên không thể đánh dấu trang
Các nhà phát triển thích POST để gửi dữ liệu biểu mẫu
Tiếp theo, hãy xem cách chúng tôi có thể xử lý biểu mẫu PHP theo cách an toàn
Bài tập PHP
Kiểm tra bản thân với các bài tập
Tập thể dục
Nếu biểu mẫu trong phần màu trắng bên dưới được gửi, làm thế nào bạn có thể, chào mừng. php, xuất giá trị từ trường "tên"?
php://input
php://temp
3 là luồng chỉ đọc cho phép bạn đọc dữ liệu thô từ phần thân yêu cầu. Trong trường hợp yêu cầu POST, tốt hơn là php://input
php://temp
4 vì nó không phụ thuộc vào php đặc biệt. ini chỉ thị. Ngoài ra, đối với những trường hợp mà php://input
php://temp
4 không được điền theo mặc định, đây là một giải pháp thay thế ít tốn bộ nhớ hơn để kích hoạt php://input
php://temp
6. php. // đầu vào không khả dụng với php://input
php://temp
7Kiểm tra hướng dẫn. http. //php. net/thủ công/vi/trình bao bọc. php. php
Giải pháp liên quan
Php – Cách ngăn SQL injection trong PHP
Cách chính xác để tránh các cuộc tấn công SQL injection, bất kể bạn sử dụng cơ sở dữ liệu nào, là tách dữ liệu khỏi SQL, để dữ liệu vẫn là dữ liệu và sẽ không bao giờ được trình phân tích cú pháp SQL diễn giải thành các lệnh. Có thể tạo câu lệnh SQL với các phần dữ liệu được định dạng chính xác, nhưng nếu bạn không hiểu đầy đủ chi tiết, bạn nên luôn sử dụng câu lệnh đã chuẩn bị sẵn và truy vấn được tham số hóa. Đây là các câu lệnh SQL được máy chủ cơ sở dữ liệu gửi đến và phân tích cú pháp riêng biệt với bất kỳ tham số nào. Bằng cách này, kẻ tấn công không thể tiêm SQL độc hại
Về cơ bản, bạn có hai lựa chọn để đạt được điều này
Sử dụng PDO [đối với mọi trình điều khiển cơ sở dữ liệu được hỗ trợ]
$stmt = $pdo->prepare['SELECT * FROM employees WHERE name = :name']; $stmt->execute[[ 'name' => $name ]]; foreach [$stmt as $row] { // Do something with $row }
Sử dụng MySQLi [dành cho MySQL]
$stmt = $dbConnection->prepare['SELECT * FROM employees WHERE name = ?']; $stmt->bind_param['s', $name]; // 's' specifies the variable type => 'string' $stmt->execute[]; $result = $stmt->get_result[]; while [$row = $result->fetch_assoc[]] { // Do something with $row }
Nếu bạn đang kết nối với cơ sở dữ liệu không phải MySQL, thì có tùy chọn thứ hai dành riêng cho trình điều khiển mà bạn có thể tham khảo [ví dụ:
php://input
php://temp
8 và php://input
php://temp
9 cho PostgreSQL]. PDO là tùy chọn phổ quátThiết lập kết nối chính xác
Lưu ý rằng khi sử dụng PDO để truy cập cơ sở dữ liệu MySQL, các câu lệnh chuẩn bị thực không được sử dụng theo mặc định. Để khắc phục điều này, bạn phải tắt mô phỏng các câu lệnh đã chuẩn bị. Một ví dụ về việc tạo kết nối bằng PDO là
$dbConnection = new PDO['mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'password'];
$dbConnection->setAttribute[PDO::ATTR_EMULATE_PREPARES, false];
$dbConnection->setAttribute[PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION];
Trong ví dụ trên, chế độ lỗi không thực sự cần thiết, nhưng bạn nên thêm nó vào. Bằng cách này, tập lệnh sẽ không dừng lại với số
php://input
php://temp
00 khi có sự cố xảy ra. Và nó mang lại cho nhà phát triển cơ hội php://input
php://temp
01 bất kỳ [các] lỗi nào php://input
php://temp
02n thành php://input
php://temp
03Tuy nhiên, điều bắt buộc là dòng
php://input
php://temp
04 đầu tiên, yêu cầu PDO tắt các câu lệnh đã chuẩn bị được mô phỏng và sử dụng các câu lệnh đã chuẩn bị thực sự. Điều này đảm bảo rằng câu lệnh và các giá trị không được PHP phân tích cú pháp trước khi gửi nó đến máy chủ MySQL [khiến kẻ tấn công không có cơ hội tiêm SQL độc hại]Mặc dù bạn có thể đặt
php://input
php://temp
05 trong các tùy chọn của hàm tạo, điều quan trọng cần lưu ý là các phiên bản 'cũ' của PHP [trước 5. 3. 6] âm thầm bỏ qua tham số bộ ký tự trong DSNGiải trình
Câu lệnh SQL bạn chuyển đến
php://input
php://temp
06 được máy chủ cơ sở dữ liệu phân tích cú pháp và biên dịch. Bằng cách chỉ định các tham số [hoặc một tham số php://input
php://temp
07 hoặc một tham số được đặt tên như php://input
php://temp
08 trong ví dụ trên], bạn cho công cụ cơ sở dữ liệu biết nơi bạn muốn lọc. Sau đó, khi bạn gọi php://input
php://temp
09, câu lệnh đã chuẩn bị được kết hợp với các giá trị tham số mà bạn chỉ địnhĐiều quan trọng ở đây là các giá trị tham số được kết hợp với câu lệnh đã biên dịch, không phải là chuỗi SQL. SQL injection hoạt động bằng cách lừa tập lệnh bao gồm các chuỗi độc hại khi nó tạo SQL để gửi đến cơ sở dữ liệu. Vì vậy, bằng cách gửi SQL thực riêng biệt với các tham số, bạn sẽ hạn chế rủi ro kết thúc bằng thứ mà bạn không có ý định
Bất kỳ tham số nào bạn gửi khi sử dụng câu lệnh đã chuẩn bị sẽ chỉ được coi là chuỗi [mặc dù công cụ cơ sở dữ liệu có thể thực hiện một số tối ưu hóa để tất nhiên, tham số cũng có thể kết thúc dưới dạng số]. Trong ví dụ trên, nếu biến
$stmt = $pdo->prepare['SELECT * FROM employees WHERE name = :name'];
$stmt->execute[[ 'name' => $name ]];
foreach [$stmt as $row] {
// Do something with $row
}
0 chứa $stmt = $pdo->prepare['SELECT * FROM employees WHERE name = :name'];
$stmt->execute[[ 'name' => $name ]];
foreach [$stmt as $row] {
// Do something with $row
}
1, kết quả sẽ chỉ là tìm kiếm chuỗi $stmt = $pdo->prepare['SELECT * FROM employees WHERE name = :name'];
$stmt->execute[[ 'name' => $name ]];
foreach [$stmt as $row] {
// Do something with $row
}
2 và bạn sẽ không nhận được một bảng trốngMột lợi ích khác của việc sử dụng các câu lệnh đã chuẩn bị là nếu bạn thực hiện cùng một câu lệnh nhiều lần trong cùng một phiên thì nó sẽ chỉ được phân tích cú pháp và biên dịch một lần, giúp bạn tăng tốc độ
Ồ, và vì bạn đã hỏi về cách thực hiện cho phần chèn, đây là một ví dụ [sử dụng PDO]
php://input
php://temp
3Câu lệnh đã chuẩn bị có thể được sử dụng cho các truy vấn động không?
Mặc dù bạn vẫn có thể sử dụng các câu lệnh đã chuẩn bị cho các tham số truy vấn, nhưng bản thân cấu trúc của truy vấn động không thể được tham số hóa và một số tính năng truy vấn nhất định không thể được tham số hóa
Đối với những trường hợp cụ thể này, điều tốt nhất cần làm là sử dụng bộ lọc danh sách trắng để hạn chế các giá trị có thể
php://input
php://temp
4Php – Bảng liệt kê trên PHP
Tùy thuộc vào trường hợp sử dụng, tôi thường sử dụng một cái gì đó đơn giản như sau
php://input
php://temp
5Tuy nhiên, các trường hợp sử dụng khác có thể yêu cầu xác thực nhiều hơn các hằng số và giá trị. Dựa trên các nhận xét bên dưới về sự phản ánh và một vài ghi chú khác, đây là một ví dụ mở rộng có thể phục vụ tốt hơn cho nhiều trường hợp hơn
php://input
php://temp
6Bằng cách tạo một lớp enum đơn giản mở rộng BasicEnum, giờ đây bạn có khả năng sử dụng các phương thức để xác thực đầu vào đơn giản
php://input
php://temp
0Như một lưu ý phụ, bất cứ khi nào tôi sử dụng sự phản chiếu ít nhất một lần trên lớp tĩnh/const nơi dữ liệu sẽ không thay đổi [chẳng hạn như trong một enum], tôi lưu trữ kết quả của các cuộc gọi phản chiếu đó, vì mỗi lần sử dụng các đối tượng phản chiếu mới
Bây giờ hầu hết mọi người cuối cùng đã nâng cấp lên ít nhất 5. 3 và
$stmt = $pdo->prepare['SELECT * FROM employees WHERE name = :name'];
$stmt->execute[[ 'name' => $name ]];
foreach [$stmt as $row] {
// Do something with $row
}
3 có sẵn, đó chắc chắn cũng là một lựa chọn khả thi--miễn là bạn không bận tâm đến khái niệm truyền thống không trực quan về việc có các khởi tạo enum thực tế trong cơ sở mã của bạn. Trong ví dụ trên, $stmt = $pdo->prepare['SELECT * FROM employees WHERE name = :name'];
$stmt->execute[[ 'name' => $name ]];
foreach [$stmt as $row] {
// Do something with $row
}
4 và $stmt = $pdo->prepare['SELECT * FROM employees WHERE name = :name'];
$stmt->execute[[ 'name' => $name ]];
foreach [$stmt as $row] {
// Do something with $row
}
5 hoàn toàn không thể được khởi tạo, chúng cũng không nên