2010-07-08 11 views
7

मेरे पास एक ऐसा एप्लिकेशन है जो POST अनुरोध के माध्यम से डेटा लेता है। मैं डेटाबेस में एक नई पंक्ति डालने के लिए इस डेटा का उपयोग कर रहा हूँ। मुझे पता है कि mysql_real_escape_string() (प्लस% और _ को हटाने) का उपयोग तारों के लिए जाने का तरीका है, लेकिन पूर्णांक मानों के बारे में क्या है? अभी, मैं उन पर PHP फ़ंक्शन intval() का उपयोग कर रहा हूं।इंटीजर डाटाबेस इनपुट Sanitizing

हालांकि, मैं यह सुनिश्चित करना चाहता था कि intval() पूरी तरह से सुरक्षित है। जब मैं intval() के माध्यम से चर (जैसे यह हमेशा एक पूर्णांक देता है) के माध्यम से चलाया जाता है, तो हम एक एसक्यूएल इंजेक्शन हमले को पूर्ववर्ती करने वाले हमलावर का एक तरीका नहीं देख सकते हैं, लेकिन मैं यह सुनिश्चित करना चाहता था कि यह उन लोगों का मामला है जिनके पास मुझसे अधिक अनुभव है

धन्यवाद।

+0

ध्यान रखें की तुलना में बेहतर है: आप 32 या 64 बिट्स से बड़ी संख्या के साथ काम कर रहे हैं (आपके प्लेटफ़ॉर्म पर निर्भर) 'intval() 'शून्य वापस आ जाएगी। यदि आप अपने डेटाबेस में बहुत बड़ी संख्याओं को स्टोर करने का प्रयास कर रहे हैं तो यह स्पष्ट रूप से अवांछित है। उदाहरण के लिए, फेसबुक की आईडी साल के लिए 32 बिट्स में फिट नहीं है http://developers.facebook.com/blog/post/45 –

+0

@ फ्रैंक किसान: एचएम .. यह दिलचस्प है। सर उठाने के लिए धन्यवाद। मैं उस समस्या को हल करने के लिए क्या कर सकता हूं, यदि इसकी आवश्यकता हो तो मैं देखूंगा। –

उत्तर

21

हाँ, intval() सुरक्षित है। पैरामीटर को पूर्णांक में परिवर्तित होने पर SQL इंजेक्शन करने का बिल्कुल कोई तरीका नहीं है, क्योंकि (स्पष्ट रूप से) एक पूर्णांक का प्रारूप SQL कीवर्ड (या उद्धरण, या जो कुछ भी) डालने की अनुमति नहीं देता है।

+0

ठीक है, मैंने यही सोचा था। धन्यवाद। –

+4

आप '(int) $ id' का भी उपयोग कर सकते हैं क्योंकि कास्टिंग 'अंतराल ($ आईडी)' फ़ंक्शन का उपयोग करने से बहुत तेज है। जांचें: http://hakre.wordpress.com/2010/05/13/php-casting-vs-intval/ – DaFrenk

+0

क्या आप निश्चित हैं? कारण अंतराल इनपुट पैरामीटर के रूप में जो कुछ भी लेता है उस पर बहुत अनुमोदित है। यह कोड सही पूर्णांक परिणाम उत्पन्न करता है लेकिन मैं कभी भी अपने प्रश्नों के अंदर ऐसे मान नहीं चाहता: '$ var =" 123TYPE_JUGGLING "; var_dump (is_numeric ($ var)); var_dump ((int) $ var); var_dump (अंतराल ($ var)); ' –

4

एसक्यूएल इंजेक्शन को रोकने का सबसे आसान तरीका हमेशा तैयार नियमों का उपयोग करना है। mysqli पुस्तकालयों ऐसे सिद्धांत आदि के रूप में एक ORM का उपयोग करें या बेहतर अभी तक

आपका प्रश्नों तो बन कुछ की तरह:

$stmt = $db->prep_stmt("select * from .... where userid = ? and username = ?"); 

/* Binding 2 parameters. */ 
$stmt->bind_param("is", $userid, $username); 

$userid = 15; 
$username = "don"; 

/* Executing the statement */ 
$stmt->execute() or die ("Could not execute statement"); 
+2

+1। हालांकि, मैं SQL अपवाद से बचने के लिए किसी प्रविष्टि को निष्पादित करने से पहले उपयोगकर्ता-इनपुट डेटा को अभी भी मान्य कर दूंगा। बेशक, ओआरएम या ढांचा मेरे लिए ऐसा कर रहा था। –

+0

दुर्भाग्य से, इस विशेष परियोजना के लिए तैयार बयान उपलब्ध नहीं हैं। –

2

मैं हमेशा

$var = (int)$_POST['var']; 

यकीन है कि $ वर के रूप में नियंत्रित किया जाता है बनाने के लिए क्या सभी परिस्थितियों में एक पूर्णांक, और फिर कभी भी $ _POST ['var'] को न देखें। मैनुअल को देखते हुए, अंतराल() बिल्कुल वही करता है।

जिस भी तरह से आप जाते हैं, बाद में $ var एक वास्तविक पूर्णांक होगा, जो संभालने के लिए काफी सुरक्षित है।

2

तैयार स्टेटमेंट एसक्यूएल इंजेक्शन को सौदा करने का सबसे अच्छा तरीका है। या अन्यथा पीडीओ उपयोग करते हैं, intval is_numeric

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