2012-12-21 43 views
6

मैं एक विश्वविद्यालय में फिनासिक सहायता कार्यालय के लिए एक स्कूल प्रोजेक्ट पर काम कर रहा हूं। परियोजना उत्पादन में है और इसमें से अधिकांश ने यहां और वहां कुछ छोटे बदलावों के अलावा किया है। सर्दियों के ब्रेक (अब) पर मेरी मुख्य चिंता सुरक्षा है और मेरी क्षमताओं में से किसी भी उल्लंघन को रोक रही है। लोगों ने मुझे तैयार वक्तव्य में आगे बढ़ने के लिए कहा है। डेटा को सम्मिलित करने के अलावा मैं उन्हें काफी हद तक समझता हूं।तैयार वक्तव्यों को समझना - PHP

मेरे पास दो रूप हैं: फॉर्म में लॉगिन और छात्र लॉगिन फॉर्म। छात्र लॉगिन फॉर्म प्रवेश करता है कि एक छात्र कार्यालय में क्यों आ रहा है। उस फॉर्म को तब सबमिट किया जाता है और उस डेटा को बाद में एक तालिका द्वारा पुनर्प्राप्त किया जाता है जो सलाहकारों को दिखाता है कि छात्र क्या देखने की प्रतीक्षा कर रहे हैं।

मेरे समस्या यह है कि प्रत्येक छात्र जो वित्तीय सहायता कार्यालय में चलता है उसके अपने अद्वितीय समस्या (ज्यादातर समय) तो अब क्या मुझे confuses है:

मैं आगे और पूर्व में सोचने के लिए की जरूरत है सम्मिलित प्रश्न बनाएं या वहां "गतिशील" क्वेरी होने का कोई तरीका है क्योंकि छात्र टिप्पणी बॉक्स है और इसके लिए यह पूरी तरह अद्वितीय होगा, इसलिए मैं इसके लिए एक क्वेरी कैसे तैयार कर पाऊंगा?

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

और जैसा कि मुझे ऐसा करने के लिए कहा गया है, इस तरह मुझे एसक्यूएल-इंजेक्शन के लिए प्रवण छोड़ देता है।

किसी भी मदद की बहुत सराहना की जाएगी। धन्यवाद।

+0

स्पष्ट रूप से तैयार कथन गतिशील हो सकते हैं। आपने इसे अभी पढ़ा है: http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers और यह – gd1

+0

है पेस्टबिन लोड होने लगते नहीं हैं। क्या आप अपने प्रश्न में प्रासंगिक कोड रख सकते हैं? –

+0

@ माइकबेंट: मेरे लिए भार। हालांकि, यह एक शास्त्रीय mysql_query() दृष्टिकोण है जो एसक्यूएल-इंजेक्शन के लिए प्रवण है :) – 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."); 
} 

मैं उत्पादन के लिए एक लॉग करने के लिए एसक्यूएल त्रुटि पसंद करते हैं, और उपयोगकर्ता है कि उन्हें कोड के विवरण के साथ भ्रमित नहीं करता है के लिए एक अलग त्रुटि दिखा।

+0

तो मैसेक और आपका कोड प्रत्येक टिप्पणी के लिए "टिप्पणियां" बॉक्स अद्वितीय होने की अनुमति देगा और यह एसक्यूएल-इंजेक्शन जैसे हमलों को रोक देगा? मैंने इन दोनों उदाहरणों को ट्यूटोरियल्स पर देखा है, मुझे अभी समझ में नहीं आया कि क्या आपने दोनों को निर्धारित किया है जो मेरे डेटाबेस पर हमलों के खिलाफ काम करेगा। क्या मेरे द्वारा इसे सही से पढ़ा जा रहा है? – RaGe10940

+0

@ बिलकर्विन, मुझे कहना है कि मुझे आपकी एक पोस्ट में विस्तार करने के लिए सम्मानित किया गया है। आप कैसे सुनिश्चित करते हैं कि पैराम उचित प्रकार से बंधे हों? –

+0

@ maček, MySQL बाध्य पैरामीटर के लिए PHP प्रकारों की परवाह नहीं करता है, इसलिए इससे कोई फर्क नहीं पड़ता कि आप पीडीओ पैरा प्रकार के लिए क्या निर्दिष्ट करते हैं। Mysqldnd ड्राइवर स्केलर प्रकारों से अलग-अलग LONGBLOB को संभालता है, लेकिन पीडीओ को वैसे भी LONGBLOB के लिए कोई समर्थन नहीं है। –

6

एक बार जब आप PHP's PDO को पढ़ने आप @ Macek से जवाब पर इस

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