2012-12-21 15 views
6

Pracuję nad szkolnym projektem biura pomocy finansowej na uniwersytecie. Projekt jest w fazie produkcji i większość z nich jest wykonywana poza kilkoma drobnymi poprawkami tu i tam. Moją główną troską w związku z przerwą zimową (teraz) jest bezpieczeństwo i zapobieganie wszelkim naruszeniom moich najlepszych umiejętności. Ludzie powiedzieli mi, abym kierował się do Przygotowanych oświadczeń. Rozumiem je w dużym stopniu, z wyjątkiem wstawiania danych.Zrozumieć gotowe instrukcje - PHP

Mam dwie formy: login w formularzu i formularz logowania studenta. Formularz logowania do studenta zawiera informacje o tym, dlaczego uczeń przyjeżdża do biura. Formularz ten jest następnie przesyłany i dane są później pobierane przez tabelę, która pokazuje doradcom, jakie uczniowie oczekują na obejrzenie.

Moim problemem jest to że każdy student, który wchodzi do biura pomocy finansowej ma swój własny, unikalny problem (przez większość czasu), więc teraz co dezorientuje mnie jest:

Czy muszę myśleć z wyprzedzeniem i pre- tworzyć kwerendy wstawiania lub czy istnieje sposób na zapytanie dynamiczne, ponieważ istnieje pole komentarzy dla ucznia i do tego będzie ono całkowicie unikalne, więc w jaki sposób będę mógł utworzyć dla niego zapytanie?

<?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(); 

i jak mi powiedziano, robienie tego w ten sposób pozostawia mnie podatną na iniekcje SQL.

Każda pomoc będzie bardzo ceniona. Dziękuję Ci.

+0

Oczywiście przygotowane instrukcje mogą być dynamiczne. Właśnie przeczytałeś to: http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers I to jest to – gd1

+0

Pasterz prawdopodobnie nie ładuje się. Czy możesz umieścić odpowiedni kod w swoim pytaniu? –

+0

@MikeBrant: ładuje dla mnie. Jednak jest to klasyczne podejście mysql_query() podatne na SQL-Injections :) – gd1

Odpowiedz

5

budynek na odpowiedź od @ Macek oto alternatywny sposób robi to samo. Uważam to łatwiejsze:

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

wolę wyjścia błędu SQL do dziennika i pokazać inny błąd dla użytkownika, który nie mylić ich ze szczegółami kodu.

+0

, więc macek i twój kod pozwolą, aby pole "komentarzy" było niepowtarzalne dla każdego ucznia i zapobiegnie atakom takim jak iniekcje SQL? Widziałem oba te przykłady w samouczkach, których nie rozumiałem, jeśli robienie tego, co obaj przepisaliście, będzie działało przeciwko atakom na moją bazę danych. Czy czytam to dobrze? – RaGe10940

+0

@BillKarwin, muszę powiedzieć, że jestem zaszczycony, że mogę rozwinąć jeden z moich postów. W jaki sposób upewnisz się, że parametry zostają powiązane z odpowiednimi typami? –

+0

@ maček, MySQL nie dba o typy PHP dla powiązanych parametrów, więc nie ma znaczenia, co określasz dla typu parametru PDO. Sterownik mysqldnd obsługuje LONGBLOB inaczej niż typy skalarne, ale PDO i tak nie ma żadnej obsługi LONGBLOB. –

6

Po przeczytać na PHP's PDO można przepisać kod jak ten

$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()); 
}