sql >> Database >  >> RDS >> Mysql

Wat is een betere manier om dit inzetstuk veiliger te maken en te beschermen tegen injectie en manipulatie?

Zoals de opmerkingen hierboven suggereren, is het de moeite waard om queryparameters te gebruiken om jezelf te beschermen tegen SQL-injectie.

U vroeg om een ​​voorbeeld van hoe iets kwaadaardigs kan worden gedaan. In feite hoeft het niet eens kwaadaardig te zijn. Elke onschuldige tekenreeks die legitiem een ​​apostrof bevat, kan uw SQL-query breken. Kwaadaardige SQL-injectie maakt gebruik van die zwakte.

De zwakte wordt verholpen door dynamische waarden gescheiden te houden van uw SQL-query totdat de query is geparseerd. We gebruiken tijdelijke aanduidingen voor queryparameters in de SQL-tekenreeks en gebruiken vervolgens prepare() om het te ontleden en daarna de waarden te combineren wanneer u execute() de voorbereide vraag. Zo blijft het veilig.

Hier is hoe ik je functie zou schrijven. Ik neem aan dat ik BOB gebruik die benoemde queryparameters ondersteunt. Ik raad aan om PDO te gebruiken in plaats van Mysqli.

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. Hoe reset ik een reeks in Oracle?

  2. Oracle SQL plus hoe de opdracht in het SQL-bestand te beëindigen?

  3. SQL Query Doe mee in CodeIgniter

  4. Laravel:hoe voeg je waar-clausule toe met behulp van querybuilder?