Mengapa begitu banyak fungsi PHP yang tidak diizinkan dalam Magento ECG Coding Standard?

30

Standar Coding Magento ECG tampaknya (setidaknya jenis) resmi sebagai standar untuk ekstensi Magento 1:

https://github.com/magento-ecg/coding-standard

Tapi saya tidak mengerti alasan di balik semua aturan, dan aturan sniffer kode dengan pesan mereka saja tidak banyak membantu. Apakah ada dokumentasi terperinci tentang standar? Saya tahu praktik terbaik umum dan panduan pengembang tetapi tidak dapat menemukan sesuatu yang spesifik tentang standar pengkodean ini.

Yang paling mengganggu saya adalah ketatnya tidak menggunakan fungsi PHP.

Sebagai contoh: Mengapa setiap sistem file tunggal terkait fungsi PHP dilarang ?

Saya kira, Anda seharusnya menggunakan Varien_Io_File, Varien_File_Objectdll. Tetapi bahkan pengembang inti tidak mengetahui semua kelas Varien dan Anda sering menemukan hal-hal seperti di Mage_ImportExport_Model_Import_Adapter_Csv:

    $this->_fileHandler = fopen($this->_source, 'r');

Jadi, intinya bukan contoh terbaik, seperti sering.

Fungsi terlarang IMHO dipertanyakan lainnya:

  • mb_parse_str
  • parse_str
  • parse_url
  • base64_decode

    • ya, itu digunakan di backdoors tetapi larangan evalharus cukup dan ada kasus penggunaan yang sah, seperti pengkodean data biner. Dan selain json_decode(yang tidak dilarang) tidak ada pembantu inti yang tersedia untuk ini.

Sumber: https://github.com/magento-ecg/coding-standard/blob/master/Sniffs/Security/ForbiddenFunctionSniff.php

Pada dasarnya, pertanyaan saya adalah: Di mana standar ini didokumentasikan? Dan / atau adakah daftar "hal-hal yang harus digunakan alih-alih fungsi-fungsi PHP asli ini"?

Fabian Schmengler
sumber
1
Magento dibangun di atas Zend Framework. Mengapa Anda tidak menggunakan standar Zend?
zhartaunik
ECG melakukan lebih banyak pemeriksaan khusus Magento, seperti jika ada model yang dimuat dalam loop. Ini bukan tentang pemeriksaan gaya dasar seperti lekukan dan tanda kurung.
Fabian Schmengler
1
Mendaftar "Kueri SQL Baku" sebagai terlarang juga tampaknya naif. Tentu saja Anda tidak melakukan SQL mentah dalam kebanyakan situasi, tetapi pasti ada saat-saat di mana itu tidak hanya sesuai, tetapi perlu (yaitu impor / ekspor kompleks)
pspahn
1
@ pspahn Saya mengerti maksud Anda, tetapi bukankah Zend_Dbpembuat kueri mampu membuat kueri SQL?
Fabian Schmengler
Tentu, tetapi tidak bisakah Anda juga membuat selectpernyataan dengan Zend_Dbmenggunakan SQL mentah sebagai input? Saya berasumsi itulah yang dilakukan github.com/kalenjordan/custom-reports di backend.
pspahn

Jawaban:

28

Mendapat jawaban tidak resmi dari tim ECG mengenai hal itu:

Pertama-tama, fungsi yang ditandai tidak selalu dilarang - fungsi tersebut harus memicu tinjauan manual tentang penggunaan untuk memastikan penggunaan yang sah. Ini alat bantu peninjau, bukan alat penilaian kode yang baik / buruk.

Kedua, asumsinya adalah lebih baik menggunakan pembungkus Magento (fungsi / kelas) jika ada karena mungkin menawarkan fungsionalitas atau perlindungan tambahan.

Ketiga, untuk panggilan tertentu, base64_decode sering digunakan untuk kode yang disuntikkan berbahaya, dan sisanya seperti parse_str mungkin rentan, terutama menangani input yang tidak diketahui atau yang disediakan pengguna - lihat misalnya http://php-security.org/2010/05/ 31 / mops-2010-049-php-parse_str-interrupt-memory-korupsi-kerentanan /

Sekali lagi, ini ditandai untuk ditinjau dan tidak menolak kode sebagai buruk.

Semoga ini bisa membantu.

Piotr Kaminski
sumber
Lalu mengapa mereka menulis "fungsi ini dilarang" dan bukannya "Anda harus meninjau kode untuk memastikan penggunaannya yang sah" ?!
Hitam
11

Standar Pengkodean memiliki dua tujuan.

  1. membuat mencari bagian yang mungkin bermasalah jauh lebih mudah. Pengembang berpengalaman sudah tahu bagian mana dari modul baru yang perlu dia ulas, dan ini menandai standar dan mencantumkannya untuknya. Bukan supaya dia bisa menghapus bagian ini, tetapi untuk meninjau jika mereka diperlukan, bermasalah atau keduanya.

  2. mendukung pengembang yang tidak berpengalaman tentang hal-hal yang harus dihindari. Meskipun semua fungsi yang ditandai dapat menjadi solusi yang baik untuk masalah tertentu, mereka sangat mudah digunakan dengan cara yang bermasalah. Ini mengarahkan pengembang untuk lebih memikirkan masalah, dan seringkali ke solusi yang lebih baik yang tidak bertentangan dengan standar.

Dan kadang-kadang, bahkan pengembang yang paling berpengalaman secara membabi buta mengikuti standar dan menciptakan solusi yang paling kejam, hanya untuk tidak menyinggung standar komunitas yang dipaksakan.

sedikit informasi tambahan

Fungsi file sering memungkinkan penggunaan pembungkus protocoll, berarti jalur file dimulai dengan http: // mengarah ke http reaquest, yang sering digunakan untuk "menelepon ke rumah", dan dari waktu ke waktu membunuh toko, karena server tidak dapat dijangkau (Batas waktu default 30 detik) dan dibangun menjadi tempat yang sangat sentral.

sql everyithing realted, tidak ada yang percaya berapa banyak lubang injeksi sql masih ada di luar sana. Contoh yang bagus adalah, seperti Pencarian di situs web Mysql memilikinya.

ada penolong inti untuk json_decode di suatu tempat, tetapi memiliki implementasi yang sangat lama, cukup gunakan json_decode. Tidak tahu mengapa harus dilarang.

gettext adalah bagian php yang menarik, saya ingat itu menggunakan beberapa implementasi OS asli yang dapat memiliki masalah, jika Anda menggunakannya secara paralel dengan berbagai bahasa (seperti biasanya terjadi ketika Anda memiliki lebih dari satu bahasa di toko Anda. Tidak pernah benar-benar menyelidiki ini sebanyak , tetapi seharusnya tidak perlu untuk itu dalam Konteks Magento.

Pergi lebih jauh melalui daftar, yang tampaknya hanya daftar dengan fungsi sebanyak mungkin. Sejarahnya sebenarnya lucu, sepertinya mereka menghapus beberapa fungsi dari daftar, setelah mereka perhatikan, mereka memanfaatkannya. : D

Flyingmana
sumber