क्वेरी पैरामीटर का उपयोग करने के रूप में बचना SQL इंजेक्शन रक्षा में उतना ही प्रभावी है।
यदि आप उन्हें लगातार करने में विफल रहते हैं तो दोनों विधियां भी कम प्रभावी होती हैं।
दोनों विधियां केवल व्यक्तिगत मानों . की सुरक्षा के लिए उपयोगी हैं एसक्यूएल अभिव्यक्तियों में। वे क्वेरी के अन्य गतिशील भागों का समर्थन नहीं करते हैं। उदाहरण के लिए, यदि आप उपयोगकर्ता द्वारा निर्दिष्ट कॉलम द्वारा ऑर्डर करना चाहते हैं। न तो क्वेरी पैरामीटर और न ही एस्केपिंग फ़ंक्शन इसे संभालते हैं।
तो मूल रूप से, यह शैली और व्यक्तिगत पसंद का मामला है।
मुझे क्वेरी पैरामीटर पसंद हैं क्योंकि मुझे ऐसा लगता है:
$sql = "INSERT INTO mytable (columna, columnb, columnc) VALUES (?, ?, ?)";
$stmt = $pdo->prepare($sql);
$stmt->execute([$a, $b, $c]);
इससे कहीं अधिक स्पष्ट है:
$sql = "INSERT INTO mytable (columna, columnb, columnc) VALUES ('".mysqli_real_escape_string($conn, $a)."', '".mysqli_real_escape_string($conn, $b)."', '".mysqli_real_escape_string($conn, $c)."')";
mysqli_query($conn, $sql);
आप गंभीरता से यह नहीं कह सकते हैं कि उन सभी खुले-उद्धरणों/बंद-उद्धरणों और .
के साथ झुकाव क्वेरी पैरामीटर के साथ तैयार () का उपयोग करने की तुलना में स्ट्रिंग संयोजन आसान है।
एक काल्पनिक query()
. के बारे में अपनी टिप्पणी दोबारा दें पैरामीटर के साथ कार्य करें।
सबसे पहले, यह जरूरी नहीं है। सुरक्षित कोड लिखने के लिए तैयार () और निष्पादित () का एक साथ उपयोग करना एक छोटी सी कीमत है, और इसे एक ही फ़ंक्शन के साथ करने पर जोर देकर, आप बस आलसी लगते हैं। मुझे लगता है कि आप उन कार्यों के वापसी मूल्य की जांच नहीं करते हैं जो false
return लौटाते हैं त्रुटि पर, या तो?
इसके लायक क्या है, दोनों को करने के लिए एक रैपर फ़ंक्शन लिखना आसान होगा, क्योंकि PHP परोक्ष रूप से varargs का समर्थन करता है।
function myquery() {
global $pdo;
$params = func_get_args();
$sql = array_shift($params);
$stmt = $pdo->prepare($sql);
$stmt->execute($params);
return $stmt; // so we can fetch(), etc.
}