sql >> Databasteknik >  >> RDS >> Mysql

Vad är ett bättre sätt att göra denna insats säkrare och säkrare från injektion och manipulation

Som kommentarerna ovan antyder är det värt att använda frågeparametrar för att skydda dig från SQL-injektion.

Du bad om ett exempel på hur något skadligt kunde göras. Faktum är att det inte ens behöver vara skadligt. Varje oskyldig sträng som legitimt innehåller en apostrof kan bryta din SQL-fråga. Skadlig SQL-injektion drar fördel av den svagheten.

Svagheten åtgärdas genom att hålla dynamiska värden åtskilda från din SQL-fråga tills efter att frågan har analyserats. Vi använder frågeparameterplatshållare i SQL-strängen och använder sedan prepare() för att analysera det, och efter det kombinera värdena när du execute() den förberedda frågan. På så sätt förblir det säkert.

Så här skulle jag skriva din funktion. Jag antar att jag använder PDO som stöder namngivna frågeparametrar. Jag rekommenderar att du använder PDO istället för 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. Inre medan loopen inte fungerar

  2. teckenuppsättning i MySQL

  3. Ansluter till mysql i xampp utan lösenord

  4. hur man blir paginerad välj på slick + postgresql