dosya taktikleri çok dizin geçişi güvenlik sorunu var?

3 Cevap php

If I choose lots of files tactics,
then I become to have directory
traversal security problem?

I need to write login system,
and lots of file tactics means

make lots of id files and use scandir.

böylece dizin olurdu

aaa.txt (contents is aaa_pass)
bbb.txt (contents is bbb_pass)
ccc.txt (contents is ccc_pass)

and when someone enter his id,
the system scandir the directory,
then find the id files.

ama hey, ne varsa o da girer

".. /.. / Important.txt"?

o .. /.. / important.txt için erişebilir?

3 Cevap

Eğer giriş sistemi yazmak için biraz garip bir yolda gidiyor gibi ilk bakışta, öyle görünüyor. Ben dosya sistemi üzerinde bir dizin emin düz metin dosyaları değilim çekmek için akıllıca bir yol olup olmadığını, anormal ve zaten daha yaygın kimlik yoluyla düşünülen inceliklerini birçok görmezden you'rer olasılıkla dışında başka hiçbir başka bir nedenle sistemleri. Eğer karma şifreleri tuzlanıp saklamak istiyorsa, örneğin, sizin düzeni olduğunu nasıl uygulanacağını düşünmek gerekiyordu ve bir güvenlik sorununa yol açacak bir hata yapabilir. İyi bir PEAR kütüphanesi veya Zend Framework bile Zend_Auth bileşeni kullanarak olsa da, size net ve iyi belgelenmiş bir başlangıç ​​noktası vermek istiyorum.

Neyse, size söz açıklamak düzenleme için nedenleri var varsayarak, basename () fonksiyonu bu durumda ne istediğinizi muhtemeldir. Eğer söz tanımlamak gibi bir dizin geçişi saldırı yapamaz böylece dosya kendisi her şeyi ama şerit olacak.

Kullanıcıdan giriş ise, böylece:

.. /.. / Önemli

Sen çalıştırabilirsiniz:

$cleanUsername = basename($input);
$filename      = '/path/to/password/files/' . $cleanUsername . '.txt';

if (file_exists($filename)) {
    [...]
}

Mantıklı?

Eğer bir yolun parçası olarak kullanmak önce adı bazı doğrulama gerçekleştirebilir - örneğin sadece bir düzenli ifade kullanarak böyle bir şey yapabileceğini harfleri ve sayıları izin:

if (!preg_match('/^[a-zA-Z0-9]+$/', $username)) {
    //username is not valid
} else {
    //username is ok to use
}

Bunu yapabileceği başka bir yolu, örneğin, okumak veya yazmak için önce kullanıcı adı karma için:

$hash = sha1($username);

Bu şekilde, kullanıcı adı olarak bir şey olabilir ve dosya arama davranışlarını manipüle onlara hiçbir tehlike olacak. "../../important.txt" kaynak dize kötü olmasına rağmen güvenli olduğunu size "48fc9e70df592ccde3a0dc969ba159415c62658d" bir karma verecek bir kullanıcı adı.

Eğer bu dosya şifre sistemi (Eğer bir nedenle veya başka için var varsayarak) kullanmak dışında başka bir seçenek varsa, karartılmış dosya adları çeşit oluşturmanın yanı sıra, aynı zamanda sunucu olarak aynı uzantılı dosyaları oluşturmak isteyebilirsiniz ihtimale karşı tarafı dil - PHP kullanıyorsanız, örneğin, dosya adı john.php (ya da 'john' karartılmış) olacağını ve içeriği böyle bir şey olabilir:

<?php
    exit; // or maybe even a header redirect --
    /*password goes here*/
?>

Tabii ki dosya okumak rutin açıklama bloğu içinde bizim ifade ayrıştırmak gerekir.

Birisi bir şekilde bu dosyaya varmak MU eğer bu şekilde, bu hale asla.