4

私はSQLインジェクションについて多くのことを読んでおり、それがどのように問題を引き起こす可能性があるかを理解しています(つまり、DROP TABLE _ _など)。しかし、私が従ったチュートリアルが実際にこれを防ぐ方法がわかりません. 私はちょうど PDO を学んでいて、それを理解していると思います。

このコードは SQL インジェクションから安全ですか? なぜですか?(これらの準備されたステートメントを使用すると、さらに多くの作業が必要になるため、時間を無駄にしているだけではないことを確認したいと思います。また、コードを改善できる場合はお知らせください! )

$conn = new PDO("mysql:host=$DB_HOST;dbname=$DB_DATABASE",$DB_USER,$DB_PASSWORD);

// Get the data
$firstname = $_POST["v_firstname"];
$lastname =  $_POST["v_lastname"];
$origincountry =  $_POST["v_origincountry"];
$citizenship = $_POST["v_citizenship"];
$gender = $_POST["v_gender"];
$dob = $_POST["v_dob"];
$language = $_POST["v_language"];
$landing = $_POST["v_landing"];
$email = $_POST["v_email"];
$phone = $_POST["v_phone"];
$cellphone = $_POST["v_cellphone"];
$caddress = $_POST["v_caddress"];
$paddress = $_POST["v_paddress"];
$school = $_POST["v_school"];
$grade = $_POST["v_grade"];
$smoker = $_POST["v_smoker"];
$referred = $_POST["v_referred"];
$notes = $_POST["v_notes"];


//Insert Data
$sql = "INSERT INTO clients (firstname, lastname, origincountry, citizenship, gender, dob, language, landing, email, phone, cellphone, caddress, paddress, school, grade, smoker, referred, notes) 
        VALUES (:firstname, :lastname, :origincountry, :citizenship, :gender, :dob, :language, :landing, :email, :phone, :cellphone, :caddress, :paddress, :school, :grade, :smoker, :referred, :notes)";
$q = $conn->prepare($sql);
$q->execute(array(':firstname'=>$firstname,
                  ':lastname'=>$lastname,
                  ':origincountry'=>$origincountry,
                  ':citizenship'=>$citizenship,
                  ':gender'=>$gender,
                  ':dob'=>$dob,
                  ':language'=>$language,
                  ':landing'=>$landing,
                  ':email'=>$email,
                  ':phone'=>$phone,
                  ':cellphone'=>$cellphone,
                  ':caddress'=>$caddress,
                  ':paddress'=>$paddress,
                  ':school'=>$school,
                  ':grade'=>$grade,
                  ':smoker'=>$smoker,
                  ':referred'=>$referred,
                  ':notes'=>$notes));
4

3 に答える 3

4

はい、コードは安全です。PDO は適切にエスケープし、パラメーターの配列を引用します。

于 2012-09-02T05:48:26.570 に答える
1

パラメータ化されたクエリを使用しているため、コードはSQLインジェクションから安全です。これは、基本的に、クエリが構築されてSQLサーバーに送信されるとエスケープされることを意味し、phpの組み込み関数を使用して同じことが達成できますmysql_real_escape_string()

次のビデオは、OWASP からの SQL インジェクションに関する優れた情報ビデオです: SQL インジェクション

于 2012-09-02T07:30:52.070 に答える
0

ルールは次のとおりです。手動でSQLを構築しないでください。次のようなことを行います。

sqlStatement = 'select field1, field2, field3 from mytable where index = '' + myVariable + ''

アプリでユーザーがデータを myVariable に渡すことを許可している場合、ユーザーは完全な SQL コマンドを db サーバーに送信する可能性があるため、上記は危険です。

上記のように、パラメーター化されたクエリを使用することが解決策です。

于 2012-09-02T06:00:40.210 に答える