Panduan definitif untuk membentuk berbasis web otentikasi
Bentuk otentikasi berbasis website
Kami percaya bahwa Stack Overflow seharusnya tidak hanya menjadi sumber daya yang sangat spesifik pertanyaan teknis, tetapi juga untuk pedoman umum tentang cara untuk memecahkan variasi pada masalah-masalah umum. "otentikasi berbasis Form untuk website" harus baik-baik saja topik untuk percobaan tersebut.
Ini harus mencakup topik-topik seperti:
- Bagaimana untuk log in
- Cara log out
- Bagaimana untuk tetap masuk
- Mengelola cookie (termasuk pengaturan yang direkomendasikan)
- SSL/HTTPS enkripsi
- Bagaimana untuk menyimpan password
- Menggunakan pertanyaan rahasia
- Lupa username/password fungsi
- Penggunaan nonces untuk mencegah cross-site request pemalsuan (CSRF)](https://en.wikipedia.org/wiki/Cross-site_request_forgery)
- OpenID
- "Ingat saya" centang
- Browser pelengkapan otomatis username dan password
- Url rahasia (umum URL dilindungi oleh digest)
- Memeriksa kekuatan password
- E-mail validasi
- dan banyak lagi tentang otentikasi berbasis form...
Ini tidak harus mencakup hal-hal seperti:
- Peran dan otorisasi
- HTTP otentikasi dasar
Mohon bantu kami dengan:
- Menunjukkan keindahannya.
- Mengirimkan artikel yang baik tentang subjek ini
- Mengedit jawaban resmi
5304
12
BAGIAN I: Bagaimana Untuk Log In ##
Kami'll asumsikan anda sudah tahu bagaimana membangun sebuah login+password form HTML yang Posting nilai script pada sisi server untuk otentikasi. Bagian di bawah ini akan bergerak dengan pola suara praktis auth, dan bagaimana untuk menghindari yang paling umum keamanan perangkap. Untuk HTTPS atau tidak ke HTTPS? Kecuali jika koneksi sudah aman (yaitu, terowongan melalui HTTPS menggunakan SSL/TLS), anda login form nilai-nilai yang akan dikirim di cleartext, yang memungkinkan siapa pun menguping pada garis antara browser dan web server akan dapat membaca login sebagai mereka melewati. Jenis penyadapan ini dilakukan secara rutin oleh pemerintah, tapi secara umum, kami tidak't alamat 'dimiliki' kabel lain untuk mengatakan ini: Hanya menggunakan HTTPS. Pada dasarnya, satu-satunya praktis cara untuk melindungi terhadap penyadapan/packet sniffing pada saat login dengan menggunakan HTTPS atau sertifikat lain yang berbasis skema enkripsi (misalnya, [TLS][1]) atau terbukti & diuji tantangan-respon skema (misalnya, [Diffie-Hellman][2] berbasis SRP). Metode lainnya dapat dengan mudah dielakkan oleh menguping penyerang. Tentu saja, jika anda bersedia untuk mendapatkan sedikit tidak praktis, anda juga bisa mempekerjakan beberapa bentuk otentikasi dua faktor skema (misalnya aplikasi Google Authenticator, fisik 'perang dingin gaya' codebook, atau RSA key generator dongle). Jika diterapkan dengan benar, ini bisa bekerja bahkan dengan sambungan yang tidak aman, tapi itu's sulit untuk membayangkan bahwa dev akan bersedia untuk melaksanakan two-factor auth tapi tidak SSL. (Tidak) Roll-anda-sendiri JavaScript enkripsi/hashing Mengingat dirasakan (meskipun sekarang [dihindari][27]) biaya dan kesulitan teknis mendirikan sebuah sertifikat SSL di situs web anda, beberapa pengembang tergoda untuk menggulung mereka sendiri di-browser hashing atau skema enkripsi dalam rangka untuk menghindari melewati cleartext login lebih dari satu tanpa jaminan kawat. Saat ini adalah yang mulia berpikir, itu pada dasarnya tidak berguna (dan bisa menjadi [keamanan][3]), kecuali jika hal ini dikombinasikan dengan salah satu kode di atas - bahwa, baik mengamankan garis dengan enkripsi yang kuat atau menggunakan mencoba-dan-diuji tantangan-respon mekanisme (jika anda don't tahu apa itu, hanya tahu bahwa itu adalah salah satu yang paling sulit untuk membuktikan, paling sulit untuk desain, dan paling sulit untuk menerapkan konsep-konsep dalam keamanan digital). Sementara memang benar bahwa hashing password dapat efektif terhadap password pengungkapan, itu adalah rentan terhadap serangan replay, Man-In-The-Middle serangan / pembajakan (jika penyerang dapat menyuntikkan beberapa byte ke anda tanpa jaminan halaman HTML sebelum mencapai browser anda, mereka hanya dapat komentar hashing dalam JavaScript), atau serangan brute force (karena anda menyerahkan penyerang kedua username, garam dan hash password). CAPTCHA terhadap kemanusiaan [CAPTCHA][4] dimaksudkan untuk menggagalkan salah satu kategori tertentu dari serangan: otomatis kamus/brute force trial-and-error tanpa operator manusia. Tidak ada keraguan bahwa ini adalah ancaman nyata, namun, ada cara untuk mengatasinya mulus bahwa don't memerlukan CAPTCHA, secara khusus dirancang dengan baik server-side login throttling skema - kita'll membahas mereka nanti. Tahu bahwa CAPTCHA implementasi tidak diciptakan sama; mereka sering aren't-manusia dipecahkan, sebagian besar dari mereka yang benar-benar efektif melawan bots, semua dari mereka adalah tidak efektif terhadap ketiga murah-dunia kerja (menurut [OWASP][5], saat ini sweatshop tukar adalah $12 per 500 tes), dan beberapa implementasi mungkin secara teknis ilegal di beberapa negara (lihat [OWASP Otentikasi Contekan][6]). Jika anda harus menggunakan CAPTCHA, gunakan Google's [reCAPTCHA][7], karena itu adalah OCR-keras dengan definisi (karena sudah menggunakan OCR-kesalahan klasifikasi buku scan) dan berusaha terlalu keras untuk menjadi user-friendly. Secara pribadi, saya cenderung untuk menemukan CAPTCHA mengganggu, dan menggunakannya hanya sebagai pilihan terakhir ketika pengguna telah gagal untuk log in beberapa kali dan throttling penundaan maxed out. Ini akan terjadi cukup jarang untuk dapat diterima, dan memperkuat sistem secara keseluruhan. Menyimpan Password / Verifikasi login Ini mungkin akhirnya menjadi pengetahuan umum setelah semua yang sangat-dipublikasikan hacks dan pengguna kebocoran data kami've terlihat dalam beberapa tahun terakhir, tapi itu harus dikatakan: Jangan menyimpan password di cleartext dalam database anda. Pengguna basis data secara rutin hacked, bocor atau diperoleh melalui SQL injection, dan jika anda menyimpan baku, plaintext password, yang instan permainan atas untuk anda login keamanan. Jadi jika anda bisa't toko sandi, bagaimana anda memeriksa bahwa login+password kombinasi yang Dikirim dari form login yang benar? Jawabannya adalah hashing menggunakan [key derivasi fungsi][24]. Setiap kali user baru dibuat atau password berubah, anda mengambil kata sandi dan menjalankannya melalui KDF, seperti Argon2, bcrypt, scrypt atau PBKDF2, mengubah cleartext password ("correcthorsebatterystaple") menjadi panjang, acak-mencari string, yang jauh lebih aman untuk menyimpan dalam database anda. Untuk memverifikasi login, anda menjalankan fungsi hash yang sama pada password yang dimasukkan, kali ini lewat di garam dan membandingkan hash yang dihasilkan string untuk nilai yang disimpan dalam database anda. Argon2, bcrypt dan scrypt menyimpan garam dengan hash sudah. Check out ini [artikel][23] pada sec.stackexchange untuk informasi lebih rinci. Alasan yang digunakan adalah bahwa hashing sendiri adalah tidak cukup-anda'll ingin menambahkan disebut 'garam' untuk melindungi hash terhadap [rainbow tabel][8]. Garam efektif mencegah dua password yang sama persis dari yang disimpan sebagai nilai hash yang sama, mencegah seluruh database yang di-scan dalam satu run jika penyerang mengeksekusi menebak password serangan. Kriptografi hash tidak boleh digunakan untuk penyimpanan password karena dipilih pengguna password tidak cukup kuat (yaitu biasanya tidak mengandung cukup entropi) dan password menebak serangan bisa diselesaikan dalam waktu yang relatif singkat dengan seorang penyerang dengan akses ke hash. Ini adalah mengapa KDFs yang digunakan - ini efektif ["meregangkan kunci"][25], yang berarti bahwa setiap menebak sandi penyerang membuat menyebabkan beberapa pengulangan dari algoritma hash, misalnya 10.000 kali, yang menyebabkan penyerang untuk menebak password 10.000 kali lebih lambat. Sesi data - "Anda login sebagai Spiderman69" Setelah server sudah terverifikasi login dan password terhadap user database dan menemukan kecocokan, sistem tersebut membutuhkan cara untuk mengingat bahwa browser telah dikonfirmasi. Fakta ini seharusnya hanya disimpan di sisi server di data sesi.
Artikel Definitif
Mengirim kredensial
Satu-satunya cara praktis untuk mengirim kredensial 100% aman adalah dengan menggunakan SSL. Menggunakan JavaScript untuk hash password tidak aman. Perangkap umum untuk klien-sisi hashing password:
Menyimpan password
Don't pernah menyimpan password sebagai plaintext dalam database. Bahkan jika anda don't peduli tentang keamanan dari situs anda sendiri. Asumsikan bahwa beberapa dari anda pengguna akan menggunakan kembali password dari akun bank online. Jadi, menyimpan hash password, dan membuang asli. Dan pastikan password doesn't muncul di log akses atau aplikasi log. OWASP menganjurkan penggunaan Argon2 sebagai pilihan pertama untuk aplikasi baru. Jika ini tidak tersedia, PBKDF2 atau scrypt harus digunakan sebagai gantinya. Dan akhirnya jika di atas tidak tersedia, gunakan bcrypt. Hash sendiri juga tidak aman. Misalnya, identik password berarti identik hash--ini membuat hash tabel lookup cara yang efektif retak banyak password sama sekali. Sebaliknya, menyimpan asin hash. Garam adalah string yang ditambahkan ke password sebelum hashing - penggunaan yang berbeda (random) garam per pengguna. Garam adalah semua nilai, sehingga anda dapat menyimpannya dengan hash dalam database. Lihat di sini untuk lebih lanjut tentang ini. Ini berarti bahwa anda dapat't mengirim pengguna yang lupa password (karena anda hanya memiliki hash). Don't reset user's password kecuali jika anda memiliki authenticated user (pengguna harus membuktikan bahwa mereka mampu untuk membaca email yang dikirim untuk disimpan (dan divalidasi) alamat email.)
Pertanyaan keamanan
Pertanyaan keamanan yang tidak aman - menghindari menggunakan mereka. Mengapa? Apa pun pertanyaan keamanan tidak, password tidak baik. Baca BAGIAN III: Menggunakan Pertanyaan Rahasia di @Jens Roland jawaban di sini di wiki ini.
Sesi cookie
Setelah pengguna log in, server akan mengirimkan pengguna sesi cookie. Server dapat mengambil username atau id dari cookie, tapi tak ada lagi yang bisa menghasilkan seperti cookie (TODO menjelaskan mekanisme). Cookies dapat dibajak: mereka hanya sebagai aman sebagai sisa dari klien's mesin dan komunikasi lainnya. Mereka dapat dibaca dari disk, mendengus lalu lintas jaringan, diangkat oleh cross-site scripting serangan, terkena phising dari diracuni DNS sehingga klien mengirimkan cookie mereka ke salah server. Don't mengirimkan cookie. Cookie harus berakhir di akhir sesi klien (browser dekat atau meninggalkan domain anda). Jika anda ingin autologin pengguna anda, anda dapat mengatur cookie persisten, tetapi harus berbeda dari penuh-sesi cookie. Anda dapat mengatur bendera tambahan bahwa pengguna memiliki auto-login, dan kebutuhan untuk log-in real untuk operasi sensitif. Ini adalah populer dengan situs belanja yang ingin untuk menyediakan anda dengan mulus, personalisasi pengalaman belanja tapi masih melindungi rincian keuangan anda. Misalnya, ketika anda kembali untuk mengunjungi Amazon, mereka menunjukkan sebuah halaman yang terlihat seperti anda're login, tapi ketika anda pergi ke tempat order (atau perubahan alamat pengiriman anda, kartu kredit dll.), mereka meminta anda untuk mengkonfirmasi password anda. Situs keuangan seperti bank dan kartu kredit, di sisi lain, hanya memiliki data sensitif dan tidak harus memungkinkan auto-login atau rendah-modus keamanan.
Daftar dari sumber daya eksternal
Pertama, yang kuat peringatan bahwa jawaban ini tidak cocok untuk ini pertanyaan yang tepat. Itu pasti tidak boleh atas jawabannya!
Aku akan pergi ke depan dan menyebutkan Mozilla diusulkan BrowserID (atau mungkin lebih tepatnya, Verified Protokol Email) dalam semangat mencari jalur upgrade untuk pendekatan yang lebih baik untuk otentikasi di masa depan.
Saya akan meringkas cara ini:
@
domain" adalah ringkas dan didukung oleh berbagai protokol dan skema URI. Seperti sebuah identifier adalah, tentu saja, yang paling diakui secara universal sebagai alamat email.Ini tidak benar-benar "bentuk otentikasi berbasis website". Tapi itu adalah sebuah upaya untuk transisi dari norma saat ini otentikasi berbasis bentuk untuk sesuatu yang lebih aman: browser yang didukung otentikasi.
Saya hanya berpikir saya'd share ini solusi yang saya temukan untuk menjadi baik-baik saja.
Saya menyebutnya Dummy Lapangan (meskipun saya belum't menciptakan ini jadi don't kredit saya).
Singkatnya: anda hanya perlu memasukkan ini ke dalam
<form>
dan memeriksa untuk itu harus kosong pada saat memvalidasi:Trik untuk menipu bot ke dalam pemikiran itu harus menyisipkan data ke dalam bidang yang diperlukan, yang's mengapa saya bernama input "email". Jika anda sudah memiliki bidang yang disebut email yang anda're menggunakan anda harus mencoba penamaan dummy bidang sesuatu yang lain seperti "perusahaan", "telepon" atau "emailaddress". Hanya memilih sesuatu yang anda tahu anda don't perlu dan apa yang terdengar seperti sesuatu yang orang-orang biasanya akan menemukan logis untuk mengisi ke dalam bentuk web. Sekarang menyembunyikan
input
lapangan dengan menggunakan CSS atau JavaScript/jQuery - apa saja yang cocok untuk anda - hanya don't mengatur inputtype
ketersembunyi
atau pun bot won't jatuh untuk itu.Ketika anda memvalidasi bentuk (baik client atau server side) periksa apakah anda dummy bidang telah diisi untuk mengetahui apakah itu dikirim oleh seorang manusia atau bot.
Contoh:
Dalam kasus manusia: Pengguna tidak akan melihat dummy lapangan (dalam kasus saya yang bernama "email") dan tidak akan berusaha untuk mengisinya. Jadi nilai dummy lapangan masih harus kosong ketika formulir yang telah dikirim.
Dalam kasus bot: bot akan melihat lapangan yang jenis
teks
dan namaemail
(atau apapun itu anda menyebutnya) dan logis akan berusaha untuk mengisinya dengan data yang sesuai. Itu doesn't peduli jika anda ditata form input dengan CSS mewah, web-developer melakukannya sepanjang waktu. Apapun nilai yang di dummy bidang ini, kami don't peduli selama itu's lebih besar dari0
karakter.Saya menggunakan metode ini pada buku tamu di kombinasi dengan CAPTCHA, dan saya belum't melihat satu spam post sejak. Saya telah menggunakan CAPTCHA-satunya solusi sebelumnya, tapi pada akhirnya, itu mengakibatkan sekitar lima spam posting setiap jam. Menambahkan dummy lapangan dalam bentuk telah berhenti (setidaknya sampai sekarang) semua spam yang muncul.
Saya percaya hal ini juga dapat digunakan baik-baik saja dengan login/autentikasi formulir.
Peringatan: Tentu saja metode ini tidak 100% sangat mudah. Bot dapat diprogram untuk mengabaikan field input dengan gaya
display:none
diterapkan untuk itu. Anda juga harus berpikir tentang orang-orang yang menggunakan beberapa bentuk auto-completion (seperti kebanyakan browser memiliki built-in!) untuk auto-mengisi semua kolom formulir untuk mereka. Mereka mungkin saja juga mengambil boneka lapangan.Anda juga dapat bervariasi sedikit dengan meninggalkan dummy lapangan terlihat tetapi di luar batas-batas layar, tapi ini benar-benar terserah pada anda.
Jadilah kreatif!
Saya tidak berpikir jawaban di atas adalah "salah" tapi ada daerah besar otentikasi yang tidak menyentuh (atau lebih tepatnya penekanannya adalah pada "bagaimana menerapkan cookie sesi", bukan pada "apa pilihan yang tersedia dan apa trade-off".
Saya menyarankan suntingan/jawaban
Hal ini untuk menghindari kebutuhan untuk memiliki "sesi" atau cookies seperti browser itu sendiri akan kembali mengenkripsi komunikasi setiap waktu. Ini adalah yang paling "ringan" pendekatan pengembangan.
Namun, saya tidak merekomendasikan hal ini, kecuali untuk umum, rendah-nilai pelayanan. Ini adalah masalah dengan beberapa jawaban di atas tidak mencoba kembali melaksanakan server-side mekanisme otentikasi - masalah ini telah diselesaikan dan didukung oleh browser yang paling utama. Tidak menggunakan cookies. Jangan simpan apa-apa di tangan anda sendiri-rolled database. Hanya bertanya, per permintaan, jika permintaan dikonfirmasi. Segala sesuatu yang lain harus didukung oleh konfigurasi dan pihak ketiga terpercaya perangkat lunak.
Jadi ...
Pertama, kami membingungkan awal pembuatan akun (dengan password) dengan pengecekan ulang kata sandi selanjutnya. Jika saya Flickr dan membuat situs anda untuk pertama kalinya, baru pengguna memiliki akses ke nilai nol (kosong ruang web). Aku benar-benar tidak peduli jika seseorang membuat akun berbohong tentang nama mereka. Jika saya membuat akun di rumah sakit intranet/extranet, nilai terletak pada semua catatan medis, dan jadi saya melakukan hati tentang identitas (*) account creator.
Ini adalah sangat sangat sulit. Hanya solusi yang layak adalah web of trust. Misalnya, anda bergabung dengan rumah sakit sebagai dokter. Anda membuat sebuah halaman web yang di-host di suatu tempat dengan foto anda, nomor paspor, dan kunci publik, dan hash mereka semua dengan kunci pribadi. Anda kemudian mengunjungi rumah sakit dan sistem administrator terlihat di paspor anda, jika melihat foto yang cocok dengan anda, dan kemudian hash halaman web/foto hash dengan rumah sakit swasta kunci. Mulai sekarang kita dapat dengan aman pertukaran kunci dan token. Sebagai orang yang percaya rumah sakit (ada saus rahasia BTW). Administrator sistem juga dapat memberikan anda sebuah RSA dongle atau lainnya otentikasi dua faktor.
Tapi ini adalah banyak kerumitan, dan web 2.0. Namun, itu adalah satu-satunya cara aman untuk membuat akun baru yang memiliki akses ke informasi yang berharga yang tidak diciptakan sendiri.
Kerberos dan SPNEGO - single sign-on mekanisme dengan pihak ketiga yang terpercaya - pada dasarnya pengguna memverifikasi terhadap pihak ketiga yang terpercaya. (NB ini tidak dengan cara apapun tidak dapat dipercaya OAuth)
SRP - semacam pintar otentikasi password tanpa pihak ketiga yang terpercaya. Tapi di sini kita masuk ke alam "it's lebih aman untuk menggunakan otentikasi dua faktor, bahkan jika itu's lebih mahal"
SSL sisi klien - berikan klien sertifikat kunci publik (support di semua browser utama - tetapi menimbulkan pertanyaan di atas mesin klien keamanan).
Pada akhirnya, itu's tradeoff - berapa biaya pelanggaran keamanan dibandingkan dengan biaya pelaksanaan yang lebih aman pendekatan. Satu hari, kita dapat melihat yang tepat PKI diterima secara luas dan tidak lagi sendiri digulung otentikasi bentuk dan database. Satu hari...
Sebuah artikel yang baik tentang realistis kekuatan password estimasi adalah:
Dropbox Blog Teknologi » Blog Archive » zxcvbn: realistis kekuatan password estimasi
Ketika hashing, don't cepat menggunakan algoritma hash seperti MD5 (banyak perangkat keras implementasi ada). Menggunakan sesuatu seperti SHA-512. Untuk password, lebih lambat hash yang baik.
Semakin cepat anda dapat membuat hash, lebih cepat setiap brute force checker dapat bekerja. Lambat hash karena itu akan memperlambat brute forcing. Lambat algoritma hash akan membuat brute memaksa praktis untuk lagi kata sandi (8 digit)
Favorit saya aturan dalam hal sistem otentikasi: gunakan kata sandi, tidak password. Mudah diingat, sulit untuk retak. Info lebih lanjut: Coding Horror: Password vs. Lulus Frase
I'd ingin menambahkan satu saran saya've yang digunakan, berdasarkan pada pertahanan secara mendalam. Anda don't perlu memiliki yang sama auth&auth sistem untuk admin sebagai pengguna biasa. Anda dapat memiliki yang terpisah form login pada url yang terpisah mengeksekusi kode terpisah untuk permintaan yang akan memberikan hak tinggi. Yang satu ini dapat membuat pilihan-pilihan yang akan menjadi total sakit untuk pengguna biasa. Salah satunya seperti yang saya've digunakan adalah untuk benar-benar berebut login URL untuk akses admin dan email admin URL baru. Berhenti setiap serangan brute force segera sebagai URL baru anda dapat sewenang-wenang sulit (sangat panjang string acak) tapi admin anda pengguna's-satunya ketidaknyamanan yang mengikuti link yang ada di email mereka. Penyerang tidak lagi tahu di mana untuk bahkan POSTING ke.
Saya tidak't tahu apakah itu yang terbaik untuk menjawab ini sebagai jawaban atau komentar. Saya memilih opsi pertama.
Mengenai poing BAGIAN IV: Lupa Password Fungsi dalam jawaban pertama, saya akan membuat titik tentang Waktu Serangan.
Di Ingat password anda bentuk, penyerang mungkin dapat memeriksa daftar lengkap email dan mendeteksi yang terdaftar di sistem anda (lihat link di bawah).
Mengenai Lupa Password Form, saya akan menambahkan bahwa itu adalah ide yang baik untuk sama kali antara sukses dan unsucessful kueri dengan beberapa fungsi delay.
https://crypto.stanford.edu/~dabo/makalah/webtiming.pdf
Saya ingin menambahkan satu hal yang sangat penting komentar: -
Banyak perusahaan menggunakan "penggunaan internal hanya" situs-situs yang, efektif, "aplikasi perusahaan" yang terjadi telah dilaksanakan melalui Url. Url ini dapat (seharusnya ...) hanya diselesaikan dalam "perusahaan's jaringan internal." (jaringan Yang ajaib mencakup semua VPN terhubung 'road warriors.')
Ketika pengguna patuh terhubung tersebut di atas jaringan, identitas mereka ("otentikasi") lebih [sudah ...] "secara meyakinkan dikenal," seperti yang mereka izin ("otorisasi") untuk melakukan hal-hal tertentu ... seperti ... "untuk mengakses website ini."
Ini "otentikasi + otorisasi" layanan dapat disediakan oleh beberapa teknologi yang berbeda, seperti LDAP (Microsoft OpenDirectory), atau Kerberos.
Dari point-of-view, anda hanya tahu satu hal: orang yang sah angin-up di situs web anda harus dapat disertai dengan [lingkungan-variabel ajaib yang mengandung ...] "token." (yaitu adanya tanda seperti itu harus segera alasan untuk
404 Not Found
.)Token's nilai tidak masuk akal untuk anda, tapi, harus perlu timbul, "sesuai berarti ada" di mana situs web anda dapat "[otoritatif] meminta seseorang yang tahu (LDAP... dll.)" tentang dan setiap(!) pertanyaan yang mungkin anda miliki. Dengan kata lain, anda melakukan tidak memanfaatkan diri dari ada "rumah-tumbuh logika." sebagai Gantinya, anda menanyakan Kewenangan dan secara implisit percaya putusannya.
Eh eh ... itu's cukup mental-beralih dari "liar-dan-berbulu Internet."
Gunakan OpenID Connect atau User Berhasil Mengakses.
Karena tidak ada yang lebih efisien daripada tidak melakukannya sama sekali.