preg_match() nicht ideal...


tklustig

Erfahrenes Mitglied
#1
Hallo Leute,
ich möchte gerne überprüfen, ob ein bestimmter Teilstring in einem String enthalten ist. Allerdings interessiert mich dabei nur eine ganz bestimmte Position. Folgendem Code...
PHP:
delimter1='/'.$_REQUEST["rad"].'/';
$delimter2='/'.$_REQUEST["anzahlItems"].'/';
foreach($query1 as $daten){
    if(preg_match($delimter1,$daten["datum"])&& preg_match($delimter2,$daten["datum"])){
        echo $daten["datum"].' '.$daten["Temperatur_Celsius"].'<br>';
    }
}
liegen beispielsweise folgende Daten zu Grunde:
PHP:
$delimter1="/02/";
$delimter2="/2018/";
$daten["datum"]="05.02.2019";
Der Code liefert einen Treffer. Fein. Er liefert aber auch einen Treffer für
Code:
$daten["datum"]="02.05.2019";
Nicht fein. Ich möchte nur Treffer für den Monat haben. Wie muss ich die Kondition erweitern? Würde ein str_pos() Abhilfe schaffen? Wie ?? $daten["datum"] ist immer gleich aufgebaut!
 

tklustig

Erfahrenes Mitglied
#2
Habe das jetzt so gelöst:
PHP:
foreach($query1 as $daten){
    if(preg_match($delimter1,$daten["datum"])&& preg_match($delimter2,$daten["datum"])&&!startsWith($daten["datum"],$_REQUEST["anzahlItems"])){
        echo $daten["datum"].' '.$daten["Temperatur_Celsius"].'<br>';
    }
}

function startsWith($haystack, $needle)
{
     $length = strlen($needle);
     return (substr($haystack, 0, $length) === $needle);
}
 

ComFreek

Mod | @comfreek
Moderator
#3
Genau wie bei SQL Injections: Beliebige externe Eingaben in Regexes zu verwenden ist a) falsch und führt zu Bugs und b) eine Sicherheitslücke.

Der Grund ist derselbe: Du fügst Daten aus einem anderen Kontext (nämlich die Eingabe ist beliebiger Text) mit einfacher String Inteprolation in einen anderen Kontext (in einen Regex) ein. Ich wage zu behaupten: Das ist grundsätzlich immer falsch!

Konkret könnte ich hier für a) etwa / als Nutzereingabe wählen und du würdest einen PHP Error bekommen und für b) könnte ich einen Regex mit vielen greedy Quantoren nehmen, der zu einem DoS führt.

Lösung: Es gibt für Regex leider keine Prepared Statement, soweit ich weiß. (Warum eigentlich nicht? Das wäre das einzig Sinnvolle!) Da du hier anscheinend nur numerische Eingaben erwartest und numerische Werte in Regex keine besondere Bedeutung zukommen, könntest du einfach deine Eingaben zu numerischen Werten zwangskonvertieren.