[php] <script>-Codes nach URL-Teilen filtern?

BartTheDevil89

Devilution Media
ID: 87739
L
2 Mai 2006
3.960
103
Hallo,
Und zwar muss ich aus einem Textstring bestimmte <script>-Tags filtern. Also mein Beispiel:

Code:
Das ist
<script language="javascript" src="https://www.auto.de/test.php"></script>
ein
schöner
Text und hier <script language="javascript" src="https://www.pagepeel.de/pagepeels/pagepeel.php?id=326"></script> ein Pagepeel und<script language="javascript" src="https://www.pagepeel.de/pagepeels/pagepeel.php?id=326"></script>bis hier....

Jetzte möchte ich alle <script>-Codes zum Beispiel entfernen, die "pagepeels" in der URL als Begriff haben.

Also in dem obrigen Beispiel wäre es eben nur die zweite URL, also https://www.pagepeel.de/pagepeels die ja sogar zweimal in dem Teststring drin ist.

Also das soll am Ende bei rauskommen:

Code:
Das ist
<script language="javascript" src="https://www.auto.de/test.php"></script>
ein
schöner
Text und hier ein Pagepeel und bishier....

Aber wie bekomme ich das am besten hin? Also über ereg_replace würde ich es am besten machen, aber wie bekomme ich es am besten hin, dass eben der komplette <script>-Code entfernt wird und gleichzeitig eben die URL auf eines dieser Teilstücke geprüft wird?

Dankeschön
 
Zuletzt bearbeitet:
Vergiss ereg_* und nimm preg_match_all(). Dadurch kannst Du Dir alle Script-Tags filtern lassen und bekommst diese in einem Array zurückgeliefert. Je nachdem, ob die URL passt oder nicht, ersetzst Du dann im Ausgangscode die entsprechende Stelle oder eben nicht...

Guck Dir am besten einfach mal die Ausgabe von folgendem Code an:
PHP:
preg_match_all('/<script[^>]*src="?(.*?)"?[^>]*(?:\/|>.*?<\/script)>/i', $dein_content, $matches);
var_dump($matches);
Untested und es kann gut sein, dass der RegExp nicht 100%ig passt, aber es sollte die Richtung vorgeben.

Beim RegExp musst Du aber auf jeden Fall bedenken, dass das src-Attribut keine feste Position hat.

[edit]

Was Du auch bedenken solltest, wäre, dass Du auch alle Skriptblöcke ohne src-Attribut löscht, in denen etwas aus der Badlist vorkommt:
PHP:
<script>
document.write('<script type="text/javascript" src="https://www.böseurl.de"><'+'/script>');
</script>
Ist vollkommen legitimer Code und nur die Spitze des Eisbergs, die da noch an Spezialfällen auf Dich zukommen wird.
 
Wie tleilax löblicher Weise gezeigt hat, lässt sich das äußerst leicht umgehen (gibt noch zig Möglichkeiten -> z.B. URL verschlüsseln und erst bei der Ausgabe entschlüsseln). Um das vollständig unterbinden zu können brauchst du eine komplette JS-Implementierung -> viel Spaß! :D
 
...oder einfacher alles, was zwischen <script>-Tags is, rauswerfen.
Halt die Frage, ob das gewuenscht ist.
 
Wie tleilax löblicher Weise gezeigt hat, lässt sich das äußerst leicht umgehen (gibt noch zig Möglichkeiten -> z.B. URL verschlüsseln und erst bei der Ausgabe entschlüsseln). Um das vollständig unterbinden zu können brauchst du eine komplette JS-Implementierung -> viel Spaß! :D
Naja, es ist halt einfach so, dass ich in einem System spezielle <script>-Codes nicht zulassen darf. Und um das eben zu verhindern wird es Regeln für die Benutzer geben, allerdings um die noch bisschen zu überwachen, ist dieser Code oben. Und, dass es dann noch ein paar dumme User gibt, die evenutell da was versuchen fällt ja trotzdem auf und dann gibts halt Sperrung und gut. Aber will die Regel einfach noch technisch überprüfen können.

...oder einfacher alles, was zwischen <script>-Tags is, rauswerfen.
Halt die Frage, ob das gewuenscht ist.

Nein, leider nicht, will ja andere <script>-Codes zulassen.
 
Nein, leider nicht, will ja andere <script>-Codes zulassen.
Dann wirst du wohl um eine vollstaenige JS-Implementierung nicht rumkommen :ugly:

Solange ich <script> machen darf, kann ich immer Code schreiben, der beliebige Scripts ausfuehrt. Und wenn du es mir verbietest technisch, dann schreib ich den Code eben wieder um.

Du kannst nur wirklich alles verbieten, indem du entweder Whitelist-Ansatz machst (koennte man z.B. spezielle Tags anbieten) oder eben verstehst, was ich mache, also JS parst.
 
Vergiss ereg_* und nimm preg_match_all(). Dadurch kannst Du Dir alle Script-Tags filtern lassen und bekommst diese in einem Array zurückgeliefert. Je nachdem, ob die URL passt oder nicht, ersetzst Du dann im Ausgangscode die entsprechende Stelle oder eben nicht...

Guck Dir am besten einfach mal die Ausgabe von folgendem Code an:
PHP:
preg_match_all('/<script[^>]*src="?(.*?)"?[^>]*(?:\/|>.*?<\/script)>/i', $dein_content, $matches);
var_dump($matches);
Untested und es kann gut sein, dass der RegExp nicht 100%ig passt, aber es sollte die Richtung vorgeben.

Hi,

also ich hab jetzt mal deinen Code getestet und als Ausgabe bekomme ich:

array(2) { [0]=> array(1) { [0]=> string(98) "" } [1]=> array(1) { [0]=> string(0) "" } }

Wenn also ein script-Code drin ist.

Aber wie schaffe ich es, dass ich jetzt wirklich nur <script>-Tags zum Beispiel "pagepeel" in der URL komplett entferne? :roll: