Xpath nitelikler hijyen / temizlik

3 Cevap php

Ben dinamik öznitelik değeri kullanıcı tarafından sağlanan bir unsur niteliği için bir XPath sorgusu inşa etmek gerekir. Ben bir SQL enjeksiyonu saldırısı XPath eşdeğer engellemek için bu değeri temizlik veya sanitasyon hakkında gitmek nasıl emin değilim. (PHP) Örneğin:

<?php
function xPathQuery($attr) {
    $xml = simplexml_load_file('example.xml');
    return $xml->xpath("//myElement[@content='{$attr}']");
}

xPathQuery('This should work fine');
# //myElement[@content='This should work fine']

xPathQuery('As should "this"');
# //myElement[@content='As should "this"']

xPathQuery('This\'ll cause problems');
# //myElement[@content='This'll cause problems']

xPathQuery('\']/../privateElement[@content=\'private data');
# //myElement[@content='']/../privateElement[@content='private data']

Özellikle sonuncusu eskiden SQL enjeksiyon saldırıları andırıyor.

Şimdi, çift tırnak içeren tek tırnak ve özelliklerini içeren nitelikleri olacak bir gerçeği biliyorum. Bu bir işleve argüman olarak sunulmaktadır beri, ne bunlar için girdiyi ideal bir yol olurdu?

3 Cevap

XPath aslında formda $varname ifadelerde in variable references izni vererek, güvenle bunu yapmanın bir yöntemi içermez. PHP SimpleXML dayandığı olduğu kitaplık, provides an interface to supply variables, ancak bu is not exposed by the xpath function daki örnekte.

Gerçekten ne kadar basit bir göstergesi olarak bu olabilir:

>>> from lxml import etree
>>> n = etree.fromstring('<n a=\'He said "I&apos;m here"\'/>')
>>> n.xpath("@a=$maybeunsafe", maybeunsafe='He said "I\'m here"')
True

Bu da benzer bir xpath function ile, SimpleXML gibi aynı temel kütüphane için, lxml Python sarıcı kullanıyor. Boolean, sayılar, ve düğüm-setleri de doğrudan aktarılabilir.

Verildiğinde daha yetenekli bir XPath arayüzüne geçiş bir seçenek, bir çözüm değilse, dış dizesi çizgisinde bir şey (PHP uyum çekinmeyin) olacaktır:

def safe_xpath_string(strvar):
    if "'" in strvar:
        return "',\"'\",'".join(strvar.split("'")).join(("concat('","')"))
    return strvar.join("''")

Dönüş değeri doğrudan ifade dizesinin eklenebilir. Bu aslında çok okunabilir değil gibi, burada davranır nasıl:

>>> print safe_xpath_string("basic")
'basic'
>>> print safe_xpath_string('He said "I\'m here"')
concat('He said "I',"'",'m here"')

Eğer &apos;, bir XML belgenin dışında şeklinde kaçan kullanamazsınız, Not, ne de genel XML serileştirme rutinleri geçerlidir. Ancak, XPath concat işlevi herhangi bir bağlamda tırnak iki tip bir dize oluşturmak için kullanılabilir.

PHP varyant:

function safe_xpath_string($value)
{
    $quote = "'";
    if (FALSE === strpos($value, $quote))
        return $quote.$value.$quote;
    else
        return sprintf("concat('%s')", implode("', \"'\", '", explode($quote, $value)));
}
function xPathQuery($attr) {
    $xml = simplexml_load_file('example.xml');
    $to_encode = array('&', '"');
    $to_replace = array('&amp;','&quot;');
    $attr = replace($to_encode, $to_replace, $attr);
    return $xml->xpath("//myElement[@content=\"{$attr}\"]");
}

Tamam, ne yapar?

Bu ve tüm tekrarlarını kodlar ve "size özel kullanım için güvenli bir seçici vermelidir dizesi, & ve " gibi. Ben de birlikte xpath 'iç yerini unutmayın". EDIT: O zamandan beri '' olarak kaçtı olabilir, bu nedenle tercih yöntemi alıntı hangisi dize kullanabilirsiniz olduğuna işaret edilmiştir.

Ben, bir DOM kullanarak tek bir eleman XML belgesi oluşturmak sağlanan değere elemanın metnini ayarlamak için DOM kullanmak ve daha sonra XML DOM dize temsili üzerinden metni kapmak istiyorum. Bu karakter kaçan tüm doğru yapılırsa garanti edecek, ve sadece bir karakter ben hazırlıksız düşünmek oluyor olduğumu kaçan.

Düzenleme: Ben bu gibi durumlarda DOM kullanmak istiyorsunuz nedeni DOM yazdı insanlar XML tavsiye okudum ve ben (en azından, bakım düzeyi ile sahip oldukları değil) yok olması. Metin DOM yazarlar XML önerisi bölüm 2.2 hayata çünkü XML (# x8 gibi) izin vermediği bir karakter içeriyorsa Önemsiz bir örnek almak için, DOM bir ayrıştırma hatası bildirir.

Şimdi, "iyi, ben sadece XML önerisi geçersiz karakterlerin listesini almak ve giriş onları şerit olacak." Diyebilirsiniz Tabii. Sadece um, halt Unicode vekil blokları ne ... XML tavsiye bakmak ve izin? Onlardan kurtulmak için yazmak için kod ne tür var mı? Onlar bile ilk etapta benim metnin içine alabilir miyim?

Kullanıcının bunu anlamaya varsayalım. XML tavsiye ben bilmem karakter temsillerini belirtir nasıl diğer yönleri var mı? Muhtemelen. Bu Uygulamak ne çalışıyorum üzerinde bir etkisi var mı? Belki.

Ben DOM benim için karakter kodlamasını yapalım, ben bu şeyler hakkında herhangi endişelenmenize gerek yok.