sql >> データベース >  >> RDS >> Mysql

このインサートを注射や操作からより安全で安全にするためのより良い方法は何ですか

    上記のコメントが示唆しているように、SQLインジェクションから身を守るためにクエリパラメータを使用する価値があります。

    あなたは悪意のあることをどのように行うことができるかの例を求めました。実際、悪意のあるものである必要はありません。アポストロフィを合法的に含む無実の文字列は、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. PostgreSQLレプリケーションのベストプラクティス-パート2

    2. 1つのテーブルから選択し、別のテーブルに挿入しますoraclesqlクエリ

    3. MySQLiPHPではオブジェクトを文字列に変換できません

    4. PHPは、MySQLデータベースにすでに存在する電子メールをチェックする方法を教えてください。