Artikel ini membawakan anda pengetahuan yang berkaitan tentang PHP terutamanya bercakap tentang apakah pernyataan prapemprosesan? Bagaimanakah pertanyaan praproses PHP menghalang suntikan SQL? Rakan-rakan yang berminat boleh lihat di bawah ini semoga bermanfaat untuk semua.
Bagaimanakah pertanyaan praproses PHP menghalang suntikan SQL?
Pada masa ini cara yang paling berkesan untuk menghalang suntikan sql ialah menggunakan pernyataan yang disediakan dan pertanyaan berparameter.
Ambil sambungan PHP PDO yang paling biasa digunakan sebagai contoh.
Pengenalan kepada kenyataan yang disediakan dalam dokumentasi rasmi
Apakah kenyataan yang disediakan?
Fikirkan ia sebagai templat terkumpul SQL yang anda mahu jalankan, yang boleh disesuaikan menggunakan parameter pembolehubah.
Dua faedah utama pernyataan yang disediakan:
1; Pertanyaan hanya perlu dihuraikan (atau dipraproses) sekali, tetapi boleh dilaksanakan beberapa kali dengan parameter yang sama atau berbeza. Apabila pertanyaan sedia, pangkalan data menganalisis, menyusun dan mengoptimumkan rancangan untuk melaksanakan pertanyaan. Proses ini mengambil masa yang lebih lama untuk pertanyaan kompleks dan boleh melambatkan aplikasi anda dengan ketara jika pertanyaan yang sama perlu diulang beberapa kali dengan parameter yang berbeza. Dengan menggunakan pernyataan yang disediakan, anda boleh mengelakkan kitaran analisis/kompilasi/pengoptimuman berulang. Ringkasnya, pernyataan yang disediakan menggunakan sumber yang lebih sedikit dan oleh itu berjalan lebih cepat.
2. Parameter yang diberikan kepada pernyataan yang disediakan tidak perlu disertakan dalam tanda petikan, pemandu akan mengendalikannya secara automatik. Jika aplikasi anda hanya menggunakan pernyataan yang disediakan, anda boleh memastikan suntikan SQL tidak berlaku. (Walau bagaimanapun, jika bahagian pertanyaan lain dibina daripada input yang tidak dilepaskan, masih terdapat risiko suntikan SQL).
Ciri PDO ialah apabila pemacu tidak menyokong prapemprosesan, PDO akan mensimulasikan pemprosesan, dan proses pertanyaan berparameter prapemprosesan pada masa ini diselesaikan dalam simulator PDO. Simulator PDO secara tempatan melepaskan parameter input mengikut set aksara yang ditentukan dalam DSN, dan kemudian menyambungkannya ke dalam pernyataan SQL lengkap dan menghantarnya ke pelayan MySQL.
Jadi, sama ada simulator PDO boleh melepaskan parameter input dengan betul adalah kunci untuk memintas suntikan SQL.
Untuk versi PHP kurang daripada 5.3.6, DSN (Nama Sumber Data) mengabaikan parameter charset secara lalai. Pada masa ini, jika anda menggunakan pelarian tempatan PDO, ia mungkin masih membawa kepada suntikan SQL.
Oleh itu, lapisan bawah rangka kerja Laravel akan terus menetapkan PDO::ATTR_EMULATE_PREPARES=false untuk memastikan pernyataan SQL dan nilai parameter tidak akan dihuraikan oleh PHP sebelum dihantar ke pelayan MySQL.
Pelaksanaan PHP
// 查询 $calories = 150; $colour = 'red'; $sth = $dbh->prepare('SELECT name, colour, calories FROM fruit WHERE calories < :calories AND colour = :colour'); $sth->bindValue(':calories', $calories, PDO::PARAM_INT); $sth->bindValue(':colour', $colour, PDO::PARAM_STR); $sth->execute();
// 插入,修改,删除 $preparedStmt = $db->prepare('INSERT INTO table (column) VALUES (:column)'); $preparedStmt->execute(array(':column' => $unsafeValue));
Pelaksanaan asas Laravel
// 查询的实现 public function select($query, $bindings = [], $useReadPdo = true) { return $this->run($query, $bindings, function ($query, $bindings) use ($useReadPdo) { if ($this->pretending()) { return []; } $statement = $this->prepared( $this->getPdoForSelect($useReadPdo)->prepare($query) ); $this->bindValues($statement, $this->prepareBindings($bindings)); $statement->execute(); return $statement->fetchAll(); }); } // 修改删除的实现 public function affectingStatement($query, $bindings = []) { return $this->run($query, $bindings, function ($query, $bindings) { if ($this->pretending()) { return 0; } $statement = $this->getPdo()->prepare($query); $this->bindValues($statement, $this->prepareBindings($bindings)); $statement->execute(); $this->recordsHaveBeenModified( ($count = $statement->rowCount()) > 0 ); return $count; }); }
Pembelajaran yang disyorkan: "Tutorial Video PHP"
Atas ialah kandungan terperinci Artikel yang menganalisis cara pertanyaan praproses PHP menghalang suntikan SQL. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!