Apakah aman menggunakan switch untuk menentukan metode HTTP?

Saya baru-baru ini membaca tutorial (http://code.tutsplus.com/tutorials/a-beginners-guide-to-http-and-rest--net-16340) tentang menentukan header HTTP untuk mengubah tindakan skrip. Tutorial ini memberikan contoh skrip PHP untuk mencapai hal ini

$method = $_SERVER['REQUEST_METHOD'];

switch($method) {
  case 'PUT':
    $this->create_contact($name);
  break;

  case 'DELETE':
    $this->delete_contact($name);
  break;

  case 'GET':
    $this->display_contact($name);
  break;

  default:
    header('HTTP/1.1 405 Method Not Allowed');
    header('Allow: GET, PUT, DELETE');
   break;
}

...dan menyebutkan

Kami menggunakan pernyataan switch, yang harus dihindari dalam aplikasi nyata:

Beberapa pertanyaan:

  1. Mengapa Anda menghindari penggunaan fungsi ini?
  2. Apakah ada kerentanan dalam menggunakan pernyataan switch itu sendiri, atau variabel $_SERVER yang membuatnya rentan?
  3. Jawaban di postingan ini (Apakah $_SERVER['QUERY_STRING'] aman dari XSS?) merekomendasikan penggunaan htmlentities untuk melindungi nilai $_SERVER. Apakah ini cukup?

Terima kasih banyak!


person Community    schedule 29.09.2014    source sumber


Jawaban (2)


Mengapa Anda menghindari penggunaan fungsi ini?

Banyak programmer memilih alasan mereka untuk menghindari penggunaan pernyataan "switch", tergantung pada konteksnya.

Misalnya, sebuah proyek mungkin memiliki banyak pernyataan "switch" dengan kode duplikat untuk melakukan sesuatu yang akan diselesaikan dengan polimorfisme.

"Switch", dalam hal ini, digunakan untuk memetakan metode HTTP dengan callable (kecuali "default"): Anda dapat memetakan metode http ke callable yang dapat diganti saat runtime. Pemrogram Python yang mengikuti "filosofi pythonic" menggunakan kamus untuk melakukan hal yang sama seperti pernyataan "switch", tetapi dengan kemampuan untuk mengubah peta saat runtime.

Apakah ada kerentanan dalam menggunakan pernyataan switch itu sendiri, atau variabel $_SERVER yang membuatnya rentan?

Tidak, tidak ada kerentanan dalam menggunakan "switch" dengan sendirinya.

Anda tidak boleh memasukkan nilai dari $_SERVER karena mereka masukan dari klien web (biasanya browser). Skrip "curl" sederhana dapat mengirimkan data yang tidak akurat atau tidak valid, seperti alamat IP, Agen pengguna, referensi, dll. Ini berguna untuk pengikisan web (beberapa situs web diterapkan untuk mencegah pengikisan naif).

Periksa fungsi "filter_input" untuk memfilter nilai dari variabel global dengan input nilai ($_GET, $_POST, $_COOKIE, $_SERVER, $_ENV).

Jawaban dalam posting ini (Apakah $_SERVER['QUERY_STRING'] aman dari XSS?) merekomendasikan penggunaan htmlentities untuk melindungi nilai $_SERVER. Apakah ini cukup?

bergantung pada konteks.

Misalnya, jika Anda ingin menggunakannya untuk kode javascript, melindungi dari XSS saja tidak cukup. Dalam hal ini, Anda harus menggunakan fungsi untuk keluar dari string untuk javascript ("json_encode" mungkin berguna dalam kasus ini).

person Pedro Amaral Couto    schedule 30.09.2014
comment
Terima kasih banyak atas jawaban mendetailnya, terutama untuk tautan ke PHP yang lebih aman. - person ; 01.10.2014

Untuk menjawab pertanyaan switch Anda, alasan kemungkinan tidak menggunakannya dalam aplikasi adalah karena lebih lambat dibandingkan menggunakan if / else if / else -- ada beberapa tolok ukur yang tersedia di PHP Bench yang menunjukkan hal ini. Perbedaan kinerja switch vs if/else kemungkinan dapat diabaikan jika dibandingkan dengan waktu yang dibutuhkan untuk mengirimkan permintaan dan tanggapan melalui jaringan.

Beberapa programmer berpikir bahwa konstruksi switch kurang terbaca dibandingkan if/else -- itu tergantung selera pribadi. Tidak ada yang secara intrinsik "tidak aman" dalam penggunaan switch.

Ada sejumlah pertanyaan SO yang mencakup sanitasi input di PHP, jadi saya sarankan Anda memeriksanya. Misalnya. Lakukan htmlspecialchars dan mysql_real_escape_string menjaga kode PHP saya aman dari injeksi? dan Apa metode terbaik untuk membersihkan input pengguna dengan PHP?

person i alarmed alien    schedule 29.09.2014
comment
Terima kasih. Sebagian besar pertanyaan yang saya temukan mengenai sanitasi input di PHP mengacu pada pernyataan yang sudah disiapkan. Sepertinya tidak ada jawaban langsung terhadap situasi sanitasi (owasp.org/index.php/ XSS_Filter_Evasion_Cheat_Sheet) - person ; 29.09.2014