Saya mencari fungsi php yang akan membersihkan string dan membuatnya siap digunakan untuk nama file. Ada yang tahu yang berguna?
(Saya bisa menulis satu, tapi saya khawatir saya akan mengabaikan karakter!)
Edit: untuk menyimpan file pada sistem file Windows NTFS.
php
string
sanitization
pengguna151841
sumber
sumber
Jawaban:
Alih-alih mengkhawatirkan karakter yang terlewatkan - bagaimana dengan menggunakan daftar putih karakter yang ingin Anda gunakan? Misalnya, Anda dapat memungkinkan ol hanya baik'
a-z
,0-9
,_
, dan satu contoh dari periode (.
). Itu jelas lebih membatasi daripada kebanyakan sistem file, tetapi akan membuat Anda tetap aman.sumber
Membuat sedikit penyesuaian pada solusi Tor Valamo untuk memperbaiki masalah yang diketahui oleh Dominic Rodger, Anda dapat menggunakan:
sumber
..
setelahnya. Misalnya.?.
akan berakhir menjadi..
. Meskipun karena Anda memfilter,/
saya tidak dapat melihat bagaimana Anda akan mengeksploitasinya lebih jauh sekarang, tetapi ini menunjukkan mengapa pemeriksaan..
tidak efektif di sini. Lebih baik lagi mungkin, jangan diganti, tolak saja jika tidak memenuhi syarat.[^a-z0-9_-]
jika Anda ingin benar-benar membatasi - atau cukup gunakan nama yang dihasilkan dan buang nama yang diberikan dan hindari semua masalah ini. :-)Ini adalah bagaimana Anda dapat membersihkan sistem file seperti yang diminta
Segala sesuatu yang lain diperbolehkan dalam filesystem, jadi pertanyaannya terjawab dengan sempurna ...
... tetapi bisa berbahaya untuk mengizinkan, misalnya tanda kutip tunggal
'
dalam nama file jika Anda menggunakannya nanti dalam konteks HTML yang tidak aman karena nama file ini benar-benar legal:menjadi lubang XSS :
Karena itu, perangkat lunak CMS Wordpress yang populer menghapusnya, tetapi mereka menutupi semua karakter yang relevan hanya setelah beberapa pembaruan :
Terakhir, daftar mereka sekarang menyertakan sebagian besar karakter yang merupakan bagian dari karakter yang dilindungi URI dan daftar karakter URL yang tidak aman .
Tentu saja Anda dapat dengan mudah menyandikan semua karakter ini pada keluaran HTML, tetapi sebagian besar pengembang dan saya juga, mengikuti ungkapan "Lebih baik aman daripada menyesal" dan menghapusnya terlebih dahulu.
Jadi akhirnya saya menyarankan untuk menggunakan ini:
Segala sesuatu yang lain yang tidak menyebabkan masalah dengan sistem file harus menjadi bagian dari fungsi tambahan:
Dan pada titik ini Anda perlu membuat nama file jika hasilnya kosong dan Anda dapat memutuskan apakah Anda ingin menyandikan karakter UTF-8. Tetapi Anda tidak membutuhkannya karena UTF-8 diizinkan di semua sistem file yang digunakan dalam konteks hosting web.
Satu-satunya hal yang harus Anda lakukan adalah menggunakan
urlencode()
(seperti yang Anda harapkan dengan semua URL Anda) sehingga nama fileსაბეჭდი_მანქანა.jpg
menjadi URL ini sebagai Anda<img src>
atau<a href>
: http://www.maxrev.de/html/img/%E1%83% A1% E1% 83% 90% E1% 83% 91% E1% 83% 94% E1% 83% AD% E1% 83% 93% E1% 83% 98_% E1% 83% 9B% E1% 83% 90% E1% 83% 9C% E1% 83% A5% E1% 83% 90% E1% 83% 9C% E1% 83% 90.jpgStackoverflow melakukan itu, jadi saya dapat memposting tautan ini seperti yang dilakukan pengguna:
http://www.maxrev.de/html/img/ საბეჭდი_მანქანა. Jpg
Jadi ini adalah nama file resmi yang lengkap dan bukan masalah seperti yang disebutkan @ SequenceDigitale.com dalam jawabannya .
sumber
r-u-l-e-s
dan saya tidak tahu mengapa ini terjadi. Tentu itu bukan kesalahan fungsi, tetapi hanya bertanya - apa yang mungkin menjadi alasan perilaku seperti itu? Pengodean salah?preg_replace
masukfilter_filename()
.Bagaimana dengan menggunakan rawurlencode ()? http://www.php.net/manual/en/function.rawurlencode.php
Ini adalah fungsi yang membersihkan bahkan Karakter Cina:
Berikut penjelasannya
Oke, beberapa nama file tidak akan relevan tetapi dalam banyak kasus itu akan berhasil.
ex. Nama Asli: "საბეჭდი-და-ტიპოგრაფიული. Jpg"
Nama Output: "-E1-83-A1-E1-83-90-E1-83-91-E1-83-94-E1-83-AD-E1-83-93-E1-83-98 - E1- 83-93-E1-83-90 - E1-83-A2-E1-83-98-E1-83-9E-E1-83-9D-E1-83-92-E1-83-A0-E1-83 -90-E1-83-A4-E1-83-98-E1-83-A3-E1-83-9A-E1-83-98.jpg "
Lebih baik seperti itu daripada kesalahan 404.
Semoga bermanfaat.
Carl.
sumber
http://www.maxrev.de/html/img/საბეჭდი_მანქანა.jpg
kehttp://www.maxrev.de/html/img/%E1%83%A1%E1%83%90%E1%83%91%E1%83%94%E1%83%AD%E1%83%93%E1%83%98_%E1%83%9B%E1%83%90%E1%83%9C%E1%83%A5%E1%83%90%E1%83%9C%E1%83%90.jpg
dalam kode sumber HTML seperti yang diharapkan Anda lakukan dengan semua URL Anda.strip_tags()
dan setelah itu Anda menghapus[<>]
. Oleh karenastrip_tags()
itu tidak terlalu dibutuhkan sama sekali. Poin yang sama adalah kutipannya. Tidak ada tanda kutip tersisa saat Anda mendekode denganENT_QUOTES
. Danstr_replace()
tidak menghapus spasi putih berturut-turut dan kemudian Anda gunakanstrtolower()
untuk string multi-byte. Dan mengapa Anda mengubahnya menjadi huruf kecil? Dan akhirnya Anda tidak menemukan karakter yang dilindungi undang-undang seperti yang disebutkan @BasilMusa. Detail lebih lanjut dalam jawaban saya: stackoverflow.com/a/42058764/318765SOLUSI 1 - sederhana dan efektif
$file_name = preg_replace( '/[^a-z0-9]+/', '-', strtolower( $url ) );
[^a-z0-9]+
akan memastikan, nama file hanya menyimpan huruf dan angka'-'
membuat nama file tetap terbacaContoh:
SOLUSI 2 - untuk URL yang sangat panjang
Anda ingin menyimpan konten URL dan hanya perlu memiliki nama file yang unik. Saya akan menggunakan fungsi ini:
$file_name = md5( strtolower( $url ) )
ini akan membuat nama file dengan panjang tetap. Hash MD5 dalam banyak kasus cukup unik untuk penggunaan semacam ini.
Contoh:
sumber
Nah, tempnam () akan melakukannya untuk Anda.
http://us2.php.net/manual/en/function.tempnam.php
tapi itu menciptakan nama yang sama sekali baru.
Untuk membersihkan string yang ada, cukup batasi apa yang dapat dimasukkan pengguna dan buat menjadi huruf, angka, titik, tanda hubung, dan garis bawah, lalu bersihkan dengan regex sederhana. Periksa karakter apa yang perlu dihilangkan atau Anda bisa mendapatkan positif palsu.
sumber
Tambahkan / hapus lebih banyak karakter yang valid tergantung pada apa yang diizinkan untuk sistem Anda.
Atau Anda dapat mencoba membuat file dan kemudian mengembalikan kesalahan jika buruk.
sumber
..
, yang mungkin atau mungkin tidak menjadi masalah.PHP menyediakan fungsi untuk membersihkan teks ke format yang berbeda
filter.filters.sanitize
Cara:
sumber
aman: ganti setiap urutan NOT "a-zA-Z0-9_-" menjadi tanda hubung; tambahkan ekstensi sendiri.
sumber
Ekspresi berikut membuat string yang bagus, bersih, dan dapat digunakan:
Mengubah keuangan hari ini: penagihan menjadi tagihan -keuangan-hari ini
sumber
preg_replace
bendera global implisit. Jadi tidak perlu g jika preg_replace sedang digunakan. Saat kita ingin mengontrol jumlah penggantian, preg_replace memilikilimit
parameter untuk itu. Baca dokumentasi preg_replace untuk lebih lanjut.Membuat sedikit penyesuaian pada solusi Sean Vieira untuk memungkinkan adanya titik tunggal, Anda dapat menggunakan:
sumber
Ini mungkin agak berat, tetapi cukup fleksibel untuk membersihkan string apa pun menjadi
en
nama file atau nama folder bergaya "aman" (atau heck, bahkan siput dan benda-benda yang digosok jika Anda menekuknya).1) Membangun nama file lengkap (dengan nama cadangan jika masukan benar-benar terpotong):
2) Atau hanya menggunakan util filter tanpa membuat nama file lengkap (mode ketat
true
tidak akan mengizinkan [] atau () dalam nama file):3) Dan inilah fungsinya:
Jadi katakanlah beberapa masukan pengguna adalah:
.....<div></div><script></script>& Weiß Göbel 中文百强网File name %20 %20 %21 %2C Décor \/. /. . z \... y \...... x ./ “This name” is & 462^^ not = that grrrreat -][09]()1234747) საბეჭდი-და-ტიპოგრაფიული
Dan kami ingin mengubahnya menjadi sesuatu yang lebih ramah untuk membuat tar.gz dengan panjang nama file 255 karakter. Berikut adalah contoh penggunaan. Catatan: contoh ini menyertakan format ekstensi tar.gz yang salah sebagai bukti konsep, Anda masih harus memfilter ext setelah string dibuat sesuai dengan daftar putih Anda.
Outputnya adalah:
_wei_gbel_file_name_dcor_._._._z_._y_._x_._this_name_is_462_not_that_grrrreat_][09]()1234747)_.tar.gz
Anda dapat bermain dengannya di sini: https://3v4l.org/iSgi8
Atau Intinya: https://gist.github.com/dhaupin/b109d3a8464239b7754a
EDIT: filter skrip yang diperbarui untuk
menggantikan ruang, tautan 3v4l yang diperbaruisumber
Yang terbaik yang saya tahu hari ini adalah metode statis Strings :: webalize dari kerangka Nette.
BTW, ini menerjemahkan semua tanda diakritik ke dasarnya .. š => s ü => u ß => ss dll.
Untuk nama file Anda harus menambahkan titik "." ke parameter karakter yang diizinkan.
sumber
urlencode()
sebelum Anda menggunakan nama file sebagaisrc
atauhref
. Satu-satunya sistem file yang saat ini digunakan yang bermasalah dengan UTF-8 adalah FATx (digunakan oleh XBOX): en.wikipedia.org/wiki/Comparison_of_file_systems#Limits Dan saya rasa ini tidak digunakan oleh server webTampaknya ini semua bergantung pada pertanyaan, apakah mungkin untuk membuat nama file yang dapat digunakan untuk meretas ke server (atau melakukan beberapa kerusakan lainnya). Jika tidak, maka tampaknya jawaban sederhana untuk mencoba membuat file di mana pun itu akan, pada akhirnya, digunakan (karena itu akan menjadi sistem operasi pilihan, tidak diragukan lagi). Biarkan sistem operasi menyelesaikannya. Jika ada keluhan, kirim kembali keluhan itu ke Pengguna sebagai Kesalahan Validasi.
Ini memiliki keuntungan tambahan karena portabel yang andal, karena semua (saya cukup yakin) sistem operasi akan mengeluh jika nama file tidak dibentuk dengan benar untuk OS itu.
Jika adalah mungkin untuk melakukan hal-hal jahat dengan nama file, mungkin ada langkah-langkah yang dapat diterapkan sebelum menguji nama file pada sistem operasi penduduk - tindakan kurang rumit daripada penuh "sanitasi" dari nama file.
sumber
satu arah
sumber
/
dan..
nama file yang diberikan pengguna bisa berbahaya. Jadi Anda harus menyingkirkan ini dengan sesuatu seperti:sumber
..name
yang tidak akan keluar dari apapun. Menghapus semua karakter pemisah jalur seharusnya cukup untuk mencegah traversal direktori. (Penghapusan..
secara teknis tidak perlu.)./.
menjadi..
. Dan akhirnya jawaban ini merindukan semua karakter khusus sistem file lainnya seperti NULL. Selengkapnya di jawaban saya: stackoverflow.com/a/42058764/318765Karena pengguna mungkin menggunakan garis miring untuk memisahkan dua kata, akan lebih baik untuk mengganti dengan tanda hubung daripada NULL
sumber