http - उसक - सिक्योरिटी कंट्रोल इन हिंदी




एक्सेस-कंट्रोल-ऑब्जेक्ट-उत्पत्ति एकाधिक मूल डोमेन? (17)

क्या एक्सेस-कंट्रोल-ऑब्जेक्ट-हेडर हेडर का उपयोग करके एकाधिक क्रॉस-डोमेन को अनुमति देने का कोई तरीका है?

मुझे * के बारे में पता है, लेकिन यह बहुत खुला है। मैं वास्तव में केवल कुछ डोमेन की अनुमति देना चाहता हूं।

एक उदाहरण के रूप में, इस तरह कुछ:

Access-Control-Allow-Origin: http://domain1.com, http://domain2.com

मैंने उपर्युक्त कोड की कोशिश की है लेकिन यह फ़ायरफ़ॉक्स में काम नहीं कर रहा है।

क्या एकाधिक डोमेन निर्दिष्ट करना संभव है या मैं केवल एक के साथ अटक गया हूँ?


.NET अनुप्रयोगों के लिए काफी आसान प्रतिलिपि / पेस्ट के लिए, मैंने इसे CORS को global.asax फ़ाइल में सक्षम करने के लिए लिखा है। यह कोड वर्तमान में स्वीकृत उत्तर में दी गई सलाह का पालन करता है, जो प्रतिक्रिया में अनुरोध में जो कुछ भी मूल दिया गया है उसे दर्शाता है। यह प्रभावी रूप से इसका उपयोग किए बिना '*' प्राप्त करता है। इसका कारण यह है कि यह कई अन्य सीओआरएस फीचर्स को सक्षम करता है, जिसमें 'सत्य' पर सेट 'withCredentials' विशेषता के साथ AJAX XMLHttpRequest भेजने की क्षमता शामिल है।

void Application_BeginRequest(object sender, EventArgs e)
{
    if (Request.HttpMethod == "OPTIONS")
    {
        Response.AddHeader("Access-Control-Allow-Methods", "GET, POST");
        Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
        Response.AddHeader("Access-Control-Max-Age", "1728000");
        Response.End();
    }
    else
    {
        Response.AddHeader("Access-Control-Allow-Credentials", "true");

        if (Request.Headers["Origin"] != null)
            Response.AddHeader("Access-Control-Allow-Origin" , Request.Headers["Origin"]);
        else
            Response.AddHeader("Access-Control-Allow-Origin" , "*");
    }
}

HTTP_ORIGIN का उपयोग सभी ब्राउज़रों द्वारा नहीं किया जाता है। HTTP_ORIGIN कितना सुरक्षित है? मेरे लिए यह एफएफ में खाली आता है।
मेरे पास ऐसी साइटें हैं जिन्हें मैं अपनी साइट पर किसी साइट आईडी पर भेजने की अनुमति देता हूं, फिर मैं उस आईडी के साथ रिकॉर्ड के लिए अपना डीबी जांचता हूं और SITE_URL कॉलम मान (www.yoursite.com) प्राप्त करता हूं।

header('Access-Control-Allow-Origin: http://'.$row['SITE_URL']);

यहां तक ​​कि यदि एक वैध साइट आईडी पर भेजना है तो अनुरोध उस साइट आईडी से जुड़े मेरे डीबी में सूचीबद्ध डोमेन से होना चाहिए।


Yesthatguy से उत्तर के आधार पर जावा वेब ऐप का समाधान यहां दिया गया है।

मैं जर्सी REST 1.x का उपयोग कर रहा हूँ

जर्सी REST और CORSResponseFilter के बारे में जागरूक होने के लिए web.xml को कॉन्फ़िगर करें

 <!-- Jersey REST config -->
  <servlet>    
    <servlet-name>JAX-RS Servlet</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param> 
        <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
        <param-value>true</param-value>
    </init-param>
    <init-param>
      <param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
      <param-value>com.your.package.CORSResponseFilter</param-value>
    </init-param>   
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>com.your.package</param-value>
    </init-param>        
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>JAX-RS Servlet</servlet-name>
    <url-pattern>/ws/*</url-pattern>
  </servlet-mapping>

CORSResponseFilter के लिए कोड यहां दिया गया है

import com.sun.jersey.spi.container.ContainerRequest;
import com.sun.jersey.spi.container.ContainerResponse;
import com.sun.jersey.spi.container.ContainerResponseFilter;


public class CORSResponseFilter implements ContainerResponseFilter{

@Override
public ContainerResponse filter(ContainerRequest request,
        ContainerResponse response) {

    String[] allowDomain = {"http://localhost:9000","https://my.domain.com"};
    Set<String> allowedOrigins = new HashSet<String>(Arrays.asList (allowDomain));                  

    String originHeader = request.getHeaderValue("Origin");

    if(allowedOrigins.contains(originHeader)) {
        response.getHttpHeaders().add("Access-Control-Allow-Origin", originHeader);

        response.getHttpHeaders().add("Access-Control-Allow-Headers",
                "origin, content-type, accept, authorization");
        response.getHttpHeaders().add("Access-Control-Allow-Credentials", "true");
        response.getHttpHeaders().add("Access-Control-Allow-Methods",
                "GET, POST, PUT, DELETE, OPTIONS, HEAD");
    }

    return response;
}

}

आईआईएस 7.5+ के लिए यूआरएल रिवाइट 2.0 मॉड्यूल स्थापित के साथ कृपया यह SO उत्तर देखें


एक और समाधान मैं PHP में उपयोग कर रहा हूँ:

$http_origin = $_SERVER['HTTP_ORIGIN'];

if ($http_origin == "http://www.domain1.com" || $http_origin == "http://www.domain2.com" || $http_origin == "http://www.domain3.info")
{  
    header("Access-Control-Allow-Origin: $http_origin");
}

एक नुकसान है जिसके बारे में आपको अवगत होना चाहिए: जैसे ही आप एक सीडीएन (या कोई अन्य सर्वर जो स्क्रिप्टिंग की अनुमति नहीं देता है) के बाहर आउट-सोर्स फाइलें या यदि आपकी फाइलें प्रॉक्सी पर कैश की जाती हैं, तो 'उत्पत्ति' के आधार पर प्रतिक्रिया को बदलना अनुरोध हेडर काम नहीं करेगा।


ऐसा करने के लिए अनुशंसित तरीके की तरह लगता है कि आपका सर्वर क्लाइंट से मूल शीर्षलेख पढ़ना है, इसकी तुलना उन डोमेन की सूची से करें, जिन्हें आप अनुमति देना चाहते हैं, और यदि यह मेल खाता है, तो मूल शीर्षलेख के मान को वापस प्रतिबिंबित करें प्रतिक्रिया में अभिगम-नियंत्रण-अनुमति-उत्पत्ति शीर्षलेख के रूप में ग्राहक।

.htaccess साथ आप इसे इस तरह से कर सकते हैं:

# ----------------------------------------------------------------------
# Allow loading of external fonts
# ----------------------------------------------------------------------
<FilesMatch "\.(ttf|otf|eot|woff)$">
    <IfModule mod_headers.c>
        SetEnvIf Origin "http(s)?://(www\.)?(google.com|staging.google.com|development.google.com|otherdomain.net|dev02.otherdomain.net)$" AccessControlAllowOrigin=$0
        Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
    </IfModule>
</FilesMatch>

ऐसा लगता है कि उत्तर एक से अधिक बार हेडर का उपयोग करना है। यह भेजने के बजाय है

Access-Control-Allow-Origin: http://domain1.com, http://domain2.com, http://domain3.com

भेजना

Access-Control-Allow-Origin: http://domain1.com
Access-Control-Allow-Origin: http://domain2.com
Access-Control-Allow-Origin: http://domain3.com

अपाचे पर, आप इसे httpd.conf <VirtualHost> अनुभाग या .htaccess फ़ाइल में mod_headers और इस वाक्यविन्यास का उपयोग करके कर mod_headers :

Header add Access-Control-Allow-Origin "http://domain1.com"
Header add Access-Control-Allow-Origin "http://domain2.com"
Header add Access-Control-Allow-Origin "http://domain3.com"

चाल पहली तर्क के रूप में add बजाय add का उपयोग करना है।


जैसा ऊपर बताया गया है, एक्सेस-कंट्रोल-ऑब्जेक्ट-ऑरिजन अद्वितीय होना चाहिए और अगर आप सीडीएन के पीछे हैं तो वेरी को उत्पत्ति पर सेट किया जाना चाहिए। मेरे Nginx conf का प्रासंगिक हिस्सा:

if ($http_origin ~* (https?://.*\.mydomain.com(:[0-9]+)?)) {
  set $cors "true";
}
if ($cors = "true") {
  add_header 'Access-Control-Allow-Origin' "$http_origin";
  add_header 'X-Frame-Options' "ALLOW FROM $http_origin";
  add_header 'Access-Control-Allow-Credentials' 'true';
  add_header 'Vary' 'Origin';
}

मुझे वफ़-फोंट के साथ एक ही समस्या थी, कई सबडोमेनों तक पहुंच थी। सबडोमेन को अनुमति देने के लिए मैंने अपने httpd.conf पर ऐसा कुछ जोड़ा:

SetEnvIf Origin "^(.*\.example\.com)$" ORIGIN_SUB_DOMAIN=$1
<FilesMatch "\.woff$">
    Header set Access-Control-Allow-Origin "%{ORIGIN_SUB_DOMAIN}e" env=ORIGIN_SUB_DOMAIN
</FilesMatch>

एकाधिक डोमेन के लिए आप SetEnvIf में SetEnvIf बदल सकते हैं।


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

उदाहरण के लिए अपने कैश को हटाने के लिए Google क्रोम में CTRL + SHIFT + DEL

इसने मुझे कई शुद्ध .htaccess समाधानों की कोशिश करने के बाद इस कोड का उपयोग करने में मदद की और यह केवल एक ही काम कर रहा था (कम से कम मेरे लिए):

    Header add Access-Control-Allow-Origin "http://google.com"
    Header add Access-Control-Allow-Headers "authorization, origin, user-token, x-requested-with, content-type"
    Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS"

    <FilesMatch "\.(ttf|otf|eot|woff)$">
        <IfModule mod_headers.c>
            SetEnvIf Origin "http(s)?://(www\.)?(google.com|staging.google.com|development.google.com|otherdomain.com|dev02.otherdomain.net)$" AccessControlAllowOrigin=$0
            Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
        </IfModule>
    </FilesMatch>

यह भी ध्यान रखें कि यह व्यापक रूप से फैल गया है कि कई समाधान कहते हैं कि आपको Header set ... टाइप करना होगा Header set ... लेकिन यह Header add ... । उम्मीद है कि यह किसी को मेरे जैसे कुछ घंटों के लिए एक ही परेशानी होने में मदद करता है।


यदि आपको फ़ॉन्ट्स में परेशानी हो रही है, तो इसका उपयोग करें:

<FilesMatch "\.(ttf|ttc|otf|eot|woff)$">
    <IfModule mod_headers>
        Header set Access-Control-Allow-Origin "*"
    </IfModule>
</FilesMatch>

यहां अपाचे के लिए एक विस्तृत विकल्प दिया गया है जिसमें कुछ नवीनतम और योजनाबद्ध फ़ॉन्ट परिभाषाएं शामिल हैं:

<FilesMatch "\.(ttf|otf|eot|woff|woff2|sfnt|svg)$">
    <IfModule mod_headers.c>
        SetEnvIf Origin "^http(s)?://(.+\.)?(domainname1|domainname2|domainname3)\.(?:com|net|org)$" AccessControlAllowOrigin=$0$1$2
        Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
        Header set Access-Control-Allow-Credentials true
    </IfModule>
</FilesMatch>

यहां एक PHP अनुप्रयोग के लिए मैंने किया है जिसे AJAX द्वारा अनुरोध किया जा रहा है

$request_headers        = apache_request_headers();
$http_origin            = $request_headers['Origin'];
$allowed_http_origins   = array(
                            "http://myDumbDomain.com"   ,
                            "http://anotherDumbDomain.com"  ,
                            "http://localhost"  ,
                          );
if (in_array($http_origin, $allowed_http_origins)){  
    @header("Access-Control-Allow-Origin: " . $http_origin);
}

अगर मेरे सर्वर द्वारा अनुरोध करने की उत्पत्ति की अनुमति है, तो * वाइल्डकार्ड लौटने के बजाय $http_origin को Access-Control-Allow-Origin शीर्षलेख के मान के रूप में वापस कर Access-Control-Allow-Origin ,


सबडोमेन से मेल खाने के लिए PHP कोड उदाहरण।

if( preg_match("/http:\/\/(.*?)\.yourdomain.com/", $_SERVER['HTTP_ORIGIN'], $matches )) {
        $theMatch = $matches[0];
        header('Access-Control-Allow-Origin: ' . $theMatch);
}

हम इसे Asp.net एप्लिकेशन के लिए Global.asax फ़ाइल में भी सेट कर सकते हैं।

protected void Application_BeginRequest(object sender, EventArgs e)
    {

    // enable CORS
    HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "https://www.youtube.com");

    }

एसएसएल पर विज्ञापनों की सेवा करने और आरएफसी में व्याकरण के बारे में Google का समर्थन जवाब यह इंगित करता है कि आप यूआरएल को स्थानांतरित कर सकते हैं। यह सुनिश्चित नहीं है कि यह विभिन्न ब्राउज़रों में कितनी अच्छी तरह से समर्थित है।





cross-domain