Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

इस इंसर्ट को इंजेक्शन और हेरफेर से अधिक सुरक्षित और सुरक्षित बनाने का इससे बेहतर तरीका क्या हो सकता है

जैसा कि उपरोक्त टिप्पणियों से पता चलता है, एसक्यूएल इंजेक्शन से खुद को बचाने के लिए क्वेरी पैरामीटर का उपयोग करना उचित है।

आपने एक उदाहरण मांगा कि कैसे कुछ भी दुर्भावनापूर्ण किया जा सकता है। वास्तव में, इसे दुर्भावनापूर्ण होने की भी आवश्यकता नहीं है। कोई भी निर्दोष स्ट्रिंग जिसमें वैध रूप से एक एस्ट्रोफ़े होता है, आपकी SQL क्वेरी को तोड़ सकता है। दुर्भावनापूर्ण SQL इंजेक्शन उस कमजोरी का लाभ उठाता है।

क्वेरी को पार्स किए जाने तक डायनेमिक मानों को आपकी SQL क्वेरी से अलग रखकर कमजोरी को ठीक किया जाता है। हम SQL स्ट्रिंग में क्वेरी पैरामीटर प्लेसहोल्डर्स का उपयोग करते हैं, फिर prepare() . का उपयोग करते हैं इसे पार्स करने के लिए, और उसके बाद जब आप execute() तैयार क्वेरी। इस तरह यह सुरक्षित रहता है।

यहां बताया गया है कि मैं आपका फंक्शन कैसे लिखूंगा। मैं मान रहा हूं कि PDO का इस्तेमाल कर रहे हैं जो नामित क्वेरी पैरामीटर का समर्थन करता है। मैं 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. अलग-अलग php ORDER BY स्टेटमेंट के लिए एक नया पेज बनाएं?

  2. php में mysql के प्रक्रियात्मक और वस्तु-उन्मुख कार्यान्वयन में अंतर?

  3. MySQL को मैं नहीं मानता?

  4. मैं एक स्थानीय .SQL फ़ाइल को MySQL में कैसे लोड करूं?

  5. नोड.जेएस के लिए कौन से MySQL ड्राइवर उपलब्ध हैं?