2008-08-05 12 views
18

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

  • डबल पलायन (\\) के साथ पलायन (\) बदलता है:

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

  • एक बच निकले एकल उद्धरण (\') के साथ सिंगल कोट्स (') को प्रतिस्थापित करता है।

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

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

+0

कुछ बैकस्लैश के प्रदर्शन में गलत हो गया है चाहिए, लाइन 'में पलायन() डबल पलायन के साथ बदलता है (\)।' – bart

उत्तर

7

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

https://stackoverflow.com/questions/1973/what-is-the-best-way-to-avoid-sql-injection-attacks

0

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

उदाहरण के लिए, PHP में mysql_real_escape_string और addslashes है।

0

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

-1

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

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

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}'; 
    "; 

यह है कि का आनंद लें ! (उम्मीद है कि पोस्ट सही ढंग से अंडरस्कोर भेजेगा और & # 95;)

1

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

पीडीओ पर एक महान प्राइमर The PHP Anthology 101 Essential Tips, Tricks & Hacks by Davey Shafik etc. 2nd Ed पुस्तक में शामिल किया गया है। एक हवा सीखना और संदर्भ के रूप में उत्कृष्ट है। मुझे अब वास्तविक SQL क्वेरी के अलावा किसी और चीज के बारे में भी सोचना नहीं है।

0

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

0

तैयार बयान का उपयोग करें।

0

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

संदर्भ के लिए, जाँच here

संबंधित मुद्दे