Aikido

PHP'de dinamik değişken adlarından neden kaçınmalısınız?

Okunabilirlik

Kural
Kaçın dinamik değişken adlarından
Dinamik değişken adları (değişken değişkenler) olabilir yol açabilir
şuna zor sürdürülmesi sürdürülmesi kod ve beklenmedik davranış. 
Onların kullanım şöyledir genellikle şu sonuç bir bir yazım hatasından

Desteklenen diller: PHP

Giriş

PHP’nin “değişken değişkenler” özelliği, bir değişkenin değerini başka bir değişkenin adı olarak kullanmanıza olanak tanır; bunun için $$ sözdizimi. Akıllı bir kısayol gibi görünen bu yöntem, hangi değişkenlerin mevcut olduğunu veya bunların ne içerdiğini statik olarak belirleyemediğinizde, hata ayıklama açısından bir kabusa dönüşür. Şu şekilde kullanılan kod: $$kullanıcıAdı Bir dizi veya nesne özelliği yerine bunun kullanılması, IDE’lerin otomatik tamamlama özelliği sunmasını, statik analiz araçlarının hataları tespit etmesini veya geliştiricilerin uygulama içindeki veri akışını izlemesini imkânsız hale getirir.

Neden önemli?

Kod bakım kolaylığı: Değişken değişkenler, geliştiricilerin güvendiği tüm araçların işleyişini bozar. IDE’ler, değişken adlarını otomatik olarak tamamlayamaz, kullanım yerlerini bulamaz veya güvenli bir şekilde yeniden yapılandırma yapamaz. Statik analiz araçları, tanımlanmamış değişkenleri veya tip uyuşmazlıklarını tespit edemez. Hata ayıklama için çalışma zamanı incelemesi gerekir; çünkü değişkenlerin nerede ayarlandığını veya okunduğunu bulmak için kod tabanında arama yapamazsınız.

Güvenlikle ilgili hususlar: Değişken isimleri kullanıcı girdisinden geldiğinde, saldırganlar güvenlik açısından kritik olanlar da dahil olmak üzere rastgele değişkenlerin değerlerini değiştirebilirler. Kötü niyetli bir istek parametresi şunları hedef alabilir: $$_GET['var'] üzerine yazmak için $isAdmin, $userId, ya da oturum değişkenleri. Bu durum, tespit edilmesi zor ve istismar edilmesi kolay değişken enjeksiyon güvenlik açıklarına yol açar.

Performans üzerindeki etkisi: Değişken değişkenler, PHP’nin derleme aşamasında sembol çözümlemesi yerine çalışma zamanında arama yapmasını gerektirir. Yorumlayıcı, her erişimde değişken adını dinamik olarak değerlendirmek zorundadır; bu da normal değişkenlerde işe yarayan optimizasyonların uygulanmasını engeller. Diziler ve nesneler, benzer işlevselliği daha iyi performans özellikleriyle sunar.

Kod örnekleri

❌ Uygun değil:

function processFormData($formType) {
    $userForm = ['name' => '', 'email' => ''];
    $adminForm = ['name' => '', 'email' => '', 'role' => ''];

    $formName = $formType . 'Form';
    $$formName = array_merge($$formName, $_POST);

    if ($$formName['email']) {
        sendEmail($$formName['email']);
    }

    return $$formName;
}

// What variable does this actually use?
processFormData('user');

Neden yanlış: Kod, $userForm değişkenini oluşturur ya da $adminForm dinamik olarak kullanarak $$formName, bu da hangi değişkenin değiştirildiğini tespit etmeyi imkânsız hale getirir. Eğer $formType kullanıcı girdisinden kaynaklandığı için, saldırganlar kritik değişkenlerin değerlerini üzerine yazmak amacıyla rastgele değişken adları enjekte edebilirler.

✅ Uygunluk:

function processFormData(string $formType): array {
    $forms = [
        'user' => ['name' => '', 'email' => ''],
        'admin' => ['name' => '', 'email' => '', 'role' => '']
    ];

    if (!isset($forms[$formType])) {
        throw new InvalidArgumentException('Invalid form type');
    }

    $form = array_merge($forms[$formType], $_POST);

    if (!empty($form['email'])) {
        sendEmail($form['email']);
    }

    return $form;
}

// Clear which data structure is being used
processFormData('user');

Bunun önemi: Kod, anahtarları bilinen açık bir dizi kullanır; bu sayede veri akışı net bir şekilde anlaşılır ve tüm IDE özelliklerinden yararlanılabilir. Giriş doğrulaması, enjeksiyon saldırılarını önler ve statik analiz, kodun doğru olup olmadığını doğrulayabilir.

Sonuç

Değişken değişkenleri diziler, nesneler veya daha iyi bir kod yapısı ile değiştirin. Dinamik anahtar erişimi gerektiğinde dizileri kullanın, özellikleri bilinen yapılandırılmış veriler için nesneleri kullanın ve tekrarlanan mantığı uygun soyutlamalara dönüştürün. Değişken değişkenler neredeyse her zaman, uygun veri yapılarının daha net bir şekilde çözebileceği bir tasarım sorununa işaret eder.

Sık Sorulan Sorular

Sorularınız mı var?

Değişken değişkenlerin herhangi bir meşru kullanım alanı var mı?

Son derece nadirdir. Şablon motorları ve metaprogramlama çerçeveleri bazen bunları kullanır, ancak bu durumlarda bile diziler veya özel veri yapıları daha uygun bir çözüm sunar. Değişken değişkenlere ihtiyacınız olduğunu düşünüyorsanız, muhtemelen dinamik anahtarlara sahip bir diziye ya da veri akışınızın yeniden tasarlanmasına ihtiyacınız vardır.

Peki ya değişkenleri dinamik olarak oluşturan extract() işlevi ne olacak?

Değişken değişkenlerdeki nedenlerle aynı sebeplerden dolayı extract() işlevini kullanmaktan kaçının. Bu işlev, dizi anahtarlarından dinamik olarak değişkenler oluşturur; bu da statik analizi bozarak güvenlik riskleri yaratır. Doğrudan dizi erişimini kullanın: $data['key'], extract($data); $key yerine. Modern PHP kodunda extract() işlevi, kod kokusu olarak değerlendirilmelidir.

Değişken değişkenler kullanan mevcut kodu nasıl yeniden düzenleyebilirim?

Uygulanan kalıbı belirleyin. Genellikle bu, ya yapılandırma verileri (diziler kullanın), ya dinamik özellikler (nesneler veya diziler kullanın) ya da koşullu mantık (uygun kontrol yapıları kullanın) şeklindedir. Çoğu durumda $$varName ifadesini $config[$varName] ile değiştirin. Özellik erişimi için tür güvenliği ve IDE desteğine ihtiyacınız olduğunda nesneler kullanın.

Sabitler için değişken değişkenler kullanmaya ne dersiniz?

Hâlâ sorunlu bir durum. Sabitlere dinamik olarak erişmeniz gerekiyorsa constant($name) kullanın; ancak bu da bir tasarım sorununa işaret ediyor. Daha iyi bir yaklaşım: İlgili sabitleri bir sınıfta düzenleyin ve çalışma zamanı koşullarına göre uygun değeri seçmek için bir dizi veya match ifadesi kullanın.

Değişken değişkenler, ad alanı çakışmalarına neden olabilir mi?

Evet, özellikle süper küresel değişkenler ve çerçeve değişkenleri söz konusu olduğunda. $$type = 'value' biçiminde yazılmış kodlar, beklenmedik bağlamlarda yanlışlıkla $_GET, $_POST veya $this gibi çerçeve değişkenlerini oluşturabilir. Diziler, verilerini doğal olarak ad alanlarına ayırır ve tasarım gereği bu tür çakışmaları önler.

Şimdi güvenliğinizi sağlayın

Kodunuzu, bulutunuzu ve çalışma zamanınızı tek bir merkezi sistemde güvenceye alın.
Güvenlik açıklarını otomatik olarak hızla bulun ve düzeltin.

Kredi kartı gerekmez | Tarama sonuçları 32 saniyede.