Hanya solusi otentikasi pengguna sederhana di dalam kerangka kerangka kerja super sederhana yang langsung berfungsi (dan dilengkapi dengan penginstal otomatis), menggunakan implementasi hashing/salting kata sandi bcrypt resmi yang tahan masa depan dari PHP 5.5+, plus beberapa fitur bagus yang akan mempercepat waktu dari ide hingga aplikasi prototipe pertama yang dapat digunakan secara dramatis. Tidak lebih. Proyek ini berfokus pada kesederhanaan yang nyata. Semuanya sesederhana mungkin, dibuat untuk proyek yang lebih kecil, pekerjaan agensi biasa, dan draf cepat. Jika Anda ingin membangun aplikasi perusahaan besar dengan semua fitur yang dimiliki kerangka kerja modern, lihatlah Laravel, Symfony atau Yii, tetapi jika Anda hanya ingin dengan cepat membuat sesuatu yang berfungsi, maka skrip ini mungkin menarik untuk Anda.
Arsitektur HUGE yang sesederhana mungkin terinspirasi oleh beberapa pembicaraan konferensi, slide dan artikel tentang aplikasi besar yang - secara mengejutkan dan disengaja - kembali ke dasar-dasar pemrograman, menggunakan pemrograman prosedural, kelas statis, konstruksi yang sangat sederhana, tidak sepenuhnya KERING kode dll. sambil menjaga kode tetap mudah dibaca (StackOverflow, Wikipedia, SoundCloud).
Beberapa Kata Kunci menarik dalam konteks ini: KISS, YAGNI, Feature Creep, Produk yang layak minimum.
Untuk menjaga proyek ini tetap stabil, aman, bersih dan minimal, saya memutuskan untuk mengurangi pengembangan HUGE seminimal mungkin. Jangan khawatir, ini sebenarnya hal yang baik: Fitur baru biasanya berarti bug baru, banyak pengujian, perbaikan, ketidakcocokan, dan bagi sebagian orang bahkan tekanan pembaruan yang berat. Karena HUGE adalah skrip yang sangat penting bagi keamanan, fitur-fitur baru tidak sepenting inti yang stabil dan aman, inilah alasan orang menggunakannya. Artinya:
Dan sejujurnya, mempertahankan kerangka kerja gratis di waktu luang saya yang jarang juga bukanlah hal yang ingin saya lakukan secara permanen. :)
Terakhir, sebuah catatan kecil: Dunia PHP telah berkembang secara dramatis, kami memiliki kerangka kerja yang luar biasa dengan fitur-fitur luar biasa dan tim profesional yang besar, dokumentasi yang ditulis dengan sangat baik, dan komunitas yang besar, jadi tidak ada alasan untuk melakukan banyak pekerjaan pada kerangka kerja lain. Sebaliknya, harap berkomitmen pada kerangka kerja yang populer, maka pekerjaan Anda akan memiliki dampak yang lebih besar dan digunakan oleh lebih banyak orang!
Terima kasih kepada semua orang di sekitar proyek ini, selamat bersenang-senang! XOXO, Kris
Pada tahun 2010/2011, tidak ada solusi login yang berguna di dunia PHP, setidaknya untuk non-ahli. Jadi saya melakukan kesalahan terburuk yang dilakukan setiap pengembang muda: Mencoba membangun sesuatu sendiri tanpa mengetahui dasar-dasar keamanan. Yang membuatnya lebih buruk lagi adalah: Web dulu (dan sekarang) penuh dengan tutorial yang sangat rusak tentang cara membangun sistem autentikasi pengguna, bahkan perusahaan terbesar di dunia pun melakukan kesalahan ini (kita berbicara tentang SONY, LinkedIn, dan Adobe di sini), dan juga banyak kerangka kerja utama dalam semua bahasa pemrograman besar (!) menggunakan teknologi penyimpanan kata sandi yang ketinggalan jaman dan tidak aman.
Namun, pada tahun 2012 pakar keamanan Anthony Ferrara menerbitkan perpustakaan PHP kecil, memungkinkan hashing kata sandi yang sangat aman, modern, dan benar dalam PHP 5.3 dan 5.4, dapat digunakan oleh setiap pengembang tanpa stres dan tanpa pengetahuan apa pun tentang keamanan internal. Scriptnya sangat mengagumkan sehingga ditulis ke dalam inti PHP 5.5, yang merupakan standar de-facto saat ini.
Ketika ini keluar, saya mencoba menggunakan perpustakaan telanjang ini untuk membangun sistem login out-of-the-box yang berfungsi penuh untuk beberapa proyek pribadi dan komersial, dan memasukkan kodenya ke GitHub. Banyak orang menganggap ini berguna, berkontribusi dan memperbaiki bug proyek, membuat fork, versi yang lebih kecil dan lebih besar. Hasilnya adalah proyek ini.
Harap dicatat: Sekarang, pada tahun 2015, sebagian besar kerangka kerja utama memiliki logika otentikasi pengguna yang sangat baik yang tertanam secara default. Hal ini tidak terjadi bertahun-tahun yang lalu. Jadi, dari sudut pandang saat ini mungkin lebih cerdas jika memilih Laravel, Yii atau Symfony untuk proyek yang serius. Namun jangan ragu untuk mencoba BESAR, penginstal otomatis akan menjalankan instalasi yang berfungsi penuh dalam beberapa menit dan tanpa konfigurasi apa pun.
Dan kenapa diberi nama "BESAR"? Ini kombinasi yang bagus untuk TINY, MINI dan MINI2, MINI3, yang merupakan beberapa proyek lama saya lainnya. Kerangka kerja mikro super minimal untuk pengembangan situs web sederhana yang sangat cepat dan sederhana.
Lihat demo langsung versi 3.0 yang lebih lama di sini dan phpinfo() server di sini.
Ada banyak pekerjaan di balik proyek ini. Saya mungkin menghemat ratusan, mungkin ribuan jam kerja (hitunglah biaya pengembang). Jadi ketika Anda menghasilkan uang dengan menggunakan HUGE, bersikaplah adil dan kembalikan sesuatu ke sumber terbuka. BESAR sepenuhnya gratis untuk penggunaan pribadi dan komersial.
Dukung proyek ini dengan menyewa server di DigitalOcean atau sekadar memberi tip kopi di BuyMeACoffee.com. Terima kasih! :)
Juga merasa bebas untuk berkontribusi pada proyek ini.
Berlisensi di bawah MIT. Benar-benar gratis untuk proyek pribadi atau komersial.
Pastikan Anda mengetahui dasar-dasar pemrograman berorientasi objek dan MVC, mampu menggunakan baris perintah dan pernah menggunakan Composer sebelumnya. Skrip ini bukan untuk pemula.
Yo, sepenuhnya otomatis. Mengapa ? Karena saya selalu benci menghabiskan waktu berhari-hari mencari tahu cara memasang sesuatu. Ini akan menghemat banyak waktu dan kegelisahan Anda. Sumbangkan kopi jika Anda menyukainya.
Jika Anda menggunakan Vagrant untuk pengembangan Anda, sederhana saja
vagrant box add ubuntu/trusty64
vagrant up
di folder itu.5 menit kemudian Anda akan menginstal HUGE sepenuhnya di dalam Ubuntu 14.04 LTS. Kode lengkap akan disinkronkan secara otomatis dengan folder saat ini. Kata sandi root MySQL dan kata sandi root PHPMyAdmin diatur ke 12345678 . Secara default 192.168.33.111 adalah IP kotak baru Anda.
Instalasi yang sangat sederhana di server khas Ubuntu 14.04 LTS yang segar dan telanjang:
Unduh skrip penginstal
wget https://raw.githubusercontent.com/panique/huge/master/_one-click-installation/bootstrap.sh
Jadikan itu bisa dieksekusi
chmod +x bootstrap.sh
Jalankan! Berikan waktu beberapa menit untuk melakukan semua tugas. Dan ya, kamu bisa berterima kasih padaku nanti :)
sudo ./bootstrap.sh
Composer install
pada folder akar aplikasi untuk menginstal dependensi"Email tidak berfungsi"? Lihat pemecahan masalah di bawah. TODO
Ini hanyalah panduan singkat untuk memudahkan pengaturan lingkungan pengembangan!
Pastikan Anda telah menginstal Apache, PHP 5.5+ dan MySQL. Tutorial di sini. Nginx pasti akan berfungsi juga, tetapi belum ada pedoman instalasi yang tersedia.
Edit vhost untuk memungkinkan URL bersih dan rutekan semua lalu lintas ke folder /public proyek Anda:
sudo nano /etc/apache2/sites-available/000-default.conf
dan membuat file terlihat seperti
<VirtualHost *:80>
DocumentRoot "/var/www/html/public"
<Directory "/var/www/html/public">
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
Aktifkan mod_rewrite dan mulai ulang apache.
sudo a2enmod rewrite
service apache2 restart
Instal curl (diperlukan untuk menggunakan git), openssl (diperlukan untuk mengkloning dari GitHub, karena github hanya https), PHP GD, lib grafis (kami membuat captcha dan avatar), dan git.
sudo apt-get -y install curl
sudo apt-get -y install php5-curl
sudo apt-get -y install openssl
sudo apt-get -y install php5-gd
sudo apt-get -y install git
git clone BESAR
sudo git clone https://github.com/panique/huge " /var/www/html "
Instal Komposer
curl -s https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
Buka folder proyek, muat paket Komposer (--dev opsional, Anda tahu kesepakatannya)
cd /var/www/html
composer install --dev
Jalankan pernyataan SQL. Melalui phpmyadmin atau melalui baris perintah misalnya. 12345678 adalah contoh kata sandinya. Perhatikan bahwa ini ditulis tanpa spasi.
sudo mysql -h " localhost " -u " root " " -p12345678 " < " /var/www/html/application/_installation/01-create-database.sql "
sudo mysql -h " localhost " -u " root " " -p12345678 " < " /var/www/html/application/_installation/02-create-table-users.sql "
sudo mysql -h " localhost " -u " root " " -p12345678 " < " /var/www/html/application/_installation/03-create-table-notes.sql "
Jadikan folder avatar dapat ditulisi (pastikan jalurnya benar!)
sudo chown -R www-data " /var/www/html/public/avatars "
Jika ini tidak berhasil untuk Anda, maka Anda dapat mencoba cara yang sulit dengan mengaturnya secara alternatif
sudo chmod 0777 -R " /var/www/html/public/avatars "
Hapus file demo default Apache
sudo rm " /var/www/html/index.html "
Edit konfigurasi aplikasi di application/config/config.development.php dan masukkan kredensial database Anda.
Bagian terakhir (tidak diperlukan untuk pengujian pertama): Tetapkan kredensial SMTP Anda di file yang sama dan atur EMAIL_USE_SMTP ke true, sehingga Anda dapat mengirim email yang benar. Sangat disarankan untuk menggunakan SMTP untuk pengiriman email! Pengiriman asli melalui mail() PHP tidak akan berfungsi di hampir semua kasus (pemblokiran spam). Saya menggunakan SMTP2GO.
Kemudian periksa IP/domain server Anda. Semuanya harus bekerja dengan baik.
Ini adalah pengaturan NGINX yang belum teruji. Silakan beri komentar pada tiket jika Anda melihat masalah.
server {
# your listening port
listen 80;
# your server name
server_name example.com;
# your path to access log files
access_log /srv/www/example.com/logs/access.log;
error_log /srv/www/example.com/logs/error.log;
# your root
root /srv/www/example.com/public_html;
# huge
index index.php;
# huge
location / {
try_files $uri /index.php?url=$uri&$args;
}
# your PHP config
location ~ .php$ {
try_files $uri = 401;
include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/var/run/php-fastcgi/php-fastcgi.socket;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
Terima kasih banyak kepada razuro untuk pengaturan yang bagus ini: Letakkan ini di dalam folder root Anda, tetapi jangan letakkan web.config apa pun di folder publik Anda.
<?xml version="1.0" encoding="UTF-8"?><configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Imported Rule 1" stopProcessing="true">
<match url="^(.*)$" ignoreCase="false" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" negate="true" />
</conditions>
<action type="Rewrite" url="public/index.php?url={R:1}" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
Temukan tiket aslinya di sini.
Secara default ada dua pengguna demo, pengguna normal dan pengguna admin. Untuk info lebih lanjut tentang hal itu silakan lihat bagian peran pengguna pada blok dokumentasi kecil di dalam readme ini.
Pengguna normal: Nama pengguna adalah demo2
, kata sandinya adalah 12345678
. Pengguna sudah diaktifkan. Pengguna admin (dapat menghapus dan menangguhkan pengguna lain): Nama pengguna adalah demo
, kata sandinya adalah 12345678
. Pengguna sudah diaktifkan.
Ada beberapa file di folder root proyek yang mungkin mengganggu:
README dan CHANGELOG menjelaskan dengan sendirinya.
Dokumentasi nyata sedang dibuat. Sampai saat itu, silakan lihat kodenya dan gunakan fitur penyelesaian kode IDE Anda untuk mendapatkan gambaran cara kerjanya, ini cukup jelas ketika Anda melihat file pengontrol, file model, dan bagaimana data ditampilkan di file tampilan. Mohon maaf karena belum ada dokumentasinya, tetapi waktunya jarang dan kami semua melakukan ini secara gratis di waktu luang kami :)
Saat ini ada dua jenis pengguna: Pengguna normal dan admin. Ada yang persis sama, tapi...
Pengguna admin dapat menghapus dan menangguhkan pengguna lain, mereka memiliki tombol tambahan "admin" di navigasi. Pengguna admin memiliki nilai 7
di dalam bidang tabel database user_account_type
. Mereka tidak dapat meningkatkan atau menurunkan versi akun mereka (karena ini tidak masuk akal).
Pengguna normal pasti tidak memiliki fitur admin. Namun mereka dapat meningkatkan dan menurunkan versi akun mereka (cobalah melalui /user/changeUserRole), yang pada dasarnya merupakan implementasi super sederhana dari konsep pengguna dasar/pengguna premium. Pengguna normal memiliki nilai 1
atau 2
di dalam bidang tabel database user_account_type
. Secara default semua pengguna baru yang terdaftar adalah pengguna biasa dengan peran pengguna 1 pastinya.
Lihat bagian "Menguji dengan pengguna demo" pada readme ini untuk info lebih lanjut.
Ada juga permintaan tarik yang sangat menarik yang menambahkan peran pengguna dan izin pengguna, yang tidak diintegrasikan ke dalam proyek karena terlalu canggih dan rumit. Tapi, ini mungkin yang Anda butuhkan, silakan mencobanya.
Untuk mencegah serangan CSRF, HUGE melakukan hal ini dengan cara yang paling umum, dengan menggunakan token keamanan ketika pengguna mengirimkan formulir penting. Artinya: Ketika PHP merender formulir untuk pengguna, aplikasi menempatkan "string acak" di dalam formulir (sebagai kolom masukan tersembunyi), yang dihasilkan melalui Csrf::makeToken() (application/core/Csrf.php), yang juga menyimpan token ini ke sesi. Saat formulir dikirimkan, aplikasi memeriksa apakah permintaan POST berisi token formulir yang ada di dalam sesi.
Fitur pencegahan CSRF ini saat ini diterapkan pada proses formulir login (lihat application/view/login/index.php ) dan proses formulir perubahan nama pengguna (lihat application/view/user/editUsername.php ), sebagian besar formulir lainnya tidak aman- kritis dan harus tetap sesederhana mungkin.
Jadi, untuk melakukan ini dengan formulir normal, cukup: Di formulir Anda, sebelum tombol kirim, masukkan: <input type="hidden" name="csrf_token" value="<?= Csrf::makeToken(); ?>" />
Kemudian, dalam tindakan pengontrol, validasi token CSRF yang dikirimkan bersama formulir dengan melakukan:
// check if csrf token is valid
if (!Csrf::isTokenValid()) {
LoginModel::logout();
Redirect::home();
exit();
}
Terima kasih banyak kepada OmarElGabry karena telah menerapkan ini!
Secara teori: Ya, tapi fitur ini tidak berfungsi dalam pengujian saya. Karena ini merupakan fitur eksternal, silakan lihat tiket yang sesuai untuk informasi lebih lanjut.
Ada beberapa fitur luar biasa atau ide fitur yang dibuat oleh orang-orang hebat, namun fitur ini terlalu menarik untuk dimasukkan ke dalam versi utama HUGE, namun lihatlah tiket ini jika Anda tertarik:
Ide dari proyek ini adalah untuk menyediakan aplikasi barebone super sederhana dengan sistem otentikasi pengguna lengkap di dalamnya yang berfungsi dengan baik dan stabil. Karena sifat skrip ini yang sangat terkait dengan keamanan, setiap perubahan berarti banyak pekerjaan, banyak pengujian, menangkap kasus-kasus edge, dll., dan pada akhirnya saya menghabiskan 90% waktu untuk menguji dan memperbaiki fitur-fitur baru atau kerusakan fitur-fitur baru yang sudah ada. hal-hal lain, dan melakukan hal ini bukanlah hal yang ingin dilakukan siapa pun secara gratis di waktu luang yang langka :)
Untuk menjaga agar proyek tetap stabil, bersih, dan dapat dipelihara, saya dengan hormat mengumumkan "Soft-End of Life" untuk proyek ini, artinya:
A. BESAR tidak akan mendapatkan fitur baru apa pun di masa mendatang, tetapi ... B. perbaikan bug dan koreksi akan dilakukan, mungkin selama bertahun-tahun
Saat HUGE sedang dalam pengembangan, ada 3 aturan utama yang membantu saya (dan mungkin orang lain) untuk menulis kode yang minimal, bersih, dan berfungsi. Mungkin bermanfaat bagi Anda juga:
Seperti disebutkan dalam pendahuluan README ini, ada juga beberapa konsep hebat yang mungkin bisa membantu Anda ketika mengembangkan hal-hal keren: KISS, YAGNI, Feature Creep, Produk yang layak minimum.
Untuk menghindari pekerjaan yang tidak perlu bagi kita semua, saya menyarankan semua orang untuk menggunakan HUGE untuk proyek sederhana yang hanya membutuhkan fitur-fitur yang sudah ada, dan jika Anda benar-benar membutuhkan arsitektur, migrasi, perutean, 2FA, dll yang tenang, maka itu lebih mudah, lebih bersih dan lebih cepat cukup menggunakan Laravel, Symfony atau Zend.
Namun, berikut adalah kemungkinan fitur yang disarankan komunitas, diambil dari banyak tiket. Jangan ragu untuk menerapkannya ke dalam cabang proyek Anda:
Ada dua (!) forum dukungan untuk v1 dan v2 proyek ini (HUGE adalah v3), dan keduanya dirusak oleh orang-orang yang bahkan tidak membaca readme dan/atau pedoman instalasi. Pertanyaan yang paling banyak diajukan adalah "skrip tidak berfungsi, mohon bantuannya" tanpa memberikan informasi berguna apa pun (seperti kode atau pengaturan server atau bahkan versi yang digunakan). Saat saya menulis baris ini, seseorang baru saja bertanya melalui Twitter "bagaimana cara menginstal tanpa Komposer". Anda tahu apa yang saya maksud :) - 99% pertanyaan tidak diperlukan jika orang-orang sudah membaca pedoman, melakukan riset minimal sendiri, atau berhenti membuat hal-hal rumit yang tidak perlu. Dan bahkan ketika menulis jawaban rinci kebanyakan dari mereka masih mengacaukannya, sehingga menimbulkan kata-kata kasar dan keluhan (untuk dukungan gratis untuk perangkat lunak gratis!). Sungguh membuat frustrasi menghadapi hal ini setiap hari, terutama ketika orang-orang menganggap remeh bahwa sudah menjadi tugas pengembang sumber terbuka untuk memberikan dukungan terperinci, gratis, dan pribadi untuk setiap permintaan "tolong bantu".
Jadi saya memutuskan untuk sepenuhnya menghentikan dukungan gratis apa pun. Untuk pertanyaan serius tentang masalah nyata di dalam skrip, silakan gunakan fitur masalah GitHub.
Kata-kata yang kasar, tetapi karena pada dasarnya setiap proyek internet publik dilecehkan, dirusak, dan diejek akhir-akhir ini oleh orang-orang yang sangat aneh, maka diperlukan: Beberapa aturan sederhana.
Hormatilah bahwa ini hanyalah naskah sederhana yang ditulis oleh sukarelawan tidak berbayar di waktu luang mereka. Ini BUKAN perangkat lunak bisnis yang Anda beli seharga $10.000. Tidak ada alasan untuk mengeluh (!) tentang perangkat lunak sumber terbuka gratis. Sikap terhadap perangkat lunak bebas benar-benar membuat frustrasi akhir-akhir ini, orang-orang menganggap remeh segalanya tanpa menyadari pekerjaan di baliknya, dan fakta bahwa mereka mendapatkan perangkat lunak yang serius secara gratis, sehingga menghemat ribuan dolar. Jika Anda tidak menyukainya, jangan gunakan itu. Jika Anda menginginkan sebuah fitur, cobalah untuk mengambil bagian dalam prosesnya, bahkan mungkin membuatnya sendiri dan menambahkannya ke proyek! Bersikaplah baik dan hormat. Kritik yang membangun pasti selalu diterima!
Jangan menghina, jangan membenci, jangan mengirim spam, jangan merusak. Mohon jangan meminta dukungan gratis secara pribadi, jangan bertanya apakah seseorang dapat melakukan pekerjaan Anda untuk Anda. Sebelum Anda menanyakan sesuatu, pastikan Anda telah membaca README, mengikuti setiap tutorial, memeriksa ulang kodenya dan mencoba menyelesaikan masalahnya sendiri.
Troll dan orang yang sangat mengganggu akan mendapatkan ban/blok permanen. GitHub memiliki tim anti-penyalahgunaan yang sangat kuat.
Harap komit hanya di cabang pengembangan . Cabang master akan selalu berisi versi stabil.
Scrutinizer (cabang master), Scrutinizer (cabang pengembangan), Code Climate, Codacy, SensioLabs Insight.
Karena kemungkinan konsekuensi ketika menerbitkan bug pada proyek sumber terbuka publik, saya dengan hormat meminta Anda mengirimkan bug yang sangat besar ke alamat email saya, bukan mempostingnya di sini. Jika bug tidak menarik bagi penyerang: Jangan ragu untuk membuat masalah GitHub yang normal.
Lihat masalah aktif di sini: https://github.com/panique/huge/issues?state=open
Masalah menarik: Saat pengguna membuka situs web Anda, browser pengguna juga akan meminta satu atau lebih (!) favicon (ukuran berbeda). Jika file statis ini tidak ada, aplikasi Anda akan mulai menghasilkan respons 404 dan halaman 404 untuk setiap file. Ini menghabiskan banyak daya server dan juga tidak berguna, oleh karena itu pastikan Anda selalu memiliki favicon atau menanganinya dari level Apache/nginx.
HUGE mencoba menangani ini dengan mengirimkan gambar kosong di kepala view/_templates/header.php !
Lebih lanjut di dalam tiket ini: Kembalikan 404 yang tepat untuk favicon.ico yang hilang, gambar yang hilang, dll.
Lebih lanjut di sini di Stackflow: Bagaimana cara mencegah permintaan favicon.ico? Bukankah konyol jika favicon kecil memerlukan permintaan HTTP lagi? Bagaimana cara membuat favicon menjadi sprite?.
Saya juga ngeblog di Dev Metal .