Bu yöntem kullanıcılara hataları göstermek için yeterince güvenli / iyi mi?

7 Cevap php

I'm developing a website, and due to user-input or by other reason, I need to show some error messages. For this, I have a page named error.php, and I get the error number using $_GET. All error messages are stored in a array.

Örnek:

header( 'Location: error.php?n=11' );

But I don't want the users to the enter the error code in the URL and see all the other error messages. For preventing that, I thought I could whitelist the referer page, and only show the error message if the referer is found in my whitelist.

Bu (;) henüz test değil) buna benzer adil olmalı

$accept = false;
$allowedReferer = array (0=>'page1.php', 'page2.php');
if (in_array($_SERVER['HTTP_REFERER'], $allowedReferer )) {$accept = true;}
if ($accept) { $n=$_GET['n'];echo "Error: " . $errorList[$n];}

Bu yöntem, spy-users önlemek için yeterince iyi mi?

Ben PHP5 ile yapıyorum

Teşekkürler

7 Cevap

Aksine yönlendirme yerine, basitçe "bir yerde" hata görüntüleyebilirsiniz - örneğin gibi bir şey ile mevcut kodu adapte gibi basit bir şey

if ($error_condition)
{
    $_GET['n']=11;
    include "/path/to/error.php";
    exit;
}

Uygulamada biraz daha karmaşık olabilir, ama fikir aynıdır - kullanıcı yönlendirme olmadan bir hata mesajı ile sunulmaktadır. Emin size çıktı hatası başlığının çeşit, örneğin olun başlık gerçekten istenen sayfayı görme değil tarayıcı anlatmak için ("HTTP/1.0 401 Bad Request").

Eğer yönlendirmek istiyorsunuz, o zaman örneğin, sadece kod bilinen bir tuz ile hata sayısının bir karma dahil ederek bir "önlemeli" URL oluşturabilir

$n=11;
$secret="foobar";
$hash=md5($n.$secret);
$url="http://{$_SERVER['HTTP_HOST']}/error.php?n={$n}&hash={$hash}";

Şimdi error.php verilen karma doğru oluşturulmuş olup olmadığını kontrol edebilirsiniz. Eğer öyle olsaydı, o zaman büyük olasılıkla bu kullanıcı kodu tarafından oluşturulan ve değildi.

Hayır, güvenli uzaktan değil: HTTP Referer başlık parodi saçmadır, ve ya bir başlık gerekli değildir. Sana this article (PHP ile yazılmış) istismar kodunun örneğin okumak, ya da Firefox kendi tarayıcı konforunda kendiniz yapmak için this add-on indirmenizi öneririz.

Ayrıca, $allowedReferer dizisi içermelidir full URL, sadece komut adı, aksi kodu da uzak yönlendirmelerindeki bela olacaktır, örneğin itibaren

http://www.example.org/page1.php

Özetlemek gerekirse: kimlik doğrulaması gerektirmeden herhangi bir public ağ kaynağına erişimi kısıtlamak olamaz.

Sen bir hata sayfasına ulaşmak için bir harici yönlendirme kullanmamalısınız. Ben PHP yapısı nasıl gibi:

Ben genel fonksiyonlar ile, her sayfada dahil olan ortak bir dosya var: login / logout kurmak sabitler ve benzeri anlaştım. Eğer bu hata bilgi aktarır orada bir hata () işlevi bir hata sayfası ve çıkış gösterecektir var. Bir alternatif index.php kullanmaktır? Ortak işlevselliği elde etmek = pagename.php deyim içerir ama bu çok daha lapa lapa ve hata eğilimli bulmak.

Eğer dışarıdan (tabii ki bazen yapmak gerekir) müşteri yönlendirirseniz o mekanizması aracılığıyla iletilen bilgilere güvenmemelisiniz. Tüm kullanıcı girişi gibi doğal güvenilmez ve dezenfekte ve aşırı dikkatle tedavi edilmelidir. Çerezleri (aynı sorun) ya da kullanmayın. Eğer istekleri arasında bilgi devam gerekiyorsa oturumları kullanın.

HTTP_REFERER yeterli teşvikler (telnet orada seçim aracı) sahip olanlar tarafından trivially sahte olabilir, ve güvenilir olmamalıdır.

Hata mesajları nasıl olsa kritik bir şey ortaya asla, bu yüzden onlar herkese gösterdi olabilir böyle bir şekilde hata iletileri tasarlamak için size öneririm.

Yani, ya da, bir yerde bir ilişkisel dizi merkezi bir yerde saklanır (yerine 11, 98d1ud109j2, vb kullanacağınız) hatalarını belirlemek için rastgele sağlamalarının kullanın:

$errors[A_VERY_FATAL_ERROR] => "308dj10ijd"

Neden sadece hata iletisi komut dahil değil mi? Ve önceki çıkış veri kurtulmak için, output control bunu tampon ve hata temizlemek için kullanabilirsiniz:

if ($error) {
    ob_clear();
    $errorCode = 11;
    include 'error.php';
    exit;
}

Bunun yerine bir hata sayfasına yönlendirme neden bir hata sayfası dahil değildir. . Htaccess ile hata içeriği php dosyalarını içeren bir dizin erişimi kısıtlayabilir:

RedirectMatch 404 ^error-pages/*$

ve hata sayfaları içinde hangi ekran hataları şunlardır-mümkün sayfaları olabilir.

Bu yöntem ile hiç biri doğrudan hata sayfaları dizine sayfalara erişebilirsiniz henüz halen kamuya erişilebilir komut içinde onları içerebilir emin olabilirsiniz.

Eğer başlıkları göndermeden önce hataları işlemek, kolayca hemen sonrasında bir içeriğe sahip temel bir html sayfası çıkışları fonksiyonu ve çıkış oluşturabilirsiniz. Başka bir sayfa için özel bir ihtiyaç olduğunu yolu (ayrı işlevleri sayfasından, sanırım).

Bu bir problem varsa kontrol gibi basit ve bir sorun varsa, sadece işlevini çağırın.

Ben çağrıldığında bile uzak veri yazar, bu gibi bir işlevi kullanmak, bu yüzden benim kendi hata günlükleri var ...