मैं हमेशा mysql_connect
का सीधा संबंध, mysql_pconnect
किया है:की जगह mysql_ * पीडीओ और तैयार बयान के साथ काम करता है
$db = mysql_pconnect('*host*', '*user*', '*pass*');
if (!$db) {
echo("<strong>Error:</strong> Could not connect to the database!");
exit;
}
mysql_select_db('*database*');
हालांकि इस का उपयोग करते हुए मैं हमेशा सरल विधि का उपयोग किया है एक करने से पहले किसी भी डेटा से बचने के लिए क्वेरी, कि INSERT
, SELECT
, UPDATE
या DELETE
का उपयोग कर mysql_real_escape_string
$name = $_POST['name'];
$name = mysql_real_escape_string($name);
$sql = mysql_query("SELECT * FROM `users` WHERE (`name` = '$name')") or die(mysql_error());
अब मैं समझता हूँ यह सुरक्षित है, एक हद तक से होना है कि क्या!
यह खतरनाक पात्रों से बच निकला; हालांकि, यह अभी भी अन्य हमलों के लिए कमजोर है जिसमें सुरक्षित पात्र हो सकते हैं लेकिन डेटा प्रदर्शित करने या कुछ मामलों में, डेटा को दुर्भावनापूर्ण रूप से संशोधित करने या हटाने के लिए हानिकारक हो सकते हैं।
तो, मैंने थोड़ी सी खोज की और पीडीओ, माईएसक्लुली और तैयार बयानों के बारे में पता चला। हां, मुझे खेल के लिए देर हो सकती है लेकिन मैंने वहां कई सारे ट्यूटोरियल (टिजाग, डब्ल्यू 3 सी, ब्लॉग, Google सर्च) पढ़े हैं और एक भी ने इनका उल्लेख नहीं किया है। ऐसा लगता है कि क्यों, उपयोगकर्ता इनपुट से बचने के लिए वास्तव में सुरक्षित नहीं है और कम से कम कहने के लिए अच्छा अभ्यास नहीं है। हां, मुझे पता है कि आप इसे रोकने के लिए रेगेक्स का उपयोग कर सकते हैं, लेकिन फिर भी, मुझे पूरा यकीन है कि पर्याप्त नहीं है?
यह मेरी समझ है कि पीडीओ/तैयार कथन का उपयोग डेटाबेस इनपुट से डेटा को स्टोर और पुनर्प्राप्त करने का एक अधिक सुरक्षित तरीका है जब उपयोगकर्ता इनपुट द्वारा चर दिए जाते हैं। एकमात्र मुसीबत है, स्विच (विशेष रूप से मेरे कोडिंग/पिछले कोडिंग की आदतों में फंसने के बाद) थोड़ा मुश्किल है।
अभी मैं समझता हूँ कि पीडीओ उपयोग करते हुए मेरे डेटाबेस से कनेक्ट करने के लिए मैं अब
$hostname = '*host*';
$username = '*user*';
$password = '*pass*';
$database = '*database*'
$dbh = new PDO("mysql:host=$hostname;dbname=$database", $username, $password);
if ($dbh) {
echo 'Connected to database';
} else {
echo 'Could not connect to database';
}
का प्रयोग करेंगे, समारोह नाम अलग तो नहीं रह गया है मेरी mysql_query
, mysql_fetch_array
, mysql_num_rows
आदि काम करेगा कर रहे हैं। तो मुझे नए लोगों के भार को पढ़ने/याद रखना है, लेकिन यह वह जगह है जहां मैं भ्रमित हो रहा हूं।
यदि मैं साइन अप/पंजीकरण फॉर्म कहने से डेटा सम्मिलित करना चाहता हूं, तो मैं इसे करने के बारे में कैसे जाउंगा, लेकिन मुख्य रूप से मैं इसके बारे में सुरक्षित तरीके से कैसे जाऊं? मुझे लगता है कि यह वह जगह है जहां तैयार बयान आते हैं, लेकिन इनका उपयोग करके यह mysql_real_escape_string
जैसे कुछ उपयोग करने की आवश्यकता को खत्म करता है? मुझे पता है कि mysql_real_escape_string
आपको mysql_connect
/mysql_pconnect
के माध्यम से किसी डेटाबेस से कनेक्ट होने की आवश्यकता है, इसलिए अब हम इसका उपयोग नहीं कर रहे हैं या नहीं, यह फ़ंक्शन केवल एक त्रुटि उत्पन्न करेगा?
मैंने पीडीओ विधि से संपर्क करने के विभिन्न तरीकों को भी देखा है, उदाहरण के लिए, मैंने :variable
और ?
देखा है जो मुझे लगता है कि प्लेसहोल्डर के रूप में जाना जाता है (क्षमा करें यदि यह गलत है)।
लेकिन मुझे लगता है यह मोटे तौर पर क्या एक डेटाबेस से उपयोगकर्ता को लाने के लिए
$user_id = $_GET['id']; // For example from a URL query string
$stmt = $dbh->prepare("SELECT * FROM `users` WHERE `id` = :user_id");
$stmt->bindParam(':user_id', $user_id, PDO::PARAM_INT);
किया जाना चाहिए का विचार है लेकिन तब मैं कुछ चीज़ें पर अटक कर रहा हूँ, अगर चर एक नंबर नहीं था और पाठ की एक स्ट्रिंग थी, अगर मुझे गलत नहीं लगता है तो आपको PDO:PARAM_STR
के बाद लंबाई दी जानी चाहिए। लेकिन यदि आप उपयोगकर्ता द्वारा दिए गए डेटा से दिए गए मान पर निश्चित नहीं हैं, तो आप एक निर्धारित लंबाई कैसे दे सकते हैं, यह हर बार भिन्न हो सकता है? किसी भी तरह से, जहां तक मुझे डेटा प्रदर्शित करने के बारे में पता है, तो
$stmt->execute();
$result = $stmt->fetchAll();
// Either
foreach($result as $row) {
echo $row['user_id'].'<br />';
echo $row['user_name'].'<br />';
echo $row['user_email'];
}
// Or
foreach($result as $row) {
$user_id = $row['user_id'];
$user_name = $row['user_name'];
$user_email = $row['user_email'];
}
echo("".$user_id."<br />".$user_name."<br />".$user_email."");
अब, क्या यह सब सुरक्षित है?
अगर मैं सही हूँ, डालने डेटा उदाहरण के लिए ही होगा:,
$username = $_POST['username'];
$email = $_POST['email'];
$stmt = $dbh->prepare("INSERT INTO `users` (username, email)
VALUES (:username, :email)");
$stmt->bindParam(':username, $username, PDO::PARAM_STR, ?_LENGTH_?);
$stmt->bindParam(':email, $email, PDO::PARAM_STR, ?_LENGTH_?);
$stmt->execute();
चाहेंगे
है कि काम और वह भी सुरक्षित है? यदि यह सही है तो मैंने ?_LENGTH_?
के लिए क्या मूल्य डाला होगा? क्या मुझे यह सब पूरी तरह से गलत मिला है?
अद्यतन
उत्तर मैं अब तक बहुत मददगार रहे हैं मिला है, तुम लोगों के लिए पर्याप्त धन्यवाद नहीं कर सकता! प्रत्येक व्यक्ति को मेरी आँखें थोड़ा अलग करने के लिए +1 मिल गया है। शीर्ष जवाब चुनना मुश्किल है, लेकिन मुझे लगता है कि कर्नल श्रापनेल इसका हकदार है क्योंकि सबकुछ काफी ढंका हुआ है, यहां तक कि कस्टम लाइब्रेरीज़ के साथ अन्य सरणी में भी जाना जो मुझे पता नहीं था!
लेकिन मैं कभी नहीं bindParam() या परम प्रकार या लंबाई से परेशान आप सभी को धन्यवाद :)
शायद 'उपयोगकर्ता नाम' और 'ईमेल' फ़ील्ड की लंबाई? उदाहरण के लिए। यदि उपयोगकर्ता नाम वर्चर (32) है, तो लंबाई पैरामीटर 32 होना चाहिए। – deejayy