2012-07-10 12 views
6

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

कोड:

//Grab and clean (just in case, why not) the class and method variables from GET 
$class = urlencode(trim($_GET['c'])); 
$method = urlencode(trim($_GET['m'])); 

//Ensure the passed function is callable 
if(method_exists($class, $method)){ 
    $class::$method(); 
} 

वहाँ किसी भी नुकसान या सुरक्षा घड़ी बहिष्कार मैं जबकि इस तकनीक का इस्तेमाल के बारे में पता होना चाहिए रहे हैं?

उत्तर

6
<?php 
class AjaxCallableFunction 
{ 
    public static $callable_from_ajax = TRUE; 
} 

$class = $_POST['class']; 
$method = $_POST['method']; 

if (class_exists($class) && isset($class::$callable_from_ajax) && $class::$callable_from_ajax) { 
    call_user_func($class, $method); 
} 

अच्छे परिणाम के लिए अन्य उत्तर में से कुछ के साथ मिलाएं। PHP 5.3.0 या उच्चतम की आवश्यकता है। तुम भी एक अंतरफलक

<?php 
interface AjaxCallable {} 

class MyClass implements AjaxCallable 
{ 
    // Your code here 
} 

$class = $_POST['class']; 
$method = $_POST['method']; 

if (class_exists($class) && in_array('AjaxCallable', class_implements($class))) { 
    call_user_func($class, $method); 
} 

यह दृष्टिकोण OOP सिद्धांतों इस प्रकार लागू कर सकता है, बहुत वर्बोज़ (आसान बनाए रखने के लिए) है और एक सरणी जिनमें से कक्षाएं कहा जा सकता है बनाए रखने के लिए आप की आवश्यकता नहीं है और जो नहीं कर सकता।

+1

कि अजाक्स कॉल करने योग्य इंटरफ़ेस एक अच्छा विचार था, पूरी तरह से काम करता है। धन्यवाद! – ACobbs

+0

खुशी है कि यह आपके लिए काम करता है :) –

4

ध्यान में रखते हुए कि आप कोई तर्क नहीं दे रहे हैं, यह अब अपेक्षाकृत सुरक्षित है। लेकिन मैं में मान्य कक्षाओं की एक सूची जोड़ना होगा अपने यदि जैसे:

//Ensure the passed function is callable 
if(method_exists($class, $method)){ 
    if(in_array($class, array('controller1', 'controller2'))){ 
     $class::$method(); 
    } 
} 

इस तरह, एक हैकर वास्तव में ढांचे में किसी भी संभावित वर्ग इस तरह से है, लेकिन केवल लोगों को आप उसे करने के लिए अनुमति फोन नहीं कर सकते हैं।

14

चेक विधि उपयोगकर्ता द्वारा कहा जा करने की अनुमति दी है यदि:

// methods that user can call: 
$user_methods = array("method1", "method2", "method3",); 

//Ensure the passed function is callable 
if(method_exists($class, $method) and in_array($method, $user_methods){ 
    $class::$method(); 
} 

नहीं तो आप कोई नियंत्रण नहीं क्या उपयोगकर्ता ऐसा करने में सक्षम हो जाएगा होगा।

+4

+1। Whitelist, ब्लैकलिस्ट मत करो। – Polynomial

+2

अच्छा जवाब; अकेले method_exists का उपयोग करके अप्रत्याशित चीजें खुश होने का कारण बन सकती हैं। – Erik

+0

और भयानक चीजें भी। –

2

इस मामले में आपको Reflection से निपटना होगा।

यहां आपको और जो चाहिए वह उदाहरण है। तो अंत में हम कर सकते थे

<?php 
class HelloWorld { 

    public function sayHelloTo($name) { 
     return 'Hello ' . $name; 
    } 

} 

$reflectionMethod = new ReflectionMethod('HelloWorld', 'sayHelloTo'); 
echo $reflectionMethod->invoke(new HelloWorld(), 'Mike'); 
?> 

:

<?php 
class Apple { 
    public function firstMethod() { } 
    final protected function secondMethod() { } 
    private static function thirdMethod() { } 
} 

$class = new ReflectionClass('Apple'); 
$methods = $class->getMethods(); 
var_dump($methods); 
?> 

एक विधि निष्पादित इस का उपयोग करते हुए ReflectionMethods:invoke की तरह हो सकता है

$class = urlencode(trim($_GET['c'])); 
    $method = urlencode(trim($_GET['m'])); 

    $allowed_methods = array("insert", "update", "delete"); 

    if(method_exists($class, $method) and in_array($method, $allowed_methods){ 
    $reflectionMethod = new ReflectionMethod($class, $method); 
    $reflectionMethod->invoke(new $class, 'First Argument'); 
    } 
+1

विधि को सीधे कॉल करने पर प्रतिबिंब प्रस्ताव का उपयोग करके क्या फायदे हैं? – ACobbs

+0

@ACobbs मुझे यकीन नहीं है कि अगर आप पहले स्ट्रिंग से कोई विधि कॉल करते हैं, तो अगली बात यह है कि यदि आप किसी साइट पर हमला करते हैं तो आप संदर्भ को मिस्च नहीं करेंगे। यह उस विधि को उस वर्ग के संदर्भ में कॉल करेगा जहां यह संबंधित है। – Burimi

+0

@ कोडी क्या आप ** कृपया ** अनुमत कार्यों के लिए एक सरणी जोड़ सकते हैं और मूल रूप से सिक्योरेटर के उत्तर को अपने आप में शामिल कर सकते हैं? तब आपकी इच्छा निर्विवाद रूप से एकमात्र उत्तर होगी जिसके लिए मैं मतदान कर सकता हूं। –

1

urlencode() मुझे थोड़ा चिंतित करता है। भले ही यह संभवतः सुरक्षित हो, मैं अधिक सख्ती से sanitize होगा। मैं केवल अक्षरों, संख्याओं और अंडरस्कोर की अनुमति दूंगा। आपको वास्तव में किसी भी वर्ग या विधि नामों को अन्य पात्रों के साथ नहीं चाहिए। मुझे नहीं लगता कि मैंने कभी देखा है।

मैं अपने सभी परियोजनाओं में सामान के बहुतके लिए इस का उपयोग करें:

function very_safe_string($string) 
{ 
    return preg_replace("/[^A-Za-z0-9_]/" , '' , $string); 
} 

और के रूप में अन्य पोस्टर का उल्लेख किया है, आप निश्चित रूप से सफेद सूची स्पष्ट रूप से (कम से कम कक्षाओं के लिए अनुमति देने के लिए किसी प्रकार की होनी चाहिए , क्योंकि मुझे यकीन है कि हर वर्ग को AJAX से एक्सेस नहीं किया जाना चाहिए)। साथ ही class_exists() और method_exists() की जांच भी कर रहा है।

यदि इनमें से कोई भी चेक असफल हो तो मैं कुछ प्रकार की ईमेल अलर्ट सिस्टम की भी सिफारिश करता हूं।मुझे यकीन है कि आप जानना चाहते हैं कि कोई hax0r j00 करने का प्रयास कर रहा है या नहीं।

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