Doğru-Yanlış Kendi Yaptığım İlk Signup.Php
-
merhaba arkadaşlar geçende Webmatrix kurmaya çalışıp kuramamıştım sonrasında webmatrix'ten vazgeçip çok güzel kral sade temiz XAMPP i öğrendim müritlerimizden ve onu kurdum.
kendi kendime denemelerimi yapabiliyorum artık.
php konusunda anlayamadığım yerler var özellikle error handling ve exception konusu
derslerini aldığım yerde bunları çok detaylı anlatmadılar(ya da ben anlamadım) (w3schools)
her neyse buna rağmen ben kendi kendime yapmaya çalıştığım bir deneme sistem var
sınıf listesi, notları görme, not girme vesaire gibi şeyler ile kayıt ol, oturum aç.
kayıt ol kısmını yaptım aklımda bazı sorular oluştu ama bu soruları sorarken yaptığımı da göstereyim dedim bir video çektim
video:
özetle: signup.html ile form oluşturdum post metodu ile signup.php'ye koydum onun da bu bilgileri database e koymasını ve bizi bir yere yönlendirmesini istedim.
sorumsa: bu signup.php'de $_POST["kul_adi"] şeklinde çekiyorum veriyi fakat böyle yazınca nereden post gelse veriyi çekiyor o isimde. yani bi adam istese herhangi bir yerden database e istediğini koyabilir. bunu engellemek için ne yapacağımı bilemediğimden kendimce koca bir if açtım ve if(istediğim yer) ise kodları çalıştır değilse çalıştırma gibi bir şey yaptım. doğru bir yöntem midir nasıldır bilemedim ama bir sorayım dedim.
gereksiz bir soru sorduysam affola. esasen kendi çözümüm de hoşuma gitti onu da göstermek istedim :)
signup.php kodlarım şöyle:
<?php if($_SERVER['HTTP_REFERER']=="http://localhost:90/mysql%20-%20php%20deneme/signup.html"){ $host = "127.0.0.1"; $username = "co"; $password = "123456"; $dbname = "ilkdeneme"; $table = "uyeler"; if($_SERVER["REQUEST_METHOD"] == "POST"){ $kul_adi = $_POST["kul_adi"]; $pass = $_POST["pass"]; try{ // burada connection kuruluyor $conn = new PDO("mysql:host=$host;dbname=$dbname", $username, $password); // burada exeption kodları var ne olduğunu bilmiyorum $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // sql sorgumu yazıyorum $sql = "Insert Into $table () VALUES('', '$kul_adi', '$pass')"; $conn->exec($sql); // olay bittiğinde olacağı yazıyorum header("Location: afarim.html"); die(); } // burada exeption catch kodları var yine ne olduğunu tam bilmiyorum catch(PDOException $e) { echo $sql . "<br>" . $e->getMessage(); } // burada connection'ı kaldırdık $conn = null; } } else { print "hek mi yapcan la?"; } ?>bu arada tagler(forumdaki) kod içeriğini biraz bozmuş. şeyhimize geribildirim olsun buradan :)
kofcu tarafından 27/Tem/15 00:48 tarihinde düzenlenmiştir -
Hocam kayıt formunda şifre "pass" hanesine şunu yazarsak muhtemelen script sıçar.
'); DROP TABLE uyeler; --PDO bind param ile prapared statement'ları kullanmalısın hocam.XSS içinde htmlspecialchars vardı sanırım onu kullanabilirsin.Fazla bakamadım kodlara, başka arkadaşlar yardımcı olur eksik söylediğim yerlerde. İyi akşamlar -
hehhheh :) evet doğru diyorsun. haberim var aslında bu tarz şeylerden kursta söylemişlerdi. aklımdaydı ama soruyu sormak için yazdım bu sayfayı ondan hiçbir şeye dikkat etmedim.
doğru onları kullansam iyiydi sonuçta sorumu anlatmak için deneme de yazmış olsam düzgün bir script yazmam bende düzgün bir alışkanlık oluşturacaktır.
onun dışında PDO bindparam'ı bilmiyorum. esasen PDO hakkında hiçbir şey bilmiyorum. sanırım en önemli kısımlardan biri ama w3schools çok yüzeysel geçmiş.
php.net deki dökümantasyonu okusam mı diye düşündüm aslında sağlam öğrenmek için ama yaz bitince zaten artık bakamayacağım için o kadar zamanım yok.
o yüzden deneme-yanılma, ihtiyaç-sonuç, beyin fırtınası gibi ilerlemye karar verdim biraz buradaki mürit kardeşlerimin başını ağrıtmış olacağım belki istemeyerek onun için kusura bakmayın.
ama her şeyi de direk sormuyorum önce bir araştırma yapıyorum tabi o kadar da değil, tembellik olmuş olur..
-
Hocam o zaman
XSS nedir, neden oluşur? Nasıl önlem alınır bir araştır.
SQL İnjection nedir nasıl önlem alınır onuda araştır hocam.
Şimdilik bunları öğrensen yeter. İleride LFI, CSRF felan araştırsan yeter.
Kolay gelsin.
Bu arada bana kalırsa onlarca zamandır php kullanmış biri olarak kurumsal amaçlı kullanacaksan PHP'yi öğrenmeni tavsiye etmem. Özellikle takım çalışmasında.
Tek sebebim kod okunabilirliği ve spagetti kod hocam. Standartları o kadar esnek ki herkes kafasına göre yazabilir. Yoksa hız konusunda felan (kasımdaki PHP 7 ile derlenebilir olacak) çoğu web tabanlı dile on basabilir.
ASP.NET MVC
ya da
JAVA JSP JSF felan öğren hocam.
Ama hobi amaçlı ve tek kişilik çalışacaksan kesinlikle PHP ye devam et derim.
DrKill tarafından 26/Tem/15 21:58 tarihinde düzenlenmiştir -
tam emin olmamakla birlikte ve güvenmemen gerektiğini düşünerekten
<?php if($_SERVER['HTTP_REFERER']=="http://localhost:90/mysql%20-%20php%20deneme/signup.html"){ $host = "127.0.0.1"; $username = "co"; $password = "123456"; $dbname = "ilkdeneme"; $table = "uyeler"; if(($_SERVER["REQUEST_METHOD"] == "POST") && ($_SERVER['HTTP_REFERER']== "http://www.busayfadan.com/gelenpostlarıkabulet.php")){ $kul_adi = $_POST["kul_adi"]; $pass = $_POST["pass"]; try{ // burada connection kuruluyor $conn = new PDO("mysql:host=$host;dbname=$dbname", $username, $password); // burada exeption kodları var ne olduğunu bilmiyorum $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // sql sorgumu yazıyorum $sql = "Insert Into $table () VALUES('', '$kul_adi', '$pass')"; $conn->exec($sql); // olay bittiğinde olacağı yazıyorum header("Location: afarim.html"); die(); } // burada exeption catch kodları var yine ne olduğunu tam bilmiyorum catch(PDOException $e) { echo $sql . " " . $e->getMessage(); } // burada connection'ı kaldırdık $conn = null; } } else { print "hek mi yapcan la?"; } ?>
wert tarafından 27/Tem/15 00:22 tarihinde düzenlenmiştir -
HTTP_REFFERER'a güvenme CURL ile istediğimi yazdırırım.
PHP XSRF Protection diye arat güvenlikle alakalı bilgi bulursun.
Böyle basitten başlayarak uygulamalar yaparak geliştirirsin zaten kendini devam et. :)
-
Postla alma filter_inputla al.
-
------------------------------------------------------------
DrKill
------------------------------------------------------------
***PDO bind param ile prapared statement'ları kullanmalısın hocam.
-öğrenmiştim ama önemini yeni kavradım hocam SQL injection için uygunmuş sanırım
Prepared statements basically work like:
1.prepare
2.optimize
3.execute
have two main advantages:
1.reduces parsing time
2.minimize bandwidth to the server(çünkü sorguyu 1 kere çekiyor sonra sadece parametre çekiyor)
3.very useful against SQL injections
Yapılışı: connection'ı kurduktan sonra
1.$stmt = $conn->prepare("INSERT INTO $table() VALUES ('', :kul_adi, :pass)");
2.$stmt->bindparam(':kul_adi', $kul_adi);$stmt->bindparam(':pass', $pass);
3.$stmt->execute();
***XSS içinde htmlspecialchars vardı sanırım onu kullanabilirsin.
-bunun için de postu böyle aldım
$kul_adi = htmlspecialchars($_POST["kul_adi"]);
$pass = htmlspecialchars($_POST["pass"]);
***Fazla bakamadım kodlara, başka arkadaşlar yardımcı olur eksik söylediğim yerlerde. İyi akşamlar
teşekkür ederim iyi günler :)
***XSS nedir, neden oluşur? Nasıl önlem alınır bir araştır.
-cross side scripting için girişleri kontrol ettim $_SERVER["php_SELF"] gibi global variablellara htmlspecialchars uyguladım
***SQL İnjection nedir nasıl önlem alınır onuda araştır hocam.
-prepared statements kullandım bunun için
***Şimdilik bunları öğrensen yeter. İleride LFI, CSRF felan araştırsan yeter.
-LFI: Local File Input bi de RFI: Remote File Input varmış ama bu artık popüler değilmiş. Bu tür açıklar, Scriptte sayfa include edilirken, include edilecek sayfanın, kullanıcının müdahale edebildiği veriler üzerinden tanımlanmasından kaynaklanırmış. cross site scripting e benzettim.
CSRF: Cross Site Request Forgery. seasurf diyorlarmış bir de neden anlamadım ama bu benim ilk sorduğum soru ve çözümüm şimdi öğrendiğim kadarıyla buna örnekmiş :)
korunmak için 4 şey söylemişler
1. http-refferer kullanın. benim bilmeden yaptığım ama pSkpt müridin güvenilir olmadığını söylediği
2. geti uygunsuz yerlerde kullanma(eh düşünülmesi gereken bir şey zaten)
3. post kullan
4. hidden değer gönder gibi bir şey demiş şöyle de bir kod vermiş ama anlamadım
<form ...>
<input type="hidden" name="csrf value"value="8dcb5e56904d9b7d4bbf333afdd154ca">
***Bu arada bana kalırsa onlarca zamandır php kullanmış biri olarak kurumsal amaçlı kullanacaksan PHP'yi öğrenmeni tavsiye etmem. Özellikle takım çalışmasında.
Tek sebebim kod okunabilirliği ve spagetti kod hocam. Standartları o kadar esnek ki herkes kafasına göre yazabilir. Yoksa hız konusunda felan (kasımdaki PHP 7 ile derlenebilir olacak) çoğu web tabanlı dile on basabilir.
ASP.NET MVC
ya da
JAVA JSP JSF felan öğren hocam.
Ama hobi amaçlı ve tek kişilik çalışacaksan kesinlikle PHP ye devam et derim.
-hobi sayılır hocam malesef. kendi kendime 2 yazdır web programlama öğrenmeye çalışıyorum. HTML, CSS, Javascript, SQL, PHP şeklinde gittim. Çok sağlam profesyonel bir şekilde öğrendim sayılmaz zaten sorular soruyorum görüyorsun, ama işte öyle en azından adım atabilecek kadar kafa yorabilecek kadar öğrendim. eksiklerimi de pratik yapa yapa tamamlarım diye düşünüyorum.
------------------------------------------------------------
wert
------------------------------------------------------------
-17. satırındaki ($_SERVER['HTTP_REFERER']== "http://www.busayfadan.com/gelenpostlarıkabulet.php")){ kısmını anlamadım hocam
------------------------------------------------------------
pSkpt
------------------------------------------------------------
***HTTP_REFFERER'a güvenme CURL ile istediğimi yazdırırım.
-CURL ü de duydum ama şimdilik bana biraz uzak bir alan. referer a güvenmeyeceksem ne yapmalıyım bilemedim. ama bunu dediğin için http refferer'ı da htmlspecialchars()dan geçirdim. napsam acaba tüm sayfayı baştan aşağı bir htmlspecialcharstan mı geçirsem güvenli olsun diye? :)
PHP XSRF Protection diye arat güvenlikle alakalı bilgi bulursun.
arattım. buldum. aynı şeyden bahseden diğer müride cevap olarak yazdım.
Böyle basitten başlayarak uygulamalar yaparak geliştirirsin zaten kendini devam et. :)
teşekkür ederim bu yolda devam ediyorum bir süre daha :)
------------------------------------------------------------
kvasir
------------------------------------------------------------
***Postla alma filter_inputla al.
-onu beceremedim syntax hatası alıyorum nereyi yanlış yaptım bilemedim. o yüzden yine postla aldım ama htmlspecialchars() dan geçirdim. syntax hatası aldığım halini koddan silmedim bir kontol edebilir misin?
------------------------------------------------------------
-> ve => ve :: ne ayak? derslerde kullanıldı ama hiç demediler bu demek falan diye
notepad++ adam! adam! elektrik gitti sabah ama yazdıklarımı kurtardı
validate data kısmını hem MySQL'den hem php'den hem de html üzerinde javascript ile yapmayı planlıyorum? nasıl olur?
die(); anlamı ve kullanım alanları nedir? dışardan görüp almıştım orada yazdığı için koduma ekledim
cookie kopyalasam şifreler de gelir mi? yani birinin cookie dosyalarını kopyalasam kendi cookielerime yapıştırsam sonra gelsem mesela facebook a girsem onun oturumu açılır mı?
html purifier en iyisi diyorlar validate and sanitize için?
<?php /*function shield($data) { $data = trim($data); $data = stripslashes($data); $data = htmlspecialchars($data); return $data;*/ //bu fonksiyonu(ya da benzerini)bu sayfada hiç kullanmadım ama kullansam mı diye düşündüm if(htmlspecialchars($_SERVER['HTTP_REFERER'])=="http://localhost:90/mysql%20-%20php%20deneme/signup.html"){ $host = "127.0.0.1"; $username = "co"; $password = "123456"; $dbname = "ilkdeneme"; $table = "uyeler"; if($_SERVER["REQUEST_METHOD"] == "POST"){ $kul_adi = htmlspecialchars($_POST["kul_adi"]); $pass = htmlspecialchars($_POST["pass"]); /* filter input syntax error alıyorum yardım. $kul_adi = filter_input(INPUT_POST, 'kul_adi', FILTER_SANITIZE_SPECIAL_CHARS]; $pass = filter_input(INPUT_POST, 'pass', FILTER_SANITIZE_SPECIAL_CHARS]; üsttekileri iptal edip çalıştırdım olmadı üsttekileri de aktif ettim olmadı üsttekileri aktif edip farklı isim verdim filter input a da o isimle koydum olmadı*/ try{ // burada connection kuruluyor $conn = new PDO("mysql:host=$host;dbname=$dbname", $username, $password); // burada exeption kodları var hala ne olduğunu tam bilmiyorum $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); /*artık sql sorgumu yazmıyorum prepared statement a geçtim ^^ // sql sorgumu yazıyorum $sql = "Insert Into $table () VALUES('', '$kul_adi', '$pass')"; $conn->exec($sql); */ //ps1 prepare prepared statements $stmt = $conn->prepare("INSERT INTO $table() VALUES ('', :kul_adi, :pass)"); //ps2 bind parameters $stmt->bindparam(':kul_adi', $kul_adi); $stmt->bindparam(':pass', $pass); //ps3 $stmt->execute(); // olay bittiğinde olacağı yazıyorum header("Location: afarim.html"); die(); } // burada exeption catch kodları var yine ne olduğunu tam bilmiyorum catch(PDOException $e) { echo /*$stmt . */"<br>" . $e->getMessage(); } // burada connection'ı kaldırdık $conn = null; } } else { print "hek mi yapcan la?"; } ?>
kofcu tarafından 28/Tem/15 14:14 tarihinde düzenlenmiştir -
LAAAAAAN :D parantez kapatmayı unutmuşum filter_input'ta syntax hatası almamın nedenini şimdi attığım cevabı okurken fark ettim :D
neyse yine de sormuş olayım htmlspecialchars() or filter_input?
şimdi de gördüm ki parantez kapatmayı unutmamışım düz parantez yerine köşeli parantez ile kapatmışım şift yerine alta basmışım yani :S :)
kofcu tarafından 28/Tem/15 14:21 tarihinde düzenlenmiştir
