2012-12-21 5 views
6

私は大学の財政援助事務所の学校プロジェクトに取り組んでいます。プロジェクトは生産中であり、そのほとんどはこことそこで少し微調整から離れて行われます。冬休み(現在)に対する私の主な関心事は、セキュリティであり、あらゆる違反を私の能力の最大限に守ることです。人々はPrepared Statementsに手を差し伸べるように私に言いました。私はデータを挿入することを除いて、それらをよく理解しています。準備文の理解 - PHP

私には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インジェクションになりやすいと言われています。

ご協力いただければ幸いです。ありがとうございました。

+0

明らかに準備されたステートメントは、動的である可能性があります。あなたはちょうどこれを読む:http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers それはそれです – gd1

+0

ペーストビンはロードされていないようです。あなたはあなたの質問に適切なコードを置くことができますか? –

+0

@MikeBrant:私のために読み込みます。しかし、それは古典的なmysql_query()アプローチでSQLインジェクションを起こしやすくなります:) – gd1

答えて

5

ビルのようなあなたのコードを書き換えることができ、ここで同じことを行うための代替方法です。私はこの簡単に見つける:

$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)"); 

    $params = array_intersect_key($_POST, array_flip(array('anum', 'first', 'last', 'why', 'comments'))); 
    $query->execute($params); 
} 
catch (PDOException $e) { 
    error_log($e->getMessage()); 
    die("An error occurred, contact the site administrator."); 
} 

私がログにSQLエラー出力に好む、とコードの詳細とそれらを混同していないユーザーに別のエラーが表示されます。

+0

macekとあなたのコードでは、「コメント」ボックスを学生ごとに一意にすることができ、SQLインジェクションなどの攻撃を防ぐことができますか?私はチュートリアルでこれらの例の両方を見てきましたが、あなたの両者が私のデータベースへの攻撃に対して何をしているのかを理解することができませんでした。私はこの権利を読んでいますか? – RaGe10940

+0

@BillKarwin、私はあなたが私の記事の1つを展開することを光栄に思うと言わなければならない。 paramsが適切な型にバインドされていることをどうやって確認しますか? –

+0

@mačekでは、MySQLはバインドされたパラメータのPHP型を気にしません。したがって、PDOのparam型に指定する内容は関係ありません。 mysqldndドライバはスカラー型とは違ってLONGBLOBを扱いますが、PDOはとにかにLONGBLOBをサポートしていません。 –

6

あなたはPHP's 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()); 
}