अच्छा नहीं, कोई नहीं है!
तकनीकी रूप से PDO::quote()
है
लेकिन यह शायद ही कभी उपयोग किया जाता है और <के बराबर नहीं है। मजबूत>mysql_real_escape_string()
यह सही है! यदि आप पहले से ही पीडीओ का सही तरीके से उपयोग कर रहे हैं, जैसा कि तैयार विवरण का उपयोग करके प्रलेखित किया गया है। , तो यह आपको MySQL इंजेक्शन से बचाएगा।
# Example:
नीचे सुरक्षित . का एक उदाहरण दिया गया है तैयार बयानों (पीडीओ) का उपयोग कर डेटाबेस क्वेरी
try {
// first connect to database with the PDO object.
$db = new \PDO("mysql:host=localhost;dbname=xxx;charset=utf8", "xxx", "xxx", [
PDO::ATTR_EMULATE_PREPARES => false,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);
} catch(\PDOException $e){
// if connection fails, show PDO error.
echo "Error connecting to mysql: " . $e->getMessage();
}
और, अब यह मानते हुए कि कनेक्शन स्थापित हो गया है, आप अपनी क्वेरी को इस तरह निष्पादित कर सकते हैं।
if($_POST && isset($_POST['color'])){
// preparing a statement
$stmt = $db->prepare("SELECT id, name, color FROM Cars WHERE color = ?");
// execute/run the statement.
$stmt->execute(array($_POST['color']));
// fetch the result.
$cars = $stmt->fetchAll(\PDO::FETCH_ASSOC);
var_dump($cars);
}
अब, जैसा कि आप शायद बता सकते हैं, मैंने $_POST["color"]
के मूल्य से बचने/स्वच्छता के लिए कुछ भी उपयोग नहीं किया है . और यह कोड पीडीओ और तैयार बयानों की शक्ति के लिए myql-इंजेक्शन धन्यवाद से सुरक्षित है।
यह ध्यान देने योग्य है कि आपको charset=utf8
. पास करना चाहिए विशेषता के रूप में, आपके DSN
. में जैसा कि ऊपर देखा गया है, सुरक्षा कारणों से, और हमेशा पीडीओ को अपवादों के रूप में त्रुटियों को दिखाने के लिए सक्षम करें।
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
इसलिए आपके डेटाबेस प्रश्नों की त्रुटियां आपकी निर्देशिका संरचना, डेटाबेस उपयोगकर्ता नाम आदि जैसे संवेदनशील डेटा को प्रकट नहीं करेंगी।
अंतिम लेकिन कम से कम, ऐसे क्षण हैं जब आपको पीडीओ 100% पर भरोसा नहीं करना चाहिए, और एसक्यूएल इंजेक्शन को रोकने के लिए कुछ अतिरिक्त उपाय करने के लिए बाध्य होंगे, उन मामलों में से एक है, यदि आप MySQL के पुराने संस्करणों का उपयोग कर रहे हैं [ mysql =< 5.3.6 ]
जैसा कि में वर्णित है यह उत्तर
लेकिन, जैसा कि ऊपर दिखाया गया है, तैयार किए गए कथनों का उपयोग करना mysql_
से शुरू होने वाले किसी भी फ़ंक्शन का उपयोग करने की तुलना में हमेशा सुरक्षित रहेगा।
अच्छा पढ़ा