Derhal bu (php, okul) arkasında nokta görmüyorum

6 Cevap php

Ben 2 yıl BİT öğrencisiyim. Bu yıl daha önce PHP yapmadım ve bizim eğitmen bize temellerini verdi ve dönem sonunda, bize onun tabii ve veritabanları dersinde öğrendiklerini birleştirecek bir proje verdi. Biz windows klasik AMP ayarlarını kullanmak için vardı.

Şimdi, bizim eğitmen biz sınıfta önce küçük olanları yapılmış nasıl dayanan bir profil site yapmak için anlattı.

Ben veritabanına kullanıcı girme biraz garip yöntem arkasında nokta görmüyorum.

İlk olarak, (örneğin, buraya zip kodları daha hiçbir harf veya diğer semboller, asla 4 sayılardır) girilen verilerin güvenli ve biraz gerçekçi olduğundan emin olmak için bazı PHP formchecking yapmak.

Her şey güzel denetler, biz aşağıdakileri yapın:

$sql = new SqlObject(); //from SqlObject.class.php
$newUser = new User(login,passw,mail,...,...,...); //from User.class.php
$sql->addUser($newUser);

SQLObject sınıf biz eklemek ve genellikle veritabanındaki verileri değiştirmek, güncelleme ihtiyacınız olan tüm SQL komutları içeren bir sınıftır. Biz normal sayfalarında SQL yazmak asla. Ama hakkında kafam karıştı değil. Bu User.class.php dosya.

Bu dosya sadece bir yapıcı ve veritabanına girilmesi gerekiyor gibi alanlarda tam olarak aynı miktarda içerir. Örneğin:

<?php

  class User {
    // members
    var $id;
    var $name;
    var $password;

    // constructor
    function User($id=-1,$name='',$password='') {
        $this->id = $id;
        $this->name = $name;
        $this->password = $password;
    }
}

?>

İşte bu. SqlObject.class.php dosya ilk satırda User.class.php dosyası gerektirir.

addUser($user) SqlObject.class.php dosyasındaki işlev şöyle:

function addUser($user) {
  $insQuery = 'INSERT INTO users(name,password)';
  $insQuery.= " VALUES ('".$user->name."', '".$user->password."')";
  @mysql_query($insQuery) or showError("user insert failed");
}

Neden User.class.php dosyası üzerinden böyle bir yolu yapmak? Çeşit Güvenlik nedeni?

Ben tekrar edeyim: Bu PHP kullanarak benim ilk yıl ve ben hala bir öğrenciyim.

EDIT: İnsanlar SQL enjeksiyonu üzerinde hiçbir kontrolleri veri takmadan önce olduğu şikayet ediyorlar.

At the beginning of this post, I mentioned "formchecking". The register.php file does all the escaping and checking of input. This includes several Regex tests, mysql_real_escape_string() and some simpler tests. Once all tests are passed and all input is escaped, only then will this happen:

$sql = new SqlObject(); //from SqlObject.class.php
$newUser = new User(login,passw,mail,...,...,...); //from User.class.php
$sql->addUser($newUser);

Giriş Bazı insanlar SqlObject.class.php dosyası içinde vermek isteyen görmek tedavi almazsa bu kod asla çalıştırılmaz.

EDIT2: söz olarak, blog posted

6 Cevap

Peki, sen neden sadece doğrudan kullanıcı ve şifre geçemedi soruyorsun

 function addUser($name='',$password='') { etc

Benim tahminim göstermek kodu gelecekteki geçirmezlik örneği olduğunu, kullanıcı sınıfı gelecekte çok daha detaylı bir şey yapmak, daha doğrusu adı ve şifrenizi geçti yerine, başka bir kaynaktan kimlik olsun diye olma fikri onun kurucusuna.

Kod Süer veri toplayıp sorumlu eğer endişeleri ayrılığı bir fikir, bazı bit addUer işlevi sadece ihtiyacı malzeme kullanır. Büyük programlarda gerçekten örgütün bu tür olması için yardımcı olur - bu gibi size kafa tutmak için gereken parça sayısını sınırlamak sağlar düşünmeye başladığınızda yüzeyinde bu karmaşıklık ekleyerek görünebilir ama olabilir. Ayrıca böylece bir kişi kullanıcı sınıfı bakar genel programlama görevi kesiliyor hayal olabilir, başka adduser yapar. Onlar bağımsız olarak çalışabilir. Bu küçücük durumda, ama çok yararlı gerçek dünyada aptal.

Proje küçük olduğundan o kadar mantıklı olmayabilir. Ama şimdi başka bir yerde kullanmak için daha fazla işlevleri ekleyebilirsiniz hangi bir kullanıcı dersim var. Bir kullanıcı adı varsa bir fonksiyon kontrol etmek gibi, güncelleme, vb silin.

Eğer onun daha sağlam beri sonraki projede bu kodu yeniden böylece o da yapar. Eğer böyle bir tam kullanıcı yönetim sistemi olarak daha büyük bir şey yazmak gerekiyor sonraki projeye söylüyorlar. Daha sonra bu şeyleri bölmek ne kadar güzel olduğunu fark eder.

Her şeyden önce, adduser () yöntemi, korkunç o hazırlanmış deyimleri kullanmak değil çünkü SQL enjeksiyonu sağlar ne de içeriğini kaçar. Bu gibi bir şey okumak gerekir

function addUser($user) {
  $insQuery = 'INSERT INTO users(name,password)';
  $insQuery.= " VALUES ('".mysql_real_escape_string($user->name)."',";
  $insQuery.= " '".mysql_real_escape_string($user->password)."')";
  @mysql_query($insQuery) or showError("user insert failed");
}

Bu öğretmen günden itibaren SQL enjeksiyonu hakkında size öğretmek gerekir, size kötü uygulamalarını öğretir, ve sadece akademik uğruna onları basitleştirmek değil, çünkü bu korkunç.

Bu bir yana, fikir soyutlamalar kullanarak, gelecekte ispat kod etmektir.

Soyutlamalar daha yüksek düzeyde düşünmeye izin. Bu mevcut seviyesinde sadece bir depolama tesisi gibi davranır çünkü kullanıcı sınıfı, overkill görünebilir, ama böyle bir ihtiyaç doğacak yerine daha sonra değişiklikler yapmak yardımcı olacaktır SQL cümlelerin etki örneklerini vadede düşünmeye yardımcı olur.

Bu soyutlamalar da sonra, diyelim ki, printUser (ekleyerek, örneğin User sınıfını değiştirmek sadece gereken bir kullanıcı hakkında başka bir şey gerekiyordu varsa değişiklikler, örneğin, tüm yayılmış kalmadan kod komplike tek bir yer oluşturmak ) yöntemi ya da her neyse.

function printUser() {
    return "Mr. ".$this->name;
}

Ama bu kolay ve yapay akademik örnek olma, çok mantıklı olmayabilir. Gerçekten soyutlamalar yarar görmek için büyük bir senaryo gerekiyordu.

Düzenlemelerinizden Hakkında:

Ben, SQL enjeksiyonu hakkında söylenen sevindim bile doğru yerde değilse :)

SQL enjeksiyon için kaçan yapmak için uygun bir yer, bir önceki 'formchecking' aşamasında değil, SQL sunucusuna veri gönderirken zaman bunu yapmak için. 'Formchecking' doğru söylemek gibi doğrulamak için yer zipcodes uzunluğu, ya da boş alanlar ve, ama dizeleri SQL güvenli olması için kaçmak için değil.

Basit bir örnek göstermek gerekir neden:

$name = formcheck("John O'Donnell"); //Where you do all your checking step,
                                     //including mysql_real_escape_string
$user = new User($name,"gandalf");

Ancak,

mysql_real_escape_string("John O'Donnell") = "John O\'Donnell";

Şimdi ekranda adını görüntülemek için Kullanıcı örneğini kullanırsınız:

 echo "Welcome ".$user->printUser();

ve olsun:

Welcome Mr. John O\'Donell

Bu PHP OO bir örnek ise, o zaman kötü bir biri. Neden? SQLObject sınıf doğrudan kullanıcı sınıfına bağlı anlaşılacağı bir yöntemdir adduser () içerdiğinden. Sen SQLObject bir SqlUser sınıfı ve bunun yerine kullanıcı eklemek için bu sınıfı kullanabilirsiniz. Bu yeni sınıf veritabanı ile iletişimi idare ederim ve de herhangi bir SQL enjeksiyonu önlemek için sorumlu olacaktır. Eğer diğer yerlerde kod enjeksiyonu herhangi bir girişimleri kaçabilir rağmen, yine de başka bir yerde bir çağrı eklemeyi unutmayın sadece durumda, bu sınıfa dahil edilmelidir. (O olacak, çünkü bu olmayacak sanmıyorum!)

Ancak, biraz daha basit şeyler tutmak için bir sebebi son kod güvenilirlik maliyeti olsa bile, var. Bu nedenle kod yazmak için nasıl bir örnek bir okul projesi olduğunu ve. Bu iyileştirmeler için oda bir sürü var olsa bile, basit bir proje için sağlam makul. Ayrıca, kontrollü bir ortamda öğrenme konum unutmayın. Ticari bir şirket için çalışmaya başladıktan sonra, işler çok iyi bakmak gerekir. (Ve ne yazık ki, epeyce şirketleri, işler sadece çok daha kötüdür.)

adduser sınıf SQLclass içinde ise sadece SQLclass bir kullanıcı ekleyebileceğiniz anlamına gelir. Bu sql sınıfı birini ekleyebilirsiniz önce bir kullanıcı ne olduğunu bilmek kullanıcı sınıfına bağlı oldukları anlamına gelir. (Size bir portakal olduğunu bilmiyordum, özellikle elma ve portakal koyamamış)