/ Şeridini LaTeX belge özel karakterleri kaçmayı nasıl?

5 Cevap php

We implemented the online service where it is possible to generate PDF with predefined structure. The user can choose a LaTeX template and then compile it with an appropriate inputs.

Biz endişelenecek soru kötü niyetli bir kullanıcı lateks belgeye özel öğretim enjeksiyonu ile kabuk erişmek mümkün değildi, güvenlik.

We need some workaround for this or at least a list of special characters that we should strip from the input data.

Tercih edilen dil PHP olurdu, ama herhangi bir öneri, inşaatlar ve bağlantıları çok bekliyoruz.

PS. Birkaç kelime biz LaTeX için mysql_real_escape_string arıyoruz

5 Cevap

İşte Geoff Sazlık cevabı uygulamak için bazı kod. Ben kamu malı bu kodu yerleştirebilirsiniz.

<?

$test = "Test characters: # $ % & ~ _ ^ \ { }.";
header( "content-type:text/plain" );
print latexSpecialChars( $test );
exit;

function latexSpecialChars( $string )
{
    $map = array( 
            "#"=>"\\#",
            "$"=>"\\$",
            "%"=>"\\%",
            "&"=>"\\&",
            "~"=>"\\~{}",
            "_"=>"\\_",
            "^"=>"\\^{}",
            "\\"=>"\\textbackslash",
            "{"=>"\\{",
            "}"=>"\\}",
    );
    return preg_replace( "/([\^\%~\\\\#\$%&_\{\}])/e", "\$map['$1']", $string );
}

Göre http://www.tug.org/tutorials/latex2e/Special_Characters.html lateks özel karakterler # $ % & ~ _ ^ \ { }. En basit bir eğik çizgi ile kaçtı ama _ ^ ve \ özel tedaviye ihtiyacı olabilir.

Şapka kullanım için \^{} (ya da \textasciicircum), yaklaşık işareti kullanım için \~{} (ya da \textasciitilde) ve eğik çizgi kullanım için {[(4) }]

Eğer kullanıcı giriş daktilo metin olarak görünmesini istiyorsanız, \verb+asdf$$&\~^+ gibi kullanılabilir \verb komutu da var, + herhangi bir karakter olabilir ama Metinde olamaz.

Güvenli cs en güvensiz olanlardan ayırt etmek için hiçbir ilkeli bir yol olduğundan, genel olarak, tamamen komut dizileri kaçmasını aracılığıyla güvenliğinin sağlanması, büyük ölçüde ekspresivitesini düşürmeden yapmak zordur: Tex sadece bu izin için yeterince temiz bir programlama dili değildir. Ben güvenlik açıkları varlığını ortadan kaldırarak lehine bu yaklaşımı terk söyleyebilirim.

Lateks güvenlik açıkları veger özet benimki ile uyumlu: o bir kabuk kaçış açığını kaçırmış olsa, yani, sorunları, kabuk kaçar ve dosya creation.overwriting vardır. Bazı ek puan, daha sonra bazı önerileri uygulayın:

  1. Bu örtülü texmf.cnf etkin olabilir beri aktif, --shell-escape yürütmesini önlemek için yeterli değildir. Açıkça geçmek --no-shell-escape texmf.cnf geçersiz kılmak için gerekmektedir;
  2. \write18 ETEX ilkel değil, Knuth Tex Yani (ne yazık ki, çoğu olan) bunu uygulamak latekslerinin önleyebilirsiniz;
  3. \special komutları oluşturabilirsiniz kabuk komutları çalıştırmak için dvips sormak dvi dosyaları:. Eğer dvips kullanıyorsanız, başka bir risk vardır. Eğer dvips kullanırsanız Yani, kabuk komutları başvurmalarını yasaklamak -R2 komutunu geçmesi gerekir;
  4. texmf.cnf Tex dosyaları oluşturabilirsiniz nerede belirlemenizi sağlar;
  5. Onlar yaratabilir hangi fontların müşterileriniz çok özgürlük istiyorsanız yazı devre dışı oluşturulmasını önlemek mümkün olmayabilir. the notes on security for Kpathsea bir göz atın; varsayılan davranış bana makul görünüyor, ama başka kullanıcıların parmakları üzerinde bir kullanıcı Adımlara önlemek için, bir kullanıcı başına yazı ağacı olabilir.

Seçenekler:

  1. Müşterinizin Lateks çağırmaları Sandbox ve onlara sandbox yaramazlık için özgürlük verir;
  2. Kpathsea öndeğerlerinde güven ve lateks ve PDF çıktısını oluşturmak için kullanılan diğer yürütülebilir kabuk kaçar korusun;
  3. Büyük ölçüde müşterilerine yazı tipi dosyaları veya herhangi bir yeni müşteri tarafından belirtilen dosyaları oluşturmak için yeteneği yasaklayan, ekspresivitesini azaltır. Sadece belli zaten varolan dosyaları yazabilirsiniz bir süreç olarak lateks çalıştırın;
  4. Sen \write18 cs ve dosya oluşturma css, bağlı değildir, ve bu tür yazı / toc / Varil yaratılması için güvenle onları çağırmak, sadece makro, var olan bir biçim dosyası oluşturabilirsiniz. Bu, müşteri ne işlevselliği karar vermek zorunda demektir: Onlar özgürce onlar ithal hangi paketleri seçmek mümkün olmaz, ancak onlara dayattığı seçimler faydalanmak gerekir. Aklınızdaki 'şablonlar' ne tür bağlı olarak, bu kabuk kaçar kullanmak paketlerinin kullanım sağlayan, iyi bir seçenek olabilir, ancak dosya biçimi gider Tex / Lateks kodu denetlemek gerekir.

Postscript

Başka Ben yani Lateks kullanarak form girişi PDF üreten, almış birine soru üzerine almak adresleme bir römorkör makale, Server side PDF generation based on LATEX templates, var.