SQLInjection vermeiden bei User Suche Input

Thallius

Top Contributor
Hallo,

ich habe eine WebApp welche per Ajax ein PHP Script aufruft um Daten aus einer Tabelle zu lesen. Nun soll es möglich sein, dass der Benutzer in einem Textfeld einen beliebigen Suchstring eingeben kann nach dem in jeder Spalte der Tabelle gesucht wird. Pronzipiell kein Problem aber dadurch bin ich dann offen für SQLInjection denn ich wüßte nicht, wie ich den HAVING String aufbauen soll ohne das dort alles mögliche drin stehen kann.

Also mal ganz einfach als Beispiel

Code:
$sWhere = "";
if ( isset($_POST['search']) && $_POST['search'] != "" )
{
    $sWhere = "HAVING (";
    for ( $i=0 ; $i<count($columns) ; $i++ )
    {
        $sWhere .= "`".$columns[$i]."` LIKE '%". $_POST['search']."%' OR ";
    }
    $sWhere = substr_replace( $sWhere, "", -3 );
    $sWhere .= ')';
}

wäre ja eine perfekte Lücke oder? Aber ich wüßte jetzt auch nicht wie man das anders machen kann.

Gruß

Claus
 

mrBrown

Super-Moderator
Mitarbeiter
Einfach Prepared Statements nutzen?


Edit:
String kannst du genau so zusammen bauen, nur statt dem echtem Suchstring named Parameter nutzen. Dann 'n prepared Statement draus machen und Suchstring übergeben.
 

Thallius

Top Contributor
Wie soll das gehen? kann ich ein

SELECT column FROM table HAVING ( :param )

von machen wobei dann in param ein ellenlanger String drin steht?
 

mrBrown

Super-Moderator
Mitarbeiter
SQL:
SELECT column
FROM table
HAVING (
    column_1 LIKE :param
    OR  column_2 LIKE :param
    OR  column_3 LIKE :param
)
 
Zuletzt bearbeitet:

Thallius

Top Contributor
Ok,

ganz so einfach ist es dann nicht aber es geht indem ich erst den String zusammen baue mit

Code:
$sWhere = "";
if (isset($_GET['sSearch']) && $_GET['sSearch'] != "")
{
    $sWhere = " HAVING (";
    for ($i = 0; $i < count($aColumns); $i++)
    {
        $sWhere .=  $aColumns[$i] ." LIKE :param".$i." OR ";
    }
    $sWhere = substr_replace($sWhere, "", -3);
    $sWhere .= ') ';
}

und dann entsprechend beim query die parameter auffülle

Code:
$sql = "SELECT column
        FROM table
        $sWhere";
$stmt = $con->prepare($sql);
if (isset($_GET['sSearch']) && $_GET['sSearch'] != "")
{
    for ($i = 0; $i < count($aColumns); $i++)
    {
        $stmt->bindValue("param".$i, "%" . $_GET['sSearch'] . "%" , PDO::PARAM_STR);
    }
}
$stmt->execute();

Danke für den Denkanstoß

Claus
 

mrBrown

Super-Moderator
Mitarbeiter
Wie soll das gehen? kann ich ein

SELECT column FROM table HAVING ( :param )

von machen wobei dann in param ein ellenlanger String drin steht?
Das Statement muss schon ein valides Statement sein, und der Sinn der Parameter ist ja grad, dass die nicht interpretiert werden - klappt also aus zweierlei Gründen nicht.
ganz so einfach ist es dann nicht aber es geht indem ich erst den String zusammen baue mit
das war das, was ich mit „String kannst du genau so zusammen bauen, nur statt dem echtem Suchstring named Parameter nutzen“ meinte ;)

Das untere war nur ein Beispiel, wie das Statement am Ende aussehen muss.

Die benannten Parameter können mWn auch alle gleich heißen, denen ne Nummer zu geben dürfte überflüssig sein, sind ja alle der gleiche Wert.
 

Thallius

Top Contributor
Ja das mit having hat schon seine Richtigkeit. Das der Parameter immer gleich heißen darf ist ne gute Idee. Da bin ich nicht drauf gekommen
 
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben