Hướng dẫn php sanitize _get parameters - php sanitize _get tham số

0

Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.Learn more.
Learn more.

Tôi biết dữ liệu nên được vệ sinh khi nó được xuất ra hoặc hiển thị, không phải khi nó được nhận hoặc lưu trữ. Đây là những gì tôi đang làm bây giờ:

echo htmlspecialchars($name, ENT_QUOTES);

Nếu tôi sẽ nhận được các tham số $ _GET và kiểm tra cơ sở dữ liệu cho chúng, tôi có còn vệ sinh và thoát không? Ví dụ:

$name = htmlspecialchars($_GET['name'], ENT_QUOTES);
$stmt = $db->prepare("SELECT * FROM users WHERE name = :name");
$stmt->bindParam(':name', $name);
$stmt->execute();

Vậy

$name = htmlspecialchars($_GET['name'], ENT_QUOTES);
$stmt = $db->prepare("SELECT * FROM users WHERE name = :name");
$stmt->bindParam(':name', $name);
$stmt->execute();
4 có cần thiết hay tôi chỉ nên làm
$name = htmlspecialchars($_GET['name'], ENT_QUOTES);
$stmt = $db->prepare("SELECT * FROM users WHERE name = :name");
$stmt->bindParam(':name', $name);
$stmt->execute();
5?

Hướng dẫn php sanitize _get parameters - php sanitize _get tham số

Dharman ♦♦

28.1K21 Huy hiệu vàng75 Huy hiệu bạc127 Huy hiệu đồng21 gold badges75 silver badges127 bronze badges21 gold badges75 silver badges127 bronze badges

Đã hỏi ngày 8 tháng 2 năm 2019 lúc 0:06Feb 8, 2019 at 0:06Feb 8, 2019 at 0:06

2

PDO làm cho nó thậm chí còn dễ dàng hơn bạn đã làm:

$stmt = $db->prepare("SELECT * FROM users WHERE name = :name");
$stmt->execute([ 'name' => $_GET['name'] ]);

Đó là nó. Xong.

Điều quan trọng là bạn không thoát khỏi mọi thứ khi sử dụng các giá trị giữ chỗ, đặc biệt là khi kết hợp.

$name = htmlspecialchars($_GET['name'], ENT_QUOTES);
$stmt = $db->prepare("SELECT * FROM users WHERE name = :name");
$stmt->bindParam(':name', $name);
$stmt->execute();
4 chỉ có liên quan trong bối cảnh HTML, bên ngoài nó gây ra thiệt hại. Nếu bạn đang hiển thị dữ liệu trong JSON, trong một email hoặc bất cứ nơi nào, chỉ thoát khỏi bối cảnh đó và bối cảnh đó.do not escape things when using placeholder values, especially when doing matching.
$name = htmlspecialchars($_GET['name'], ENT_QUOTES);
$stmt = $db->prepare("SELECT * FROM users WHERE name = :name");
$stmt->bindParam(':name', $name);
$stmt->execute();
4 is only relevant in an HTML context, outside of that it causes damage. If you're showing data in JSON, in an email, or wherever, escape for that context and that context only.do not escape things when using placeholder values, especially when doing matching.
$name = htmlspecialchars($_GET['name'], ENT_QUOTES);
$stmt = $db->prepare("SELECT * FROM users WHERE name = :name");
$stmt->bindParam(':name', $name);
$stmt->execute();
4 is only relevant in an HTML context, outside of that it causes damage. If you're showing data in JSON, in an email, or wherever, escape for that context and that context only.

Nếu ai đó có một cái tên như "A & W" thì khi bạn tìm kiếm, bạn sẽ xử lý đầu vào và thực sự tìm kiếm "A & amp; W", đó không phải là tên của họ. Họ sẽ nhận được các trận đấu bằng không và sau đó họ sẽ hỏi bạn điều gì sai với trang web của bạn.

Điều duy nhất bạn nên làm với dữ liệu đầu vào là cắt ra bất kỳ ký tự nào có thể can thiệp vào việc khớp tìm kiếm, như không gian dẫn đầu và dấu vết mà ai đó có thể đã vô tình giới thiệu.

Đã trả lời ngày 8 tháng 2 năm 2019 lúc 0:29Feb 8, 2019 at 0:29Feb 8, 2019 at 0:29

Tadmantadmantadmantadman

203K22 Huy hiệu vàng230 Huy hiệu bạc255 Huy hiệu Đồng22 gold badges230 silver badges255 bronze badges22 gold badges230 silver badges255 bronze badges

Không sử dụng

$name = htmlspecialchars($_GET['name'], ENT_QUOTES);
$stmt = $db->prepare("SELECT * FROM users WHERE name = :name");
$stmt->bindParam(':name', $name);
$stmt->execute();
8.
$name = htmlspecialchars($_GET['name'], ENT_QUOTES);
$stmt = $db->prepare("SELECT * FROM users WHERE name = :name");
$stmt->bindParam(':name', $name);
$stmt->execute();
9 thực hiện tất cả việc trốn thoát và trích dẫn mà bạn cần.

PHP có một loạt các lối thoát khó hiểu -

  • URLENCODE - Khi xây dựng một giá trị cho một URL.
  • HTMLENTITY, HTMLSPECIALCHARACTERS - cho
    $stmt = $db->prepare("SELECT * FROM users WHERE name = :name");
    $stmt->execute([ 'name' => $_GET['name'] ]);
    
    0, ____10,
    $name = htmlspecialchars($_GET['name'], ENT_QUOTES);
    $stmt = $db->prepare("SELECT * FROM users WHERE name = :name");
    $stmt->bindParam(':name', $name);
    $stmt->execute();
    
    1 - chỉ thoát
    $name = htmlspecialchars($_GET['name'], ENT_QUOTES);
    $stmt = $db->prepare("SELECT * FROM users WHERE name = :name");
    $stmt->bindParam(':name', $name);
    $stmt->execute();
    
    2
  • NL2BR (hoặc
    $name = htmlspecialchars($_GET['name'], ENT_QUOTES);
    $stmt = $db->prepare("SELECT * FROM users WHERE name = :name");
    $stmt->bindParam(':name', $name);
    $stmt->execute();
    
    3) - để xử lý các kết thúc dòng
  • MySQL_REAL_ESCAPE_STRING - Không sử dụng các thói quen
    $name = htmlspecialchars($_GET['name'], ENT_QUOTES);
    $stmt = $db->prepare("SELECT * FROM users WHERE name = :name");
    $stmt->bindParam(':name', $name);
    $stmt->execute();
    
    4.
  • MySQLI_REAL_ESCAPE_STRING - Khi thoát theo thói quen
    $name = htmlspecialchars($_GET['name'], ENT_QUOTES);
    $stmt = $db->prepare("SELECT * FROM users WHERE name = :name");
    $stmt->bindParam(':name', $name);
    $stmt->execute();
    
    5 - ít nhất
    $name = htmlspecialchars($_GET['name'], ENT_QUOTES);
    $stmt = $db->prepare("SELECT * FROM users WHERE name = :name");
    $stmt->bindParam(':name', $name);
    $stmt->execute();
    
    6
  • AddSlashes - gần như tốt như trên
  • Hex, base64_encode - Kludges có thể để đối phó với không phải văn bản

Những gì thường tốt nhất khi lưu trữ văn bản vào bảng MySQL, là thoát khỏi chuỗi chỉ đủ để vượt qua trình phân tích cú pháp. Điều này trốn thoát biến mất khi quá trình xử lý xảy ra. Để lại các ký tự có dấu, vv một mình.

  • Apostrophe và trích dẫn kép - những điều này cho thấy phần cuối của chuỗi, vì vậy bạn cần phải thoát khỏi chúng bằng cách nào đó.
  • Backslash - Truyền thống Escaper. Nhưng điều gì sẽ xảy ra nếu bạn muốn một dấu gạch chéo ngược thì sao?

PDO của PHP và MySQLI có cách "ràng buộc" thực hiện tất cả công việc cho bạn. Nếu, thay vào đó, bạn sử dụng "nội suy" của PHP, chẳng hạn như

$sql = "SELECT * FROM t WHERE x = {$_GET['x']}";

Bạn không được thoát và không có bảo vệ tiêm SQL. Không viết mã theo cách đó trừ khi bạn đã bằng cách nào đó đã kiểm tra Args.

Đối với HTML, bạn cần một bộ Escapers khác. Hãy suy nghĩ về

$name = htmlspecialchars($_GET['name'], ENT_QUOTES);
$stmt = $db->prepare("SELECT * FROM users WHERE name = :name");
$stmt->bindParam(':name', $name);
$stmt->execute();
7. Điều này giới thiệu một thẻ. Vậy làm thế nào để bạn hiển thị một "ít hơn"? Vâng, bạn cần "thực thể HTML" cho nó:
$name = htmlspecialchars($_GET['name'], ENT_QUOTES);
$stmt = $db->prepare("SELECT * FROM users WHERE name = :name");
$stmt->bindParam(':name', $name);
$stmt->execute();
8. Điều đó sau đó dẫn đến
$name = htmlspecialchars($_GET['name'], ENT_QUOTES);
$stmt = $db->prepare("SELECT * FROM users WHERE name = :name");
$stmt->bindParam(':name', $name);
$stmt->execute();
9 là vấn đề; Do đó
$stmt = $db->prepare("SELECT * FROM users WHERE name = :name");
$stmt->execute([ 'name' => $_GET['name'] ]);
0.

Đã trả lời ngày 8 tháng 2 năm 2019 lúc 0:31Feb 8, 2019 at 0:31Feb 8, 2019 at 0:31

Rick Jamesrick JamesRick JamesRick James

Huy hiệu vàng 128K1111 gold badges122 silver badges205 bronze badges11 gold badges122 silver badges205 bronze badges

1

Vì vậy, htmlspecialchars có cần thiết hay tôi chỉ nên làm $ name = $ _get ['name']?

Không, nó không cần thiết.

Giữ dữ liệu đầu vào như là, bất khả tri đến phương tiện đầu ra. Nó không nên được chuẩn bị cho việc nhúng HTML an toàn.

Điều gì sẽ xảy ra nếu ngày mai bạn sẽ cần dữ liệu này ở định dạng JSON cho một số API, PDF hoặc ứng dụng máy tính để bàn?

Đã trả lời ngày 8 tháng 2 năm 2019 lúc 10:15Feb 8, 2019 at 10:15Feb 8, 2019 at 10:15

MarcodormarcodorMarcodorMarcodor

3.52018 Huy hiệu bạc22 Huy hiệu đồng18 silver badges22 bronze badges18 silver badges22 bronze badges

Bạn vẫn nên xác nhận đầu vào cho mục đích toàn vẹn dữ liệu, ví dụ: đảm bảo rằng đầu vào ít nhiều là những gì bạn mong đợi vì sự ổn định của ứng dụng. Tuy nhiên, vì bạn đang sử dụng các câu lệnh đã chuẩn bị, bạn không có bất kỳ nhu cầu cấp thiết nào để "vệ sinh" [hay còn gọi là "tham nhũng"] dữ liệu của bạn vì nó đang được trình điều khiển cơ sở dữ liệu đóng gói chặt chẽ hơn.

$name = htmlspecialchars($_GET['name'], ENT_QUOTES);
$stmt = $db->prepare("SELECT * FROM users WHERE name = :name");
$stmt->bindParam(':name', $name);
$stmt->execute();
8 làm cho dữ liệu an toàn để đưa vào tài liệu HTML và chỉ nên được sử dụng khi bạn xuất dữ liệu vào tài liệu HTML. Làm điều này trước khi chèn vào cơ sở dữ liệu ít nhiều gây ô nhiễm dữ liệu của bạn để sử dụng trong bất kỳ thứ gì khác ngoài tài liệu HTML.

Đã trả lời ngày 8 tháng 2 năm 2019 lúc 0:33Feb 8, 2019 at 0:33Feb 8, 2019 at 0:33

SammitchsammitchSammitchSammitch

28.3K7 Huy hiệu vàng46 Huy hiệu bạc75 Huy hiệu Đồng7 gold badges46 silver badges75 bronze badges7 gold badges46 silver badges75 bronze badges