Seperti yang disarankan oleh komentar di atas, ada baiknya menggunakan parameter kueri untuk melindungi diri Anda dari injeksi SQL.
Anda meminta contoh bagaimana sesuatu yang berbahaya dapat dilakukan. Sebenarnya, itu bahkan tidak perlu jahat. Setiap string yang tidak bersalah yang secara sah berisi tanda kutip dapat merusak kueri SQL Anda. Injeksi SQL berbahaya memanfaatkan kelemahan itu.
Kelemahan diperbaiki dengan menjaga nilai dinamis terpisah dari kueri SQL Anda hingga kueri diuraikan. Kami menggunakan placeholder parameter kueri dalam string SQL, lalu gunakan prepare()
untuk menguraikannya, dan setelah itu gabungkan nilai saat Anda execute()
kueri yang telah disiapkan. Dengan begitu, tetap aman.
Inilah cara saya menulis fungsi Anda. Saya berasumsi menggunakan PDO yang mendukung parameter kueri bernama. Saya sarankan menggunakan PDO daripada 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;
}