PHP nasıl benim $ _GETs güvenli olabilir?

5 Cevap php

Benim profile.php kullanıcının tüm ilanları, yorum, resim görüntüler. Kullanıcı silmek istiyorsa remove.php? Action = removeposting & posting_id = 2 gibi yani, o remove.php için Gönderiyor id gönderir. Bir resmi kaldırmak istiyorsanız, bu remove.php var? Action = removepicture & picture_id = 1.

Get verileri kullanarak, ben onlar silmek istiyorum ve bunu silmek istiyorsanız, onlar "evet" tıklayın bilgi görüntülemek için veritabanına bir sorgu yapmak. Yani veri $ cross-site istek sahteciliği önlemek için GET $ POST üzerinden silinir.

Benim soru Eminim yapabilirim nasıl GETler bazı javascript kodu olacak beni dağıtmayacak SQL injection değildir.

here is my remove.php

    //how do I make $action safe? 
    //should I use mysqli_real_escape_string?
    //use strip_tags()?
    $action=trim($_GET['action']);

    if (($action != 'removeposting') && ($action != 'removefriend') 
    && ($action != 'removecomment'))
    {
            header("Location: index.php");
            exit();
    }

if ($action == 'removeposting')
{
   //get the info and display it in a form. if user clicks "yes", deletes
}

if ($action =='removepicture')
{
   //remove pic
}

Ben% 100 güvenli olamaz biliyorum, ama ben kullanabileceğiniz bazı yaygın savunmalar nelerdir.

EDIT

Do this to prevent xss
$oldaction=trim($_GET['action']);
$action=strip_tags($oldaction);

Then when I am 'recalling' the data back via POST, I would use 
$posting_id = mysqli_real_escape_string($dbc, trim($_POST['posting_id']));

        if ($action == 'removeposting')
{
    //get the posting id from the user  
    $getposting_id = htmlspecialchars(trim($_GET['posting_id']));

    //basic checks for the posting id
    if (empty($getposting_id)){
        //header ("Location: index.php");
        echo '<p>Sorry, no posting was specified for removal.</p>';
        exit();
    }

    if (!is_numeric($getposting_id))
    {   
        echo "Not an integer";
        exit();
    }
        //Also have check to see if the posting_id is the user's. If so, can delete

5 Cevap

Eğer $action depolama ve sadece koşullu bunu kullanarak değil, çünkü kaçan / sıyırma / tüm kırpma yapmak gerekli değildir. I === yerine == kullanarak tavsiye rağmen basit bir dize karşılaştırmaları ", güvenlik" açısından yeterlidir.

Bir $_GET veya bir MySQL veritabanı bir tamsayı sütunu içine $_POST değerini saklamak olduğunu Alternatif olarak, eğer, örneğin, sadece intval() önce içine değerini geçebileceği veritabanında saklayarak. Eğer düz metin saklamak gerekiyorsa, sadece mysql_real_escape_string() saklamadan önce geçer. Ayrıca preg_match() kullanabilir veya preg_replace() emin sadece (örneğin /^\d{5}(?:-?\d{4})?$/ zip kodları için, farklı kullanımlar için farklı desen) geçerli değerleri saklamak emin olmak için.

Eğer mysqli_real_escape_string kullanmalısınız VEYA aynı şeyi başarmak Hazırlanan İfadeleri kullanabilirsiniz herhangi bir SQL enjeksiyon karşı önlemek için.

Herhangi bir javascript önlemek için, htmlspecialchars ile konser strip_tags kullanabilirsiniz.

Ben% 100 güvenli olamaz biliyorum

ahahahaha :)

Lütfen sadece eylem ile ilgili soru ve çalıştırmak için kod belirlemek için kullanılır, tek, eğer herhangi bir yöntemle güvenli IS.

But some info for you:
POST doesn't prevent cross-site request forgery. unique token does.
You didn't post actual action code, so just to be sure - I hope you check user's id whan perform these actions

Başka yerlerde de belirtildiği gibi mysqli_real_escape_string kullanın. Ayrıca, tabii ki bu XSRF önlemek için hiçbir şey yapmaz. Bunun için bazı entropi içeren belirteçleri gerekir.

Ayrıca bakınız: http://www.owasp.org/index.php/Main_Page

Eğer gibi programı başka şeyler onu (CONCATENATE) tutkal deneyin kadar $ _GET tamamen güvenlidir:

  • SQL idam (siz (mysqli_real_escape_string kullanmak hangi durumda) veya kullandığınız veritabanı ile tavsiye edilir başka önceleme tekniği) olmak üzere
  • HTML (birleştirme veya baskı / yankılanan önce (htmlspecialchars'dan geçmesi gereken durumda)) çıkışı yapılacak
  • URL (büyük olasılıkla urlencode geçirin hangi durumda ()) kullanıcı tarafından navigasyon yapılacak
  • JavaScript (Eğer json_encode geçirin hangi durumda ()) tarayıcısı tarafından yürütülecek

Eğer veritabanına eklenmesini istediğiniz html gömülü javascript bir url sahip olmak istiyorsanız, o zaman sırayla tüm bu fonksiyonları aracılığıyla $ _GET aldığınız değer (ayrıca $ _POST, $ _COOKIE ve benzeri diğer dış kaynaklardan) geçmelidir yani, bu senaryoya uygun

mysql_real_escape_string(htmlspecialchars(json_encode(urlencode($_GET['val']))));

Yapmanız tek şey bazı dizeleri için $ _GET ['action'] karşılaştırmak ise o sen perfectly safe without doing any escaping at all.