Hướng dẫn how to secure _get request in php - cách bảo mật yêu cầu _get trong php

Cách tốt nhất để đảm bảo yêu cầu nhận hoặc có bất kỳ, các lựa chọn thay thế an toàn hơn?


Tôi đang sử dụng một vài yêu cầu GET trong trang web của mình để tạo các trang web một cách linh hoạt và xóa các bản ghi dựa trên ID.

Người cuối cùng làm tôi lo lắng một chút, bởi vì mọi người chỉ có thể thay đổi URL thành bất kỳ tệp nào họ muốn xóa.

Để có quyền truy cập vào tệp xóa, họ cần phải đăng nhập và có một số quyền nhất định, điều này sẽ gây ra lỗi nếu họ không có đủ quyền.


Tôi đã bắt gặp một bài đăng thực sự cũ, nói rằng bạn nên sử dụng chức năng mysqli_real_escape_string để làm cho nó ít nhất an toàn hơn.

Tôi cũng đọc về xác thực thực sự quan trọng, vì vậy tôi đã suy nghĩ về việc kiểm tra xem ID có phải là số nguyên thực tế hay không.

Có một bài đăng khác nói rằng việc ẩn yêu cầu trong URL về cơ bản là vô dụng, vì yêu cầu sẽ luôn là một phần của URL.


Đây là tệp xóa của tôi, nó sử dụng hai câu lệnh, một câu xóa bài đăng thực tế và bản còn lại xóa các hình ảnh liên quan với bài đăng đó.

include('./utils/auth.php');

require('./utils/db.php');

$stmt_1 = $connect->prepare('DELETE FROM `dias` WHERE diaserie_id = ?');

if($stmt_1) {
    $id = $_GET['id'];
    $stmt_1->bind_param('i', $id);
    if($stmt_1->execute()) {
        // Als de afbeeldingen uit de database zijn, verwijder dan ook de serie zelf
        $stmt_2 = $connect->prepare('DELETE FROM `diaseries` WHERE diaserie_id = ?');
        if($stmt_2) {
            $stmt_2->bind_param('i', $id);
            if($stmt_2->execute()) {
                echo "Both the files and post have been deleted.";
            } else {
                echo "The files have been deleted, the post iself could not be deleted.";
            }
        }
    } else {
        echo "Files and post could not be deleted.";
    }
}

Bài đăng này cũng có sẵn trong các ngôn ngữ sau: Bồ Đào Nha.

Trong bài viết này, chúng tôi sẽ đề cập đến hai phương thức yêu cầu: các phương thức GET và POST, để gửi và nhận dữ liệu từ biểu mẫu HTML bằng PHP. Ngoài ra, chúng tôi sẽ kiểm tra các vấn đề phổ biến nhất liên quan đến bảo mật thông tin, chẳng hạn như kịch bản chéo trang (XSS) và tiêm SQL, và cách giải quyết chúng với sự khử trùng đầy đủ.

Hãy bắt đầu với lý thuyết: những gì nhận được và đăng yêu cầu, và chúng khác nhau như thế nào? - Nếu bạn muốn, bạn có thể bỏ qua phần tiếp theo, nơi chúng tôi sẽ bắt đầu với việc thực hành.

Hiểu các phương pháp GET và POST

Giao thức chuyển siêu văn bản (HTTP) được phát triển như một giao thức để phục vụ việc truyền tài liệu và hoạt động như một trung gian giữa các trình duyệt Internet và máy chủ web. Bạn đã quen với việc đọc nó trong các địa chỉ của các trang web - cũng như anh em của nó, HTTPS, một phiên bản được mã hóa an toàn hơn (do đó là S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S).

Nói cách khác, HTTP là một giao thức phục vụ như một cây cầu trên mạng: nó thu thập một yêu cầu từ trình duyệt Internet; gửi nó đến máy chủ; chờ đợi một câu trả lời; Và cuối cùng, nó trả lại thông tin mới cho trình duyệt.

Nói chung, các yêu cầu này giữ một số siêu dữ liệu trong tiêu đề của họ, có chứa các thông báo được sử dụng để thực hiện một số hành vi nhất định trên máy khách hoặc trên máy chủ. Ngoài ra, các yêu cầu HTTP có thể giả sử các mô hình khác nhau.

Các loại yêu cầu HTTP được sử dụng nhiều nhất là nhận và đăng, nhưng có các loại khác trong đặc tả kỹ thuật của chúng, chẳng hạn như PUT, HEAD, DELETE,

POST /update/webform.php HTTP/1.1
Host: youtube.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 42
user=Stevie&playlist=British&v=fJ9rUzIMcZQ
0 và
POST /update/webform.php HTTP/1.1
Host: youtube.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 42
user=Stevie&playlist=British&v=fJ9rUzIMcZQ
1. Đối với các mục đích của bài viết này, chúng tôi sẽ chỉ tập trung vào hai phổ biến nhất.

Yêu cầu nhận

Phương thức Get yêu cầu được sử dụng khi bạn muốn lấy dữ liệu từ một nguồn hoặc tài nguyên cụ thể. Nó chỉ nên được sử dụng để truy xuất dữ liệu, vì chuỗi truy vấn của nó được gửi và hiển thị tại URL, ví dụ:

POST /update/webform.php HTTP/1.1
Host: youtube.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 42
user=Stevie&playlist=British&v=fJ9rUzIMcZQ
2.

Khi chúng tôi chèn URL này vào trình duyệt, chúng tôi đang yêu cầu máy chủ YouTube cho một tài nguyên cụ thể: để lấy dữ liệu từ video

POST /update/webform.php HTTP/1.1
Host: youtube.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 42
user=Stevie&playlist=British&v=fJ9rUzIMcZQ
3 được xác định là
POST /update/webform.php HTTP/1.1
Host: youtube.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 42
user=Stevie&playlist=British&v=fJ9rUzIMcZQ
4. Ngay khi máy chủ trả về yêu cầu, giao thức HTTP sẽ cho trình duyệt biết cách hiển thị video, trong ví dụ này, video chính thức cho bài hát Boh Bohemian Rhapsody, bởi ban nhạc của Nữ hoàng Anh.

Lưu ý rằng trong ví dụ của chúng tôi, tham số thứ hai của yêu cầu GET, tham số

POST /update/webform.php HTTP/1.1
Host: youtube.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 42
user=Stevie&playlist=British&v=fJ9rUzIMcZQ
5, thông báo thời gian bắt đầu mà chúng tôi mong đợi trong phản hồi của chúng tôi, trong trường hợp này, từ 3 phút và 5S. Các tham số
POST /update/webform.php HTTP/1.1
Host: youtube.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 42
user=Stevie&playlist=British&v=fJ9rUzIMcZQ
3 và
POST /update/webform.php HTTP/1.1
Host: youtube.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 42
user=Stevie&playlist=British&v=fJ9rUzIMcZQ
5 được phân tách bằng ký tự
POST /update/webform.php HTTP/1.1
Host: youtube.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 42
user=Stevie&playlist=British&v=fJ9rUzIMcZQ
8, chỉ ra giao thức HTTP trong đó các cặp giá trị khóa-khóa của các tham số này bắt đầu và kết thúc. Vì vậy, máy chủ biết chính xác rằng bạn tìm kiếm video
POST /update/webform.php HTTP/1.1
Host: youtube.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 42
user=Stevie&playlist=British&v=fJ9rUzIMcZQ
9 tại thời điểm

<form method="GET" id="webform" name="webform" action="target.php">
form>
0.

Nhận các yêu cầu thường bị giới hạn về chiều dài - đối với hầu hết các trình duyệt, nó lên tới 8 kb hoặc 8192 byte trong URI - và vì chúng chỉ phục vụ để yêu cầu dữ liệu, chúng không thể sửa đổi nó. Ngoài ra, chúng có thể được lưu trữ trong bộ đệm, trong lịch sử của trình duyệt và cả trong các dấu trang. Đó là lý do tại sao bạn không bao giờ nên sử dụng nó để gửi dữ liệu nhạy cảm, chẳng hạn như số an sinh xã hội và mật khẩu người dùng.never use it to send sensitive data, such as Social Security Numbers and user passwords.

Tuy nhiên, một số nhà phát triển bỏ qua nó và phơi bày dữ liệu cá nhân và nhạy cảm của mọi người trên internet. Ở Brazil, do Luật bảo vệ dữ liệu cá nhân chung (LGPD), thực tiễn này có thể gây ra những bất tiện lớn, chẳng hạn như các hình phạt nghiêm trọng đối với công ty hoặc đối với những người vận hành và quản lý dữ liệu này, khi xảy ra rò rỉ. Vì vậy, thực tiễn tốt nhất là không bao giờ gửi dữ liệu cá nhân nhạy cảm thông qua phương thức GET.never send sensitive personal data via the GET method.

Yêu cầu bài viết

Phương thức yêu cầu POST được sử dụng để gửi dữ liệu đến máy chủ, để cập nhật hoặc tạo tài nguyên mới.

Không giống như phương thức GET, phương thức POST không hiển thị thông tin tại địa chỉ URL. Trong trường hợp này, dữ liệu được truyền trong thân yêu cầu HTTP, như sau:

POST /update/webform.php HTTP/1.1
Host: youtube.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 42
user=Stevie&playlist=British&v=fJ9rUzIMcZQ

Trong ví dụ này, chúng tôi đang thông báo cho máy chủ


<form method="GET" id="webform" name="webform" action="target.php">
form>
1 rằng chúng tôi sẽ thực hiện yêu cầu phương thức

<form method="GET" id="webform" name="webform" action="target.php">
form>
2 đến địa chỉ

<form method="GET" id="webform" name="webform" action="target.php">
form>
3, sử dụng các thông số kỹ thuật của giao thức

<form method="GET" id="webform" name="webform" action="target.php">
form>
4. Chúng tôi cũng chỉ ra rằng có 42 thông tin ký tự (

<form method="GET" id="webform" name="webform" action="target.php">
form>
5), theo định dạng nội dung

<form method="GET" id="webform" name="webform" action="target.php">
form>
6 tiêu chuẩn, có giá trị là

<form method="GET" id="webform" name="webform" action="target.php">
form>
7. Cuối cùng, thông tin của chúng tôi nằm ở dòng dưới cùng, chứa 3 tham số:

<form method="GET" id="webform" name="webform" action="target.php">
form>
8,

<form method="GET" id="webform" name="webform" action="target.php">
form>
9 và
POST /update/webform.php HTTP/1.1
Host: youtube.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 42
user=Stevie&playlist=British&v=fJ9rUzIMcZQ
3.

Thông tin di chuyển trong phần thân của yêu cầu HTTP có thể bị chặn bởi các tác nhân xấu. Sau đó, thực tiễn tốt nhất là thực hiện các lần truyền này bằng cách sử dụng mã hóa, thông qua giao thức HTTPS, do đó, việc họ đọc thông tin này khó khăn hơn.

Giả sử máy chủ YouTube đã nhận ra yêu cầu của chúng tôi và địa chỉ này là hợp lệ. Trong ví dụ của chúng tôi, video được thông báo mà chúng tôi nhận được trước đó, sẽ được thêm vào danh sách phát


html>
<html>
<head>
    <meta charset="utf-8">
    <title>Electronic formtitle>
head>
<body>
    <form method="GET" id="webform" name="webform" action="target.php">
        <label for="iduser">User ID:label>
        <input type="text" id="iduser" name="iduser"> <br />

        <label for="idplaylist">Playlist ID:label>
        <input type="text" id="idplaylist" name="idplaylist"> <br />

        <label for="v">Video ID:label>
        <input type="text" id="v" name="v" value="fJ9rUzIMcZQ"> <br />

        <button type="submit">Send databutton>
    form>
body>
html>
1 của người dùng được xác định là

html>
<html>
<head>
    <meta charset="utf-8">
    <title>Electronic formtitle>
head>
<body>
    <form method="GET" id="webform" name="webform" action="target.php">
        <label for="iduser">User ID:label>
        <input type="text" id="iduser" name="iduser"> <br />

        <label for="idplaylist">Playlist ID:label>
        <input type="text" id="idplaylist" name="idplaylist"> <br />

        <label for="v">Video ID:label>
        <input type="text" id="v" name="v" value="fJ9rUzIMcZQ"> <br />

        <button type="submit">Send databutton>
    form>
body>
html>
2.

Lưu ý rằng đây là một yêu cầu một lần, không có khả năng được lặp lại. Theo quy định, phương thức POST, không giống như GET, không được lưu trữ trong bộ đệm hoặc trong lịch sử trình duyệt của khách hàng, cũng như không thể lưu trong các dấu trang. Các yêu cầu POST không có hạn chế về kích thước của tin nhắn, cho phép chúng tôi gửi các bài viết hoàn chỉnh, chẳng hạn như bài viết này, thông qua mẫu HTML điện tử chẳng hạn. Ngoài ra, phương pháp POST hỗ trợ nhiều loại


<form method="GET" id="webform" name="webform" action="target.php">
form>
6, bao gồm các tài liệu nhị phân, chuỗi và số.

Phương pháp bài thường được ưa thích hơn get. Tuy nhiên, có những tình huống trong đó chúng tôi nên bao gồm dữ liệu yêu cầu trong URL địa chỉ: ví dụ: trong các biểu mẫu tìm kiếm hoặc bằng cách hiển thị tài liệu và video, vì chúng tôi muốn khách hàng có thể lặp lại nó dễ dàng và truy cập lại địa chỉ thông qua lịch sử của trình duyệt.

Tạo các biểu mẫu với HTML và PHP

Bây giờ chúng tôi đã hiểu cách các phương thức GET và POST hoạt động trong lý thuyết, chúng ta hãy đi đến các thực tiễn: Hãy tạo biểu mẫu HTML và để gửi và nhận thông tin bằng PHP.

Có một số cách để làm điều này, như thông qua JavaScript và Ajax, nơi người dùng không phải làm mới trang, vì chúng tôi đang truyền thông tin không đồng bộ. Đối với các mục đích của bài viết này, chúng tôi sẽ chỉ tập trung vào các công nghệ HTML và PHP.

Chèn biểu mẫu trên trang

Bước đầu tiên để tạo trang web của chúng tôi là thông báo cấu trúc của phần tử


html>
<html>
<head>
    <meta charset="utf-8">
    <title>Electronic formtitle>
head>
<body>
    <form method="GET" id="webform" name="webform" action="target.php">
        <label for="iduser">User ID:label>
        <input type="text" id="iduser" name="iduser"> <br />

        <label for="idplaylist">Playlist ID:label>
        <input type="text" id="idplaylist" name="idplaylist"> <br />

        <label for="v">Video ID:label>
        <input type="text" id="v" name="v" value="fJ9rUzIMcZQ"> <br />

        <button type="submit">Send databutton>
    form>
body>
html>
4 sẽ chứa các trường nơi người dùng nhập dữ liệu, như thế này:


<form method="GET" id="webform" name="webform" action="target.php">
form>

Trong đoạn này, chúng tôi đang sử dụng phương thức GET, được xác định trong


html>
<html>
<head>
    <meta charset="utf-8">
    <title>Electronic formtitle>
head>
<body>
    <form method="GET" id="webform" name="webform" action="target.php">
        <label for="iduser">User ID:label>
        <input type="text" id="iduser" name="iduser"> <br />

        <label for="idplaylist">Playlist ID:label>
        <input type="text" id="idplaylist" name="idplaylist"> <br />

        <label for="v">Video ID:label>
        <input type="text" id="v" name="v" value="fJ9rUzIMcZQ"> <br />

        <button type="submit">Send databutton>
    form>
body>
html>
5, để gửi thông tin sẽ được chèn vào biểu mẫu, tên được xác định trong

html>
<html>
<head>
    <meta charset="utf-8">
    <title>Electronic formtitle>
head>
<body>
    <form method="GET" id="webform" name="webform" action="target.php">
        <label for="iduser">User ID:label>
        <input type="text" id="iduser" name="iduser"> <br />

        <label for="idplaylist">Playlist ID:label>
        <input type="text" id="idplaylist" name="idplaylist"> <br />

        <label for="v">Video ID:label>
        <input type="text" id="v" name="v" value="fJ9rUzIMcZQ"> <br />

        <button type="submit">Send databutton>
    form>
body>
html>
6, đến trang đích (

html>
<html>
<head>
    <meta charset="utf-8">
    <title>Electronic formtitle>
head>
<body>
    <form method="GET" id="webform" name="webform" action="target.php">
        <label for="iduser">User ID:label>
        <input type="text" id="iduser" name="iduser"> <br />

        <label for="idplaylist">Playlist ID:label>
        <input type="text" id="idplaylist" name="idplaylist"> <br />

        <label for="v">Video ID:label>
        <input type="text" id="v" name="v" value="fJ9rUzIMcZQ"> <br />

        <button type="submit">Send databutton>
    form>
body>
html>
7).

Chèn các trường vào biểu mẫu

Bước tiếp theo là chèn các trường hoặc


html>
<html>
<head>
    <meta charset="utf-8">
    <title>Electronic formtitle>
head>
<body>
    <form method="GET" id="webform" name="webform" action="target.php">
        <label for="iduser">User ID:label>
        <input type="text" id="iduser" name="iduser"> <br />

        <label for="idplaylist">Playlist ID:label>
        <input type="text" id="idplaylist" name="idplaylist"> <br />

        <label for="v">Video ID:label>
        <input type="text" id="v" name="v" value="fJ9rUzIMcZQ"> <br />

        <button type="submit">Send databutton>
    form>
body>
html>
8 vào biểu mẫu của chúng tôi, nơi người dùng có thể nhập các giá trị. Hãy cập nhật tệp nguồn của chúng tôi như thế này:


html>
<html>
<head>
    <meta charset="utf-8">
    <title>Electronic formtitle>
head>
<body>
    <form method="GET" id="webform" name="webform" action="target.php">
        <label for="iduser">User ID:label>
        <input type="text" id="iduser" name="iduser"> <br />

        <label for="idplaylist">Playlist ID:label>
        <input type="text" id="idplaylist" name="idplaylist"> <br />

        <label for="v">Video ID:label>
        <input type="text" id="v" name="v" value="fJ9rUzIMcZQ"> <br />

        <button type="submit">Send databutton>
    form>
body>
html>

Chúng tôi đã chèn 3 trường, được xác định bởi thẻ HTML


html>
<html>
<head>
    <meta charset="utf-8">
    <title>Electronic formtitle>
head>
<body>
    <form method="GET" id="webform" name="webform" action="target.php">
        <label for="iduser">User ID:label>
        <input type="text" id="iduser" name="iduser"> <br />

        <label for="idplaylist">Playlist ID:label>
        <input type="text" id="idplaylist" name="idplaylist"> <br />

        <label for="v">Video ID:label>
        <input type="text" id="v" name="v" value="fJ9rUzIMcZQ"> <br />

        <button type="submit">Send databutton>
    form>
body>
html>
9 và cũng là 1 nút gửi dữ liệu của biểu mẫu, sử dụng


    // Prints the values of each field on the page
    echo(
    "The user identified as " . $_GET["iduser"] . " added the video whose ID is " . $_GET["v"] . " to the playlist " . $_GET["idplaylist"] . "."
    );
?>
0.

Chúng tôi cũng thêm nhãn vào các trường văn bản, sử dụng các thẻ



    // Prints the values of each field on the page
    echo(
    "The user identified as " . $_GET["iduser"] . " added the video whose ID is " . $_GET["v"] . " to the playlist " . $_GET["idplaylist"] . "."
    );
?>
1. Lưu ý rằng mỗi giá trị trên các thuộc tính


    // Prints the values of each field on the page
    echo(
    "The user identified as " . $_GET["iduser"] . " added the video whose ID is " . $_GET["v"] . " to the playlist " . $_GET["idplaylist"] . "."
    );
?>
2, trên mỗi phần tử


    // Prints the values of each field on the page
    echo(
    "The user identified as " . $_GET["iduser"] . " added the video whose ID is " . $_GET["v"] . " to the playlist " . $_GET["idplaylist"] . "."
    );
?>
3 tương ứng với thuộc tính


    // Prints the values of each field on the page
    echo(
    "The user identified as " . $_GET["iduser"] . " added the video whose ID is " . $_GET["v"] . " to the playlist " . $_GET["idplaylist"] . "."
    );
?>
4 của một trường

html>
<html>
<head>
    <meta charset="utf-8">
    <title>Electronic formtitle>
head>
<body>
    <form method="GET" id="webform" name="webform" action="target.php">
        <label for="iduser">User ID:label>
        <input type="text" id="iduser" name="iduser"> <br />

        <label for="idplaylist">Playlist ID:label>
        <input type="text" id="idplaylist" name="idplaylist"> <br />

        <label for="v">Video ID:label>
        <input type="text" id="v" name="v" value="fJ9rUzIMcZQ"> <br />

        <button type="submit">Send databutton>
    form>
body>
html>
8, như thế này:


    // Prints the values of each field on the page
    echo(
    "The user identified as " . $_GET["iduser"] . " added the video whose ID is " . $_GET["v"] . " to the playlist " . $_GET["idplaylist"] . "."
    );
?>
6 đề cập cụ thể đến trường chứa thuộc tính


    // Prints the values of each field on the page
    echo(
    "The user identified as " . $_GET["iduser"] . " added the video whose ID is " . $_GET["v"] . " to the playlist " . $_GET["idplaylist"] . "."
    );
?>
7 tương ứng và ngược lại.

Có thể chèn các giá trị được xác định trước vào các trường, thêm dữ liệu tương ứng với thuộc tính



    // Prints the values of each field on the page
    echo(
    "The user identified as " . $_GET["iduser"] . " added the video whose ID is " . $_GET["v"] . " to the playlist " . $_GET["idplaylist"] . "."
    );
?>
8 trong mỗi phần tử HTML

html>
<html>
<head>
    <meta charset="utf-8">
    <title>Electronic formtitle>
head>
<body>
    <form method="GET" id="webform" name="webform" action="target.php">
        <label for="iduser">User ID:label>
        <input type="text" id="iduser" name="iduser"> <br />

        <label for="idplaylist">Playlist ID:label>
        <input type="text" id="idplaylist" name="idplaylist"> <br />

        <label for="v">Video ID:label>
        <input type="text" id="v" name="v" value="fJ9rUzIMcZQ"> <br />

        <button type="submit">Send databutton>
    form>
body>
html>
9.

Cuối cùng, thuộc tính



    // Prints the values of each field on the page
    echo(
    "The user identified as " . htmlspecialchars($_GET["iduser"], ENT_QUOTES, "UTF-8") . " added the video whose ID is " . htmlspecialchars($_GET["v"], ENT_QUOTES, "UTF-8") . " to the playlist " . htmlspecialchars($_GET["idplaylist"], ENT_QUOTES, "UTF-8") . "."
    );
?>
0 trong mỗi trường

html>
<html>
<head>
    <meta charset="utf-8">
    <title>Electronic formtitle>
head>
<body>
    <form method="GET" id="webform" name="webform" action="target.php">
        <label for="iduser">User ID:label>
        <input type="text" id="iduser" name="iduser"> <br />

        <label for="idplaylist">Playlist ID:label>
        <input type="text" id="idplaylist" name="idplaylist"> <br />

        <label for="v">Video ID:label>
        <input type="text" id="v" name="v" value="fJ9rUzIMcZQ"> <br />

        <button type="submit">Send databutton>
    form>
body>
html>
9 sẽ được sử dụng để có được các giá trị được người dùng chèn vào trường tương ứng khi chúng ta chuyển sang PHP.

Kết quả cuối cùng, được hiển thị trong trình duyệt của máy khách, sẽ trông như thế này:

Hướng dẫn how to secure _get request in php - cách bảo mật yêu cầu _get trong php

Đọc dữ liệu với PHP

Sau khi hoàn thành biểu mẫu HTML của chúng tôi, chúng tôi có thể chuyển sang bước tiếp theo. Hãy xác định các yếu tố của trang đích bằng PHP.

Mã nguồn bên dưới, được chèn vào tệp



    // Prints the values of each field on the page
    echo(
    "The user identified as " . htmlspecialchars($_GET["iduser"], ENT_QUOTES, "UTF-8") . " added the video whose ID is " . htmlspecialchars($_GET["v"], ENT_QUOTES, "UTF-8") . " to the playlist " . htmlspecialchars($_GET["idplaylist"], ENT_QUOTES, "UTF-8") . "."
    );
?>
2, sẽ được thực hiện bởi PHP ngay khi người dùng gửi dữ liệu biểu mẫu mà chúng tôi đã tạo trước đó.



    // Prints the values of each field on the page
    echo(
    "The user identified as " . $_GET["iduser"] . " added the video whose ID is " . $_GET["v"] . " to the playlist " . $_GET["idplaylist"] . "."
    );
?>

Lưu ý rằng chúng tôi sử dụng biến SuperGlobal



    // Prints the values of each field on the page
    echo(
    "The user identified as " . htmlspecialchars($_GET["iduser"], ENT_QUOTES, "UTF-8") . " added the video whose ID is " . htmlspecialchars($_GET["v"], ENT_QUOTES, "UTF-8") . " to the playlist " . htmlspecialchars($_GET["idplaylist"], ENT_QUOTES, "UTF-8") . "."
    );
?>
3 để có được các giá trị được người dùng chèn vào, được truyền bằng giao thức HTTP. Đối với mỗi trường

html>
<html>
<head>
    <meta charset="utf-8">
    <title>Electronic formtitle>
head>
<body>
    <form method="GET" id="webform" name="webform" action="target.php">
        <label for="iduser">User ID:label>
        <input type="text" id="iduser" name="iduser"> <br />

        <label for="idplaylist">Playlist ID:label>
        <input type="text" id="idplaylist" name="idplaylist"> <br />

        <label for="v">Video ID:label>
        <input type="text" id="v" name="v" value="fJ9rUzIMcZQ"> <br />

        <button type="submit">Send databutton>
    form>
body>
html>
9 mà trước đây chúng tôi đã tạo trên biểu mẫu, thuộc tính


    // Prints the values of each field on the page
    echo(
    "The user identified as " . htmlspecialchars($_GET["iduser"], ENT_QUOTES, "UTF-8") . " added the video whose ID is " . htmlspecialchars($_GET["v"], ENT_QUOTES, "UTF-8") . " to the playlist " . htmlspecialchars($_GET["idplaylist"], ENT_QUOTES, "UTF-8") . "."
    );
?>
0 tương ứng của nó phải được thông báo trong biến SuperGlobal. Ví dụ: trường

html>
<html>
<head>
    <meta charset="utf-8">
    <title>Electronic formtitle>
head>
<body>
    <form method="GET" id="webform" name="webform" action="target.php">
        <label for="iduser">User ID:label>
        <input type="text" id="iduser" name="iduser"> <br />

        <label for="idplaylist">Playlist ID:label>
        <input type="text" id="idplaylist" name="idplaylist"> <br />

        <label for="v">Video ID:label>
        <input type="text" id="v" name="v" value="fJ9rUzIMcZQ"> <br />

        <button type="submit">Send databutton>
    form>
body>
html>
9 hiển thị thuộc tính


    // Prints the values of each field on the page
    echo(
    "The user identified as " . htmlspecialchars($_GET["iduser"], ENT_QUOTES, "UTF-8") . " added the video whose ID is " . htmlspecialchars($_GET["v"], ENT_QUOTES, "UTF-8") . " to the playlist " . htmlspecialchars($_GET["idplaylist"], ENT_QUOTES, "UTF-8") . "."
    );
?>
7 có thể được tìm thấy trong PHP bằng cách sử dụng


    // Prints the values of each field on the page
    echo(
    "The user identified as " . htmlspecialchars($_GET["iduser"], ENT_QUOTES, "UTF-8") . " added the video whose ID is " . htmlspecialchars($_GET["v"], ENT_QUOTES, "UTF-8") . " to the playlist " . htmlspecialchars($_GET["idplaylist"], ENT_QUOTES, "UTF-8") . "."
    );
?>
8.

PHP có một số biến SuperGlobals bản địa, chẳng hạn như



    // Prints the values of each field on the page
    echo(
    "The user identified as " . htmlspecialchars($_GET["iduser"], ENT_QUOTES, "UTF-8") . " added the video whose ID is " . htmlspecialchars($_GET["v"], ENT_QUOTES, "UTF-8") . " to the playlist " . htmlspecialchars($_GET["idplaylist"], ENT_QUOTES, "UTF-8") . "."
    );
?>
9, mysqli_real_escape_string0 và mysqli_real_escape_string1. Hãy nhớ rằng chúng tôi sử dụng chúng theo phương thức yêu cầu HTTP mà chúng tôi đang sử dụng để truyền dữ liệu, do đó, nó phải tương ứng với những gì được xác định trong thuộc tính mysqli_real_escape_string2 của phần tử

html>
<html>
<head>
    <meta charset="utf-8">
    <title>Electronic formtitle>
head>
<body>
    <form method="GET" id="webform" name="webform" action="target.php">
        <label for="iduser">User ID:label>
        <input type="text" id="iduser" name="iduser"> <br />

        <label for="idplaylist">Playlist ID:label>
        <input type="text" id="idplaylist" name="idplaylist"> <br />

        <label for="v">Video ID:label>
        <input type="text" id="v" name="v" value="fJ9rUzIMcZQ"> <br />

        <button type="submit">Send databutton>
    form>
body>
html>
4 của chúng tôi.according to the HTTP request method that we are using for data transmission, so it must correspond to what been defined in the mysqli_real_escape_string2 attribute of our

html>
<html>
<head>
    <meta charset="utf-8">
    <title>Electronic formtitle>
head>
<body>
    <form method="GET" id="webform" name="webform" action="target.php">
        <label for="iduser">User ID:label>
        <input type="text" id="iduser" name="iduser"> <br />

        <label for="idplaylist">Playlist ID:label>
        <input type="text" id="idplaylist" name="idplaylist"> <br />

        <label for="v">Video ID:label>
        <input type="text" id="v" name="v" value="fJ9rUzIMcZQ"> <br />

        <button type="submit">Send databutton>
    form>
body>
html>
4 element.

Biến Superglobal mysqli_real_escape_string1 của Php có thể mang thông tin từ cả hai phương pháp



    // Prints the values of each field on the page
    echo(
    "The user identified as " . htmlspecialchars($_GET["iduser"], ENT_QUOTES, "UTF-8") . " added the video whose ID is " . htmlspecialchars($_GET["v"], ENT_QUOTES, "UTF-8") . " to the playlist " . htmlspecialchars($_GET["idplaylist"], ENT_QUOTES, "UTF-8") . "."
    );
?>
9 và mysqli_real_escape_string0, ngoài bất kỳ cookie nào được truyền trong mysqli_real_escape_string7. Tuy nhiên, việc sử dụng nó không phải lúc nào cũng được khuyến nghị: Thực tiễn tốt nhất là các nhà phát triển biết các phương thức được sử dụng cho đầu vào và đầu ra di chuyển trên máy chủ của họ, để tránh các lệnh chung hơn.is not always recommended: the best practice is that developers know the methods used for inputs and outputs traveling on their server, in order to avoid more generic commands.

Sau đó, chúng tôi tách các chuỗi và các biến trong PHP với ký tự mysqli_real_escape_string8, do đó, mỗi đoạn văn bản được chứa giữa các ký tự mysqli_real_escape_string9, ở đầu và cuối câu. Cuối cùng, chúng tôi in trên màn hình của người dùng toàn bộ biểu thức trong dấu ngoặc đơn với hàm PUT0.

📝 Học bằng cách làm

Bạn có nhận thấy rằng địa chỉ URL trên trang



    // Prints the values of each field on the page
    echo(
    "The user identified as " . htmlspecialchars($_GET["iduser"], ENT_QUOTES, "UTF-8") . " added the video whose ID is " . htmlspecialchars($_GET["v"], ENT_QUOTES, "UTF-8") . " to the playlist " . htmlspecialchars($_GET["idplaylist"], ENT_QUOTES, "UTF-8") . "."
    );
?>
2 hiển thị các giá trị được nhập trong trang nguồn không?

Kiểm tra số 1: Viết lại mã nguồn của biểu mẫu chúng tôi đã mã hóa, bằng cách sử dụng một phương thức yêu cầu khác, để thông tin vẫn an toàn khỏi việc đọc của người nghe lén và những người trái phép. Sau khi bạn hoàn thành, bạn có thể kiểm tra câu trả lời cuối cùng. Rewrite the source code of the form we coded, using another requisition method, so that the information stays safe from reading by eavesdroppers and unauthorized people. After you finish, you can check the final answer.

Tăng bảo mật hình thức HTML

Hình thức HTML của chúng tôi cuối cùng đã được thực hiện! Tuy nhiên, chúng tôi có thể tăng tính bảo mật của trang của chúng tôi, bảo vệ việc đọc thông tin trên PHP.

Đây là bước cuối cùng của chúng tôi. Chúng tôi sẽ thêm một lớp bảo mật bổ sung, mặc dù cơ bản, để ngăn PHP thực thi các lệnh tại thời điểm nó nhận và hiển thị các giá trị được báo cáo bởi máy khách.

Quy tắc trong lập trình là không bao giờ tin tưởng một cách mù quáng các giá trị được người dùng chèn vào. Thật không may, nhiều tác nhân xấu đã khai thác các vấn đề kỹ thuật trên các trang web để thu thập thông tin nhạy cảm hoặc gây sát thương cho các máy chủ bằng cách thực hiện các lệnh bất ngờ. Vì những lý do đó, điều rất quan trọng là bạn bảo vệ, trước, các yêu cầu được truyền và máy chủ, nếu tất cả, nếu lợi ích của người dùng là hợp pháp, chúng cũng sẽ được hưởng lợi từ việc tăng cường bảo mật ứng dụng của bạn.never blindly trust the values inserted by the user. Unfortunately, many bad agents have exploited technical problems on websites in order to collect sensitive information, or to damage servers by executing unexpected commands. For those reasons, it is very important that you protect, beforehand, the transmitted requests and the server, after all, if the users' interests are legitimate, they will also benefit from the increased security of your application.

Kỹ thuật lọc và biến đổi các giá trị được người dùng nhập vào thành các chuỗi đơn giản hơn được gọi là vệ sinh. Theo mặc định, PHP có một tập hợp các chức năng gốc giúp chúng tôi ở bước này, chẳng hạn như sau:sanitization. By default, PHP has a collection of native functions that helps us on this step, such as the following:

  • PUT2 - Chuyển đổi các ký tự đặc biệt, chẳng hạn như PUT3, thành các thực thể HTML;
  • PUT4 - Tương tự như phần trước, nhưng nó chuyển đổi số lượng ký tự lớn hơn thành các thực thể HTML;
  • PUT5 - Xóa các thẻ HTML và PHP khỏi một chuỗi, chẳng hạn như siêu liên kết và nhận xét.

Khi chúng tôi sử dụng quá trình vệ sinh đầy đủ, ngay khi máy chủ nhận được thông tin không chính xác - ví dụ: PUT6 - nó sẽ được chuyển đổi, đã khử trùng, và không nên hiển thị thông báo cảnh báo trên màn hình của người dùng trong trường hợp này.

💡 Lưu ý rằng, trong ví dụ của chúng tôi, chúng tôi sử dụng một tập lệnh vô hại, theo lý thuyết - nhiều nhất, không thoải mái cho người dùng. Tuy nhiên, điều quan trọng là phải nhắc lại: bạn phải luôn bảo vệ và vệ sinh thông tin. Trong các trường hợp khác, một tác nhân xấu có thể truyền các tập lệnh độc hại-kỹ thuật này được gọi là kịch bản chéo trang hoặc XSS-hoặc thực hiện các lệnh có hại cho cơ sở dữ liệu (thường được gọi là tiêm SQL).always protect and sanitize information. In other cases, a bad agent could transmit malicious scripts — this technique is known as Cross-Site Scripting, or XSS — or execute harmful commands to the database (usually called SQL Injection).

Hãy chỉnh sửa mã nguồn của trang của chúng tôi, bằng cách thêm một trong các chức năng vệ sinh này. Mã cuối cùng của chúng tôi sẽ trông như thế này:



    // Prints the values of each field on the page
    echo(
    "The user identified as " . htmlspecialchars($_GET["iduser"], ENT_QUOTES, "UTF-8") . " added the video whose ID is " . htmlspecialchars($_GET["v"], ENT_QUOTES, "UTF-8") . " to the playlist " . htmlspecialchars($_GET["idplaylist"], ENT_QUOTES, "UTF-8") . "."
    );
?>

Kết quả cuối cùng, được hiển thị trong trình duyệt, sẽ trông giống như hình dưới đây:

Hướng dẫn how to secure _get request in php - cách bảo mật yêu cầu _get trong php

📝 Học bằng cách làm

Bạn đã bao giờ nhận thấy rằng phần lớn các trang web và công cụ tìm kiếm sử dụng tham số PUT7 để truyền dữ liệu được người dùng chèn vào các yêu cầu truy vấn đến máy chủ?

Kiểm tra số 2: Tạo biểu mẫu tìm kiếm, sử dụng HTML và PHP, chứa ít nhất 1 trường văn bản và 1 nút để gửi dữ liệu, để URL địa chỉ trên trang đích hiển thị tham số PUT7 (hoặc truy vấn trực tuyến). Nó sẽ nhận được các giá trị, được vệ sinh, được người dùng chèn vào trường văn bản. Sau khi bạn hoàn thành, bạn có thể kiểm tra câu trả lời cuối cùng. Create a search form, using HTML and PHP, that contains at least 1 text field and 1 button to send the data, so that the address URL on the target page displays the PUT7 (or “query”) parameter. It should receive the values, sanitized, inserted by the user in the text field. After you finish, you can check the final answer.

Sự kết luận

Vì vậy, chúng tôi đã hoàn thành! Chúng tôi đã thực hiện biểu mẫu điện tử của chúng tôi trong HTML có khả năng truyền dữ liệu qua các phương thức yêu cầu HTTP, trong trường hợp này, nhận hoặc đăng - và chúng tôi cũng hiểu cách chúng hoạt động - và gửi chúng đến trang đích được viết bằng PHP. Sau đó, nó nhận được, xử lý dữ liệu và hiển thị thông tin trên màn hình của người dùng. Ngoài ra, chúng tôi đã vệ sinh các giá trị được người dùng thông báo để tránh các vấn đề nghiêm trọng về bảo mật thông tin.

Các bước tiếp theo 🚶 🚶

Bảo mật Internet không bao giờ là quá nhiều, vì vậy luôn có một cái gì đó để học và áp dụng nhiều hơn. Để xây dựng các ứng dụng an toàn hơn, hãy chắc chắn theo dõi bài viết tiếp theo về loạt bài này và đọc chủ đề bảo mật trong hướng dẫn sử dụng PHP.

Nếu bạn có bất kỳ câu hỏi hoặc đề xuất nào về cách xây dựng các ứng dụng an toàn hơn bằng PHP, hãy chia sẻ nó trong các bình luận. 📣

Người giới thiệu

.

.

.

.

.

.

.

.

Nhận giá trị an toàn trong PHP là gì?

Nó chứa dữ liệu có thể bị thao túng, nhưng miễn là dữ liệu đó không được sử dụng một cách ngu ngốc, đó không phải là rủi ro bảo mật..

Phương pháp nào được bảo mật để đảm bảo dữ liệu trong PHP?

Sử dụng chứng chỉ SSL cho HTTPS HTTPS cung cấp kênh truy cập được bảo mật và được mã hóa cho các trang web không tin cậy.Bạn phải bao gồm HTTPS bằng cách cài đặt chứng chỉ SSL vào trang web của bạn.Nó cũng tăng cường các ứng dụng web của bạn chống lại các cuộc tấn công XSS và ngăn các tin tặc đọc dữ liệu được vận chuyển bằng mã. HTTPs provides a secured and encrypted accessing channel for untrusted sites. You must include HTTPS by installing SSL certificate into your website. It also strengthens your web applications against XSS attacks and prevents the hackers to read transported data using codes.

Làm cách nào để bảo mật trang đăng nhập của mình trong PHP?

Bắt đầu.Có một vài bước chúng ta cần thực hiện trước khi tạo hệ thống đăng nhập an toàn của mình.....
Tạo thiết kế mẫu đăng nhập.....
Tạo cơ sở dữ liệu và các bảng thiết lập.....
Xác thực người dùng với PHP.....
Tạo trang chủ.....
Tạo trang hồ sơ.....
Tạo tập lệnh đăng xuất ..

Post có phải PHP an toàn không?

Bài đăng an toàn hơn là nhận được vì một vài lý do.Nhận tham số được truyền qua URL.Điều này có nghĩa là các tham số được lưu trữ trong nhật ký máy chủ và lịch sử trình duyệt. for a couple of reasons. GET parameters are passed via URL. This means that parameters are stored in server logs, and browser history.