एक प्रश्न भेजते समय मुझे बचने की क्या ज़रूरत है?

जब आप एक SQL क्वेरी निष्पादित करते हैं, तो आपको अपने तारों को साफ़ करना होगा या उपयोगकर्ता आपकी वेबसाइट पर दुर्भावनापूर्ण SQL निष्पादित कर सकते हैं।

मैं आमतौर पर सिर्फ एक समारोह escape_string (blah) है, जो:

  • डबल एस्केप ( \\ ) के साथ भाग निकलता है ( \ )।
  • एक से बचने वाले सिंगल कोट ( \ ') के साथ सिंगल कोट्स (' ) को प्रतिस्थापित करता है।

क्या यह पर्याप्त है? क्या मेरे कोड में कोई छेद है? क्या कोई पुस्तकालय है जो मेरे लिए जल्दी और भरोसेमंद कर सकता है?

मैं पर्ल, जावा और PHP में सुंदर समाधान देखना चाहता हूं।

0
जोड़ा संपादित
विचारों: 4
बैकस्लाश के प्रदर्शन में कुछ गलत हो गया होगा, लाइन डबल एस्केप (\) के साथ escapes() को बदलता है।
जोड़ा लेखक bart, स्रोत

10 उत्तर

मुझे यकीन नहीं है कि क्या MySQL पैरामीटर किए गए प्रश्नों का समर्थन करता है, यदि हां, तो आपको इस मार्ग पर जाने का प्रयास करना चाहिए। यह सुनिश्चित करेगा कि उपयोगकर्ता इनपुट कुछ भी दुर्भावनापूर्ण नहीं कर सकता है।

अन्यथा आपके द्वारा वर्णित कुछ "खराब" वर्ण अर्धविराम (;) और टिप्पणियां (- और / * * /) होगी।

0
जोड़ा

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

A great primer on PDO is included in the book The PHP Anthology 101 Essential Tips, Tricks & Hacks by Davey Shafik etc. 2nd Ed. Makes learning a breeze and is excellent as a reference. I don't even have to think about anything other than the actual SQL Query anymore.

0
जोड़ा

अधिकतम सुरक्षा, प्रदर्शन और शुद्धता के लिए तैयार बयान का उपयोग करें। PHP सहित विभिन्न भाषाओं में कई उदाहरणों के साथ ऐसा करने का तरीका यहां दिया गया है:

https://stackoverflow.com/questions/1973/ क्या-है-सबसे अच्छा तरह से करने के लिए से बचने-एसक्यूएल इंजेक्शन हमलों

0
जोड़ा

मैं टिप्पणियों से बच जाऊंगा (डबल डैश)

--
0
जोड़ा

PHP में, मैं इसका उपयोग कर रहा हूं और मैं इसके बारे में हर टिप्पणी की सराहना करता हूं:

function quote_smart($valeur) 
{ 
    if (get_magic_quotes_gpc()) 
        $valeur = stripslashes($valeur); 

    if (!is_numeric($valeur)) 
        $valeur = mysql_real_escape_string($valeur); 

    return $valeur; 
}


$IdS = quote_smart($_POST['theID']); 
$sql = " 
SELECT * FROM Students 
WHERE IdStudent={$IdS}; 
";

यदि कोई फ़ील्ड न हो तो एक और सत्यापन की आवश्यकता है:

$picture = NULL;
$theidyouwant = 7;
$Name = 'WOOD';


if(is_null($picture)) 
    $p = 'NULL'; 
else
    $p = "'".quote_smart($picture)."'"; 

$IdS = quote_smart($theidyouwant);

$requete = "SELECT * FROM Students
    WHERE IdStudent={$IdS} AND
    PictureStudent={$p} AND
    NameStudent='{$Name}';
    ";

That's it enjoy ! (hope the post will correctly send underscores and not _ ;)

0
जोड़ा

तैयार / पैरामीटरयुक्त प्रश्नों का प्रयोग करें!

0
जोड़ा

आप प्लेसहोल्डर के साथ तैयार बयानों का उपयोग बंद कर रहे हैं। क्या आप PHP का उपयोग कर रहे हैं, .NET ... किसी भी तरह से, तैयार कथन अधिक सुरक्षा प्रदान करेंगे, लेकिन मैं एक नमूना प्रदान कर सकता हूं।

0
जोड़ा

MySQL सी एपीआई का अपना mysql_escape_string() है। इसका उपयोग करना या इसके समकक्ष सर्वोत्तम होगा।

0
जोड़ा

कौन सी भाषा का उपयोग कर रहे हैं? ऐसा लगता है कि उनमें से सभी ने एसक्यूएल एस्केप फ़ंक्शंस में अंतर्निहित किया है जो उपयोग करने के लिए बेहतर होगा।

उदाहरण के लिए, PHP में mysql_real_escape_string है और < a href = "http://us2.php.net/manual/en/function.addslashes.php" rel = "nofollow noreferrer"> addlashes ।

0
जोड़ा

MySQL क्वेरी में, LIKE का उपयोग करते समय, "_" वर्णों से बचने के लिए भी सुनिश्चित करें क्योंकि यह mysql_real_escape_string से बच नहीं है।

संदर्भ के लिए, यहां जांचें

0
जोड़ा