Do not PHP bu işlev yazmak deneyin. Kaçınılmaz Yanlış alacak ve uygulama kaçınılmaz bir keyfi uzaktan yürütme istismar olacaktır.
İlk olarak, aslında çözme ne problem düşünün. Ben sadece PHP Python veri almak için çalışıyoruz sanırım. Bir. Ini dosyası yerine bir. Py dosyası yazmak için deneyebilirsiniz. Python mükemmel ini sözdizimi ayrıştırıcı var, ConfigParser. Sen bariz yazabilirsiniz, ve (okuyun: ne zaman) eğer PHP ve ciddi hiçbir şey potansiyel yanlış, alıntı işlevi olur onu yanlış anlamayın.
Ayrıca bir XML dosyası yazabilirsiniz. Beni bile burada listelemek için PHP ve Python için çok sayıda XML ayrıştırıcıları ve yayıcılar vardır.
I really Bu bir terrible, terrible fikir olduğuna sizi ikna edemiyorsanız, o zaman en azından böyle bir şeyi yapmak için Python sahip önceden varolan işlevini kullanabilirsiniz: {[( 2)]}.
İşte sizin için bunu yapmak için bir Python komut dosyasını çalıştırmak kullanışlı bir PHP fonksiyonu var:
<?php
function py_escape($input) {
$descriptorspec = array(
0 => array("pipe", "r"),
1 => array("pipe", "w")
);
$process = proc_open(
"python -c 'import sys; sys.stdout.write(repr(sys.stdin.read()))'",
$descriptorspec, $pipes);
fwrite($pipes[0], $input);
fclose($pipes[0]);
$chunk_size = 8192;
$escaped = fread($pipes[1], $chunk_size);
if (strlen($escaped) == $chunk_size) {
// This is important for security.
die("That string's too big.\n");
}
proc_close($process);
return $escaped;
}
// Example usage:
$x = "string \rfull \nof\t crappy stuff";
print py_escape($x);
chunk_size
kontrol, giriş sırasıyla ("hello " + ("." * chunk_size))
ve '; os.system("do bad stuff")
gibi görünüyorsun iki gerçekten uzun dizeler, olmak biter sayede bir saldırıyı önlemek için tasarlanmıştır. Şimdi, Python bir satırın ortasında tek tırnaklı dize sonunda izin vermez, çünkü o naif saldırı, tam olarak çalışmaz, ve system()
çağrısında alıntılar kendilerini alıntı olacak, ama eğer Saldırgan doğru yere bir çizgi devamında ("\") almak ve os.system(map(chr, ...))
sonra koşacaklar bazı kod enjekte edebilir gibi bir şey kullanmak için yönetir.
Ben sadece tek bir parça okumak ve oldukça okumak ve birikmesine devam daha fazla çıkış, olsaydı Python kaynak dosyası hat uzunluğuna sınırları da vardır çünkü, vazgeçmek için seçti; bütün bildiğim için, o başka bir saldırı vektörü olabilir. Python bu nedenle bu alanda denetlenecek düşüktür sisteminizde keyfi kaynak kodu yazma keyfi insanlara karşı güvenli olması amaçlanmıştır değildir.
Ben bu önemsiz, örneğin bütün bu düşünmek zorunda olması bir veri değişim biçimi olarak python kaynak kodu kullanmak gerekir neden bir başka örnektir.