sql >> Databáze >  >> RDS >> Mysql

Jaký je lepší způsob, jak učinit tuto vložku bezpečnější a chráněnou před vstřikováním a manipulací

Jak naznačují výše uvedené komentáře, vyplatí se používat parametry dotazu, abyste se ochránili před SQL injection.

Ptali jste se na příklad toho, jak lze udělat něco škodlivého. Ve skutečnosti to ani nemusí být zlomyslné. Jakýkoli nevinný řetězec, který legitimně obsahuje apostrof, by mohl narušit váš SQL dotaz. Škodlivý SQL injection využívá této slabosti.

Slabost je vyřešena udržováním dynamických hodnot oddělených od vašeho dotazu SQL, dokud není dotaz analyzován. V řetězci SQL používáme zástupné symboly parametru dotazu a poté použijeme prepare() analyzovat jej a poté zkombinovat hodnoty při execute() připravený dotaz. Tímto způsobem zůstane v bezpečí.

Zde je návod, jak bych napsal vaši funkci. Předpokládám, že používám CHOP který podporuje pojmenované parametry dotazu. Doporučuji používat místo Mysqli PDO.

function updateProfile( $vars, $userId ) {
    $db = new Database();
    $safeArray = [
        "gradYear",
        "emailAddress",
        "token",
        "iosToken",
        "country",
        "birthYear",
        "userDescription",
    ];
    // Filter $vars to include only keys that exist in $safeArray.
    $data = array_intersect_keys($vars, array_flip($safeArray));

    // This might result in an empty array if none of the $vars keys were valid.
    if (count($data) == 0) {
        trigger_error("Error: no valid columns named in: ".print_r($vars, true));
        $response = ["response" => 400, "title" => "no valid fields found"];
        return $response;
    }
    
    // Build list of update assignments for SET clause using query parameters.
    // Remember to use back-ticks around column names, in case one conflicts with an SQL reserved keyword.
    $updateAssignments = array_map(function($column) { return "`$column` = :$column"; }, array_keys($data));
    $updateString = implode(",", $updateAssignments);

    // Add parameter for WHERE clause to $data. 
    // This must be added after $data is used to build the update assignments.
    $data["userIdWhere"] = $userId;
    
    $sqlStatement = "update users set $updateString where userId = :userIdWhere";

    $stmt = $db->prepare($sqlStatement);
    if ($stmt === false) {
        $err = $db->errorInfo();
        trigger_error("Error: {$err[2]} preparing SQL query: $sqlStatement");
        $response = ["response" => 500, "title" => "database error, please report it to the site administrator"];
        return $response;
    }
    
    $ok = $stmt->execute($data);
    if ($ok === false) {
        $err = $stmt->errorInfo();
        trigger_error("Error: {$err[2]} executing SQL query: $sqlStatement");
        $response = ["response" => 500, "title" => "database error, please report it to the site administrator"];
        return $response;
    }

    $response = ["response" => 200, "title" => "update successful"];
    return $response;
}


  1. Kaskádová kopie řádků v sql

  2. Dotaz MySQL Not IN náhle přestal vracet výsledky

  3. MySQL:jak provést fulltextové vyhledávání ve více tabulkách

  4. Kartézské součiny a výběry v klauzuli od