SQLInjection vermeiden bei User Suche Input

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
 
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.
 
Wie soll das gehen? kann ich ein

SELECT column FROM table HAVING ( :param )

von machen wobei dann in param ein ellenlanger String drin steht?
 
SQL:
SELECT column
FROM table
HAVING (
    column_1 LIKE :param
    OR  column_2 LIKE :param
    OR  column_3 LIKE :param
)
 
Zuletzt bearbeitet:
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
 
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.
 
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
 
Passende Stellenanzeigen aus deiner Region:

Oben