6

私は大学の財政支援事務所の学校プロジェクトに取り組んでいます。プロジェクトは実稼働中で、あちこちでいくつかの小さな調整を除いて、ほとんどの作業が完了しています。冬休み中(現在)の私の主な関心事は、セキュリティと、私の能力を最大限に発揮して侵害を防ぐことです. プリペアド ステートメントに移行するよう人々に言われました。データの挿入を除いて、ある程度理解しています。

ログインフォームと学生ログインフォームの2つのフォームがあります。学生ログインフォームは、学生がオフィスに来る理由を入力します。次にそのフォームが送信され、そのデータは後でカウンセラーにどの学生が何を待っているかを示すテーブルによって取得されます。

私の問題は、財政援助事務所に足を踏み入れた各学生は(ほとんどの場合)独自の問題を抱えているため、今私を混乱させているのは次のとおりです。

事前に考えて挿入クエリを事前に作成する必要がありますか、または「動的」クエリを作成する方法はありますか?学生のコメント ボックスがあり、そのためには完全に一意になるため、どのように作成できますか?そのためのクエリ?

<?php
define('DB_Name', 'dbtest');
define('DB_User', 'root');
define('DB_Password', 'testdbpass');
define('DB_Host', 'localhost');

$link = mysql_connect(DB_Host, DB_User, DB_Password);

if (!$link) {
  die ('Could Not Connect: ' . mysql_error ());
}

$db_selected = mysql_select_db(DB_Name, $link);

if (!db_selected) {
  die('Can Not Use ' . DB_name . ': ' . mysql_error());
}

$value1 = $_POST ['anum'];
$value2 = $_POST ['first'];
$value3 = $_POST ['last'];
$value4 = $_POST ['why'];
$value5 = $_POST ['comments'];

$sql = "INSERT INTO `dbfinaid` (anum, first, last, why, comments) VALUES ('$value1', '$value2', '$value3', '$value4', '$value5')";

if (!mysql_query($sql)) {
  die('Error : ' . mysql_error());
}

mysql_close();

そして、そのようにすると、SQLインジェクションに陥りやすくなると言われています。

どんな助けでも大歓迎です。ありがとうございました。

4

2 に答える 2

6

PHPのPDOを読んだら、次のようにコードを書き直すことができます

$dbh = new PDO('mysql:host=localhost;dbname=dbtest', $user, $pass);

try {
  $query = $dbh->prepare("INSERT INTO `dbfinaid` (anum, first, last, why, comments) VALUES (:anum, :first, :last, :why, :comments)");

  $query->bindParam(':anum',     $_POST['anum'],     PDO::PARAM_INT);
  $query->bindParam(':first',    $_POST['first'],    PDO::PARAM_STR);
  $query->bindParam(':last',     $_POST['last'],     PDO::PARAM_STR);
  $query->bindParam(':why',      $_POST['why'],      PDO::PARAM_STR);
  $query->bindParam(':comments', $_POST['comments'], PDO::PARAM_STR);

  $query->execute();
}
catch (PDOException $e) {
  die("error occured:" . $e->getMessage());
}
于 2012-12-21T17:16:39.230 に答える