Gönderilen her HTML sayfasına HTML kodu nasıl enjekte edilir?


23

Ben Apache web serverstatik HTML sayfaları sunan bir tane var . Bazı nedenlerden dolayı dosyaları değiştiremiyorum ama hala sunulan her sayfaya bir miktar HTML enjekte etmek istiyorum.

Bu mümkün mü mod_proxy? Olmazsa, kimse böyle bir özellik sağlayan bir yazılım önerebilir mi?

EDIT: Bir tür banner reklamı (örneğin a javascript) ve bir izleme pikseli eklemeliyim .

Yanıtlar:


18

Bunu yapabilirsiniz: İstekleri değiştirmek için mod_rewrite ile çalışın

/some/static/page.html

için

/htmlinjector.php?url=/some/static/page.html

daha sonra dosya işleme yapmak için PHP (veya uygun bulursanız) kullanın. Performansı artırmak için bir çıktı önbelleği ekleyin.

Alternatif olarak, Apache İşleyicileri size yardımcı olacaktır:

Bir CGI betiği kullanarak statik içeriği değiştirme

Aşağıdaki yönergeler html , footer.plCGI betiğinin başlatılmasını tetikleyecek dosya uzantılarına yönelik isteklere neden olacaktır .

Action add-footer /cgi-bin/footer.pl
AddHandler add-footer .html

Daha sonra, CGI betiği, orijinal olarak istenen belgeyi ( PATH_TRANSLATEDortam değişkeninin gösterdiği şekilde ) göndermek ve istenilen değişiklikleri veya eklemeleri yapmaktan sorumludur .

Bu, mod_rewrite yaklaşımının yapacağı şeydir, ancak daha az korsanlıkla.


Birisi mod_rewrite çözümünün bir örneğini verebilir mi? (özellikle htmlinjector.php içeriği)
— Asaf

1
Bu mücadele o sizin için - unutma ScriptAliasve <Directory /some/static/>...</Directory>, <Directory /path/to/cgi-bin/> Options +ExecCGI</Directory>ben kullanıcının cevap kurcalamak istemiyorum ama eğer talep, daha fazla bilgi verecektir vb.
— Sridhar Sarnobat 23:16

@ asdf Örnek: <?php ob_start(); include("/some/static/page.html"); $contents = ob_get_contents(); ob_end_clean(); echo str_replace('</head>', '<script async>Some script content goes here like adsense code</script></head>', $contents) ?>sayfa içeriğinin kalanını yüklemek için $ içerik kullanın. Bu dosyayı htmlinjector.php veya her neyse olarak kaydedebilir ve htaccess dosyanızda Options +FollowSymLinks RewriteEngine On RewriteCond %{REQUEST_FILENAME} /some/static/page.html RewriteRule ^(.*)$ /htmlinjector.php?url=/some/static/page.html
— şöyle çağırabilirsiniz

20

Bunun cevap listesinde neden bahsedilmediğinden emin değilim. Bu soruyu görmem 2 yıl sürdü ise özür dilerim ...

İstediğinizi yapmak için en kolay ve en güçlü yol Apache filtresi kullanmaktır .

Sadece var:

ExtFilterDefine css_changer mode=output intype=text/html cmd="/some/php/script.php"
SetOutputFilter css_changer

Olası bir komut dosyası:

#!/usr/bin/php
<?

#phpinfo(); // Uncomment to see ALL env variables
$host = $_ENV["HTTP_HOST"]; // www.site.com
$script_name = $_ENV["SCRIPT_NAME"]; // /theme/green/style.css
$pi = pathinfo($script_name);
$type = $pi['extension'];
#print "$host $script  $type";

$stdin = STDIN;

while($line = fgets($stdin)){
  $line = preg_replace('/a/', 'A', $line);

  fwrite(STDOUT, $line);
}
fclose(STDOUT);
?>

Bu, tüm "a" lar "A" larla değiştirilecektir.

Httpd.conf dosyanızdaki filtreyi şu şekilde etkinleştirdiğinizden emin olun:

LoadModule ext_filter_module libexec/apache2/mod_ext_filter.so

Bu soru Google’da gerçekten sıralanıyor ve forumlarda çok fazla bir şey yok.


1
Bu kadarıyla en iyi çözüm, benzer bir problem için bulabildim. Paylaşım için çok teşekkür ederiz!
— 12'de

4

Bir web sayfasındaki bağlantıları (içerik) düzenlemek için mod_proxy_html'in nasıl kullanılacağı hakkında bir öğretici . Bu değişikliği istediğiniz html ile uygulayabilirsiniz.

GÜNCELLEME: Bu rotaya gitmek istediğinize emin misiniz? Apache'nin içerik değil, içerik sunma amaçlı olduğunu düşünüyorum. Bu muhtemelen bir MVC çerçevesinin görüş kısmına gider. Bunu önermememin nedeni modülerlik kuralını çiğnemeniz . Web uygulamanız, onu sunucuya uygulayan, gelecekteki güncellemeleri, hamleleri vb. Karmaşık hale getiren uygulamalarla iç içe geçecektir.


Hm, doğru yaparsam mod_proxy_html tam yeni kod parçacıkları ekleyemiyor mu?
— Düğüm

Emin değilim, şimdi daha fazlasını eklediniz, Komutan Tomalak'ın cevabı daha iyi. Söyleyeceğim korsanlık diyarındasınız, web sayfaları oluşturmak gerçekten Apache'nin amacı değil, içerik sunmak içindir.
— Kyle Brandt

Html sayfalarını yeniden yazabilecek bir tür bağımsız proxy olduğunu düşündüm. MySQL için MySQL Proxy gibi bir şey. Belki de Privoxy bunu yapabilir.
— Düğüm

@Kyle Brandt: LOL - Bence askeri rütbeden bahsetmek resmen sizi bir trekkie yapar. Bu benim günümü yarattı. :)
— Tomalak

4

Bunu mod_rewrite ve SSI ile yapmayı tercih ederim.

İlk önce yolu bir ortam değişkenine koyun

RewriteCond% {IS_SUBREQ} yanlış
RewriteRule ^ (/.* \. Html) /page.shtml [E: dosya adı: $ 1]

sonra onu shtml dosyasında işleyin

<! - # virtual dahil = "$ dosyaadı" ->

(bu çözümün bölümleri /programming/40133/getting-apache-to-modify-static-webpages-on-the-fly/1196832’de bir yığın akışı sorusuna dayanmaktadır )


1
Bunun için shtml kullanmak istememin temel nedeni, her istek için harici bir CGI çağırmanın yükleme sorunlarına neden olabileceğidir.
— Alex Lehmann

4

mod_sed burada uygun. Örneğin, kapanış başlığına veya gövde etiketine uyan bir çıkış filtresi oluşturabilir ve önce html'nizi ekleyebilirsiniz.



1

Bazı ölçütler veya normal ifadeler kullanarak html'ye giden yanıtları enjekte etmek için Apache mod_substitute kullanabilirsiniz. İşte bunun nasıl başarılacağı hakkında bir açıklama.


1

Aşağıdaki yönergeleri kullanarak, apache üstbilgi ve altbilgi direktifine bakabilirsiniz.

<Directory "/usr/local/www/data/scott">
    Options +Indexes
    AllowOverride All
    AddOutputFilter LAYOUT html htm shtml
    LayoutComment On
    LayoutHeader /wrappers/scott-header.html
    LayoutFooter /wrappers/scott-footer.html
</Directory>

Daha fazla okuma burada: http://wannabe.guru.org/scott/hobbies/apache/


1

Mod Layout artık modası geçmiş durumda ve harici bir script çağırmanın genel giderini istemiyorsanız, benim için çalışan en iyi çözüm mod sed oldu . Mod sed'i ilk satırın doc'ına (1s) eşleştirmek ve orada üstbilgi kod kodu eklemek ve son satırı ($ s) eşleştirmek ve altbilgiyi buraya koymak için kullanabilirsiniz.

Options Indexes FollowSymLinks Includes ExecCGI
Order Deny,Allow
Deny from none
Allow from all
Require all granted

AddOutputFilter Sed html
SetOutputFilter Sed;DEFLATE
OutputSed "1s|^|<header code>|"
OutputSed "$s|$|</footer code>|g"

0

Apache üzerinden tüm sayfalara html ekleyebilirim, ancak yalnızca apache proxy sunucum olsa sitem değil, apache tarafından barındırılan site için.

bu nasıl çalışır. Bir XAMPP kurdum, apache 2.4 için mod_layout 5.1'i indirdim. (mod_layout'u yüklemek basittir, eğer Windows için XAMPP kullanıyorsanız, windows için mod_layout.so 5.1 dosyasını indirip, apache modül klasörünüze $ home / apache / modülüne koyun, daha sonra httpd.conf LoadModule layout_module module / mod_layout.so - linux veya diğer işletim sistemlerini kullanıyorsanız, linux için mod_layout.so dosyasını indirmelisiniz, sonra yüklemek için make komutunu çalıştırmalısınız)

Mod_layout.so dosyasını windows için yükledikten sonra, bu kodu .htaccess dosyasına veya httpd.conf dosyasına koymanız yeterli olacaktır.

<IfModule mod_layout.c>
AddOutputFilter LAYOUT html 
AddOutputFilter LAYOUT htm 
AddOutputFilter LAYOUT shtml 
AddOutputFilter LAYOUT shtm 
AddOutputFilter LAYOUT cgi 
AddOutputFilter LAYOUT php 
LayoutFooter "C:/xampp/apache/cgi-bin/footer.php"
</IfModule>

C: /xampp/apache/cgi-bin/footer.php, html veya php dosyanızı koyduğunuz yerdir, benim durumumda C: /xampp/apache/cgi-bin/footer.php, ancak herhangi bir yere koyabilirsiniz , sadece doğru yolu ver, iyi olacaksın

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.