db_insert ปลอดภัยหรือไม่?


15

ฉันใช้วิธี Drupal 7 db_insertเพื่อแทรกข้อมูลลงในตารางที่กำหนดเองในฐานข้อมูล Drupal ฉันได้อ่านว่านี่เป็นวิธีที่ต้องการ แต่ฉันได้อ่านรหัสและ doco แล้วและฉันไม่สามารถเห็นได้ว่ามีการแยกวิเคราะห์ค่าใดหรือบอกฉันว่าค่าเหล่านี้ปลอดภัย

ค่าบางอย่างมาจากผู้ใช้ดังนั้นฉันต้องตรวจสอบการโจมตี SQL Injection

นี่คือตัวอย่างที่ฉันกำลังอ่านซึ่ง Drupal 6 วิเคราะห์ค่าและรุ่น drupal 7 ไม่ได้

<?php
// Drupal 6 version
db_query('INSERT INTO {vchess_games} 
   (gid, timestamps, white, black, state, board_white, board_black) ' . "VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s')", 
   $gid, $timestamps, $game['white'], $game['black'], $state, $board_white, $board_black);

// Drupal 7 version
db_insert('vchess_games')
  ->fields(array(
    'gid' => $gid,
    'timestamps' => $timestamps,
    'white' => $game['white'],
    'black' => $game['black'],
    'state' => $state,
    'board_white' => $board_white,
    'board_black' => $board_black
  ))
  ->execute();
?>

คำตอบ:


13

เลเยอร์ฐานข้อมูล Drupal ล้อมรอบPDOและใช้คำสั่งที่เตรียมไว้ดังนั้นใช่คำสั่งแทรกจะถูกทำให้สะอาดและป้องกันจากการโจมตีของการฉีด SQL

ข้อความนี้จากเอกสารที่จัดทำขึ้นโดยระบุว่าดีที่สุด:

ไม่จำเป็นต้องอ้างพารามิเตอร์ของคำสั่งที่เตรียมไว้ คนขับจะจัดการสิ่งนี้โดยอัตโนมัติ หากแอปพลิเคชันใช้คำสั่งที่เตรียมไว้เฉพาะผู้พัฒนาสามารถมั่นใจได้ว่าจะไม่มีการฉีด SQL เกิดขึ้น (อย่างไรก็ตามหากส่วนอื่นของแบบสอบถามถูกสร้างขึ้นด้วยอินพุตที่ไม่ใช้ค่า Escape การฉีด SQL ก็ยังคงเป็นไปได้)

เดียวกันเป็นจริงสำหรับทุกฟังก์ชั่นฐานข้อมูลใน Drupal 7 ( db_select, db_deleteฯลฯ ) สิ่งเดียวที่ยังอาจไม่ปลอดภัยคือdb_query()จะใช้งานสตริงใด ๆ ที่คุณส่งไปให้ ถึงแม้จะมีdb_query()แต่คุณสามารถส่งผ่านพารามิเตอร์เพื่อให้การค้นหาของคุณมีความปลอดภัย

abstraction layer ฐานข้อมูลเอกสารมีข้อมูลเพิ่มเติมบางส่วน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.