Trong khi vòng lặp PHP Tràn ngăn xếp

Tôi đang sử dụng bài đăng tới bài đăng để tạo kết nối giữa 'công thức' và 'thành phần' của các loại bài đăng tùy chỉnh của mình. loại bài đăng thành phần có trường meta tùy chỉnh với khóa 'foxware-ingredient-cost'. Như bạn có thể thấy trong đoạn mã bên dưới, tôi gán giá trị từ khóa meta cho biến $cost. Sau đó, tôi đang cố gắng cộng từng giá trị đó lại với nhau, nhưng mã tôi có dường như không làm gì ngoại trừ trả về giá trị đầu tiên, dấu cộng dường như không có tác dụng ở đây. Tôi có cần đặt các giá trị của biến $cost vào một mảng hay gì đó không?

 'recipes_to_ingredients',
    'connected_items' => get_queried_object(),

) );

while( $connected->have_posts() ) : $connected->the_post();

    $cost = get_post_meta( $post->ID, 'foxware-ingredient-cost', true );

        echo '
  • '; the_title(); // Display cost echo '
    '; echo 'Cost: ' . $cost; echo '
  • '; endwhile; echo ($cost + $cost); ?>

    Tôi đang cố nhận POST JSON trên trang web giao diện thanh toán, nhưng tôi không thể giải mã nó

    Khi tôi in

    echo $_POST;
    

    tôi có

    Array
    

    Tôi không nhận được gì khi tôi thử cái này

    if ( $_POST ) {
        foreach ( $_POST as $key => $value ) {
            echo "llave: ".$key."- Valor:".$value."
    "; } }

    Tôi không nhận được gì khi tôi thử cái này

    $string = $_POST['operation'];
    $var = json_decode($string);
    echo $var;
    

    Tôi nhận được NULL khi tôi thử điều này

    $data = json_decode( file_get_contents('php://input') );
    var_dump( $data->operation );
    

    Khi tôi làm

    $data = json_decode(file_get_contents('php://input'), true);
    var_dump($data);
    

    tôi có

    NULL
    

    Định dạng JSON là (theo tài liệu trang web thanh toán)

    ________số 8

    Nhật ký trang web thanh toán cho biết mọi thứ đều ổn. Vấn đề là gì?

    SQL injection là một cuộc tấn công có thể được thực hiện thông qua đầu vào của người dùng (đầu vào do người dùng điền và sau đó được sử dụng bên trong các truy vấn). Các mẫu SQL injection là cú pháp truy vấn đúng trong khi chúng ta có thể gọi nó là. truy vấn không hợp lệ vì những lý do không hợp lệ và chúng tôi cho rằng có thể có một người xấu đang cố lấy thông tin bí mật (bỏ qua kiểm soát truy cập) ảnh hưởng đến ba nguyên tắc bảo mật (bí mật, tính toàn vẹn và tính khả dụng)

    Bây giờ, quan điểm của chúng tôi là ngăn chặn các mối đe dọa bảo mật như tấn công SQL injection, câu hỏi đặt ra (làm thế nào để ngăn chặn tấn công SQL injection bằng PHP), thực tế hơn, lọc dữ liệu hoặc xóa dữ liệu đầu vào là trường hợp khi sử dụng dữ liệu người dùng nhập bên trong

    Cách tiếp cận của tôi chống lại SQL injection là. xóa dữ liệu do người dùng nhập vào trước khi gửi đến cơ sở dữ liệu (trước khi sử dụng dữ liệu đó trong bất kỳ truy vấn nào)

    Lọc dữ liệu cho (chuyển đổi dữ liệu không an toàn thành dữ liệu an toàn)

    Hãy xem xét điều đó và MySQLi không có sẵn. Làm thế nào bạn có thể bảo mật ứng dụng của bạn?

    1. Người dùng SQL (giới hạn đặc quyền người dùng). các thao tác SQL phổ biến nhất là (CHỌN, CẬP NHẬT, CHÈN), vậy tại sao lại cấp đặc quyền CẬP NHẬT cho người dùng không yêu cầu?

    QUY TẮC. không tạo một người dùng cơ sở dữ liệu cho tất cả các đặc quyền. Đối với tất cả các hoạt động SQL, bạn có thể tạo lược đồ của mình như (deluser, selectuser, updateuser) làm tên người dùng để dễ sử dụng

    Xem nguyên tắc đặc quyền tối thiểu

    1. Lọc dữ liệu. trước khi xây dựng bất kỳ đầu vào truy vấn nào của người dùng, nó phải được xác thực và lọc. Đối với các lập trình viên, điều quan trọng là phải xác định một số thuộc tính cho từng biến do người dùng nhập vào. kiểu dữ liệu, mẫu dữ liệu và độ dài dữ liệu. Trường là số nằm trong khoảng (x và y) phải được xác thực chính xác bằng quy tắc chính xác và đối với trường là chuỗi (văn bản). mẫu là trường hợp, ví dụ: tên người dùng chỉ được chứa một số ký tự, giả sử [a-zA-Z0-9_-. ]. Độ dài khác nhau giữa (x và n) trong đó x và n (số nguyên, x <= n). Quy tắc. tạo các bộ lọc chính xác và quy tắc xác thực là những phương pháp hay nhất đối với tôi

    2. Sử dụng các công cụ khác. Ở đây, tôi cũng sẽ đồng ý với bạn rằng câu lệnh soạn sẵn (truy vấn được tham số hóa) và thủ tục lưu sẵn. Nhược điểm ở đây là những cách này yêu cầu các kỹ năng nâng cao không tồn tại đối với hầu hết người dùng. Ý tưởng cơ bản ở đây là phân biệt giữa truy vấn SQL và dữ liệu được sử dụng bên trong. Cả hai cách tiếp cận đều có thể được sử dụng ngay cả với dữ liệu không an toàn, vì dữ liệu do người dùng nhập ở đây không thêm bất kỳ thứ gì vào truy vấn ban đầu, chẳng hạn như (bất kỳ hoặc x=x)

    Để biết thêm thông tin, vui lòng đọc Bảng gian lận phòng chống tiêm nhiễm SQL của OWASP

    Bây giờ, nếu bạn là người dùng nâng cao, hãy bắt đầu sử dụng biện pháp bảo vệ này tùy thích, nhưng đối với người mới bắt đầu, nếu họ không thể nhanh chóng triển khai thủ tục được lưu trữ và chuẩn bị câu lệnh, thì tốt hơn hết là lọc dữ liệu đầu vào càng nhiều càng tốt

    Cuối cùng, hãy xem xét rằng người dùng gửi văn bản này bên dưới thay vì nhập tên người dùng của họ

    [1] UNION SELECT IF(SUBSTRING(Password,1,1)='2',BENCHMARK(100000,SHA1(1)),0) User,Password FROM mysql.user WHERE User = 'root'
    

    Đầu vào này có thể được kiểm tra sớm mà không cần bất kỳ câu lệnh được chuẩn bị sẵn và thủ tục được lưu trữ nào, nhưng để đảm bảo an toàn, việc sử dụng chúng sẽ bắt đầu sau khi lọc và xác thực dữ liệu người dùng

    Điểm cuối cùng là phát hiện hành vi không mong muốn đòi hỏi nhiều nỗ lực và phức tạp hơn;

    Hành vi không mong muốn trong đầu vào của người dùng ở trên là SELECT, UNION, IF, SUBSTRING, BENCHMARK, SHA và root. Khi những từ này được phát hiện, bạn có thể tránh đầu vào

    CẬP NHẬT 1

    Một người dùng nhận xét rằng bài đăng này là vô ích, OK. Đây là những gì

    phòng thủ chính

    Tùy chọn số 1. Sử dụng câu lệnh đã chuẩn bị (Truy vấn được tham số hóa)
    Tùy chọn #2. Sử dụng thủ tục được lưu trữ
    Tùy chọn #3. Thoát tất cả thông tin đầu vào do người dùng cung cấp

    phòng thủ bổ sung

    Cũng thực thi. Đặc quyền thấp nhất
    Cũng thực hiện. Xác thực đầu vào danh sách trắng

    Như bạn có thể biết, việc tuyên bố một bài viết phải được hỗ trợ bởi một lập luận hợp lệ, ít nhất là bởi một tài liệu tham khảo. Nếu không, nó được coi là một cuộc tấn công và một yêu cầu xấu

    cập nhật 2

    Từ hướng dẫn sử dụng PHP, PHP. Tuyên bố đã chuẩn bị - Hướng dẫn sử dụng

    Thoát và tiêm SQL

    Các biến bị ràng buộc sẽ được thoát tự động bởi máy chủ. Máy chủ chèn các giá trị thoát của chúng vào các vị trí thích hợp vào mẫu câu lệnh trước khi thực hiện. Một gợi ý phải được cung cấp cho máy chủ về loại biến bị ràng buộc, để tạo một chuyển đổi thích hợp. Xem hàm mysqli_stmt_bind_param() để biết thêm thông tin

    Việc tự động thoát các giá trị trong máy chủ đôi khi được coi là một tính năng bảo mật để ngăn chặn SQL injection. Mức độ bảo mật tương tự có thể đạt được với các câu lệnh không chuẩn bị nếu các giá trị đầu vào được thoát chính xác

    cập nhật 3

    Tôi đã tạo các trường hợp thử nghiệm để biết cách PDO và MySQLi gửi truy vấn đến máy chủ MySQL khi sử dụng câu lệnh đã chuẩn bị

    PDO

    echo $_POST;
    
    0

    Nhật ký truy vấn

    echo $_POST;
    
    1

    MySQLi

    echo $_POST;
    
    2

    Nhật ký truy vấn

    echo $_POST;
    
    3

    Rõ ràng là một câu lệnh đã chuẩn bị cũng đang thoát dữ liệu, không có gì khác

    Như đã đề cập trong tuyên bố trên,

    Việc tự động thoát các giá trị trong máy chủ đôi khi được coi là một tính năng bảo mật để ngăn chặn SQL injection. Mức độ bảo mật tương tự có thể đạt được với các câu lệnh không chuẩn bị, nếu các giá trị đầu vào được thoát chính xác

    Do đó, điều này chứng tỏ rằng việc xác thực dữ liệu như

    echo $_POST;
    
    4 là một ý tưởng hay đối với các giá trị số nguyên trước khi gửi bất kỳ truy vấn nào. Ngoài ra, ngăn chặn dữ liệu người dùng độc hại trước khi gửi truy vấn là một cách tiếp cận đúng đắn và hợp lệ

    Vui lòng xem câu hỏi này để biết thêm chi tiết. PDO gửi truy vấn thô tới MySQL trong khi Mysqli gửi truy vấn đã chuẩn bị, cả hai đều tạo ra cùng một kết quả

    PHP có vòng lặp while không?

    PHP làm. vòng lặp while . vòng lặp while sẽ luôn thực thi khối mã một lần, sau đó nó sẽ kiểm tra điều kiện và lặp lại vòng lặp trong khi điều kiện đã chỉ định là đúng.

    Làm thế nào chúng ta có thể sử dụng vòng lặp while trong PHP?

    Vòng lặp while của PHP có thể được sử dụng để duyệt qua bộ mã như vòng lặp for. Vòng lặp while thực thi lặp đi lặp lại một khối mã cho đến khi điều kiện là FALSE. Khi điều kiện là FALSE, nó sẽ thoát khỏi phần thân của vòng lặp. .
    trong khi($n<=10)
    echo "$n
    ";.
    cuối cùng;

    Làm cách nào để tạo một vòng lặp vô hạn trong PHP?

    Ví dụ về vòng lặp vô hạn .
    $a = 1;
    // điều kiện trong khi sẽ luôn được đáp ứng vì nó sẽ luôn trả về true
    trong khi ($a)
    echo "Vòng lặp vô tận\n";

    Làm cách nào để thực hiện tác vụ lặp đi lặp lại trong PHP bằng vòng lặp?

    Trong PHP, chúng ta có các loại vòng lặp sau. .
    while - lặp qua một khối mã miễn là điều kiện được chỉ định là đúng
    làm. while - lặp qua một khối mã một lần, sau đó lặp lại vòng lặp miễn là điều kiện đã chỉ định là đúng
    for - lặp qua một khối mã một số lần được chỉ định