कैसे मैं छवियों को बचाने के लिए सीखा


संरक्षण छवि

इस लेख में मैं वेब पर छवि की "रक्षा" करने वाले कठिन तरीके को सेट करना चाहता हूं। इससे पहले कि हम इस आकर्षक यात्रा को शुरू करें, मैं छवियों की रक्षा के लिए दो दृष्टिकोणों को रेखांकित करना चाहता हूं:
  1. मूल छवियों के लिए सीधे लिंक पोस्ट करने का प्रतिबंध / निषेध
  2. आप चित्र की प्रतियों के वितरण को सीमित करने की कोशिश कर रहे हैं

अद्यतन
सार्वभौमिक सुरक्षा निश्चित रूप से मौजूद नहीं है। यह आलेख GET से SQL क्वेरीज़ में डेटा को सीधे कैसे नहीं विकल्प के बारे में है। केवल छवि सुरक्षा के संदर्भ में।


It सीमा प्रतियां: मेरे बच्चों की बाइक


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

हम पहले से ही पढ़ते हैं कि प्रोग्रामर हर समय झूठ बोलते हैं । इसलिए, मुझे वह करना था जो क्लाइंट चाहता था। समाधान भी बहुत सुंदर था। एक तस्वीर के साथ एक पेज का अनुरोध करते समय, हम एक निश्चित $secretKey उत्पन्न करते हैं और इस कुंजी के तहत सत्र में छवि के पूर्ण आकार की प्रतिलिपि के लिए रास्ता बचाते हैं:

 public function actionView() { // ... $_SESSION['protected-photos'][$secretKey]['file'] = $photoPath; // ... } 

दृश्य में, हम निम्न रूप में फोटो के लिए पथ को इंगित करते हैं:

 <img src="/photo/source/{secretKey}" /> 

अब actionSource हम सत्र से फोटो की एक पूर्ण-आकार की प्रतिलिपि के लिए रास्ता प्राप्त करते हैं, इसे सही हेडर के साथ भेजते हैं और पूर्ण-आकार फ़ाइल में पथ को साफ़ करते हैं:

 public function actionSource() { $secretKey= $_GET['key']; $session = &$_SESSION['protected-photos']; $file = $session[$secretKey]['file']; if (is_file($file)) { header('Content-type: image/jpeg'); echo file_get_contents($file); } $session[$secretKey]['file'] = ''; } 

परिणामस्वरूप, यदि उपयोगकर्ता एक नए टैब में चित्र को डाउनलोड / खोलने / साझा करने का प्रयास करता है, तो एक छोटी प्रति उसे वापस कर दी जाएगी।

महत्वपूर्ण: इस दृष्टिकोण का कमजोर बिंदु काफी स्पष्ट है: यदि आप ब्राउज़र से फोटो के साथ पृष्ठ का अनुरोध करते हैं, लेकिन wget के माध्यम से कहते हैं। इस स्थिति में, img टैग अनुरोध /photo/source/{secretKey} । इस प्रकार, इसमें फोटो की एक पूर्ण आकार की प्रतिलिपि होगी।

सीधे लिंक को सीमित करें: .htaccess


बाद में मुझे पता चला कि छवियों को सुरक्षित रखने का सबसे आसान और सबसे सामान्य तरीका तदनुसार कॉन्फ़िगर करना है। आप न केवल छवियों के लिए सीधे लिंक को प्रतिबंधित कर सकते हैं, बल्कि एक स्टब भी निर्दिष्ट कर सकते हैं जो आपकी साइट से मूल छवियों के बजाय तीसरे पक्ष के संसाधनों पर प्रदर्शित किया जाएगा। यहाँ इस तरह के विन्यास का एक उदाहरण दिया गया है:

 RewriteEngine On RewriteCond %{HTTP_REFERER} !^http://(.+\.)?mysite\.com/ [NC] RewriteCond %{HTTP_REFERER} !^$ RewriteRule .*\.(jpe?g|gif|png)$ http://i.imgur.com/qX4w7.gif [L] 

पहली पंक्ति में एक निर्देश शामिल है जिसमें परिवर्तन तंत्र का संचालन शामिल है। यहां सब कुछ सरल है। दूसरी पंक्ति हम अपने mysite.com को छोड़कर किसी भी साइट को ब्लॉक करते हैं। कोड [NC] का अर्थ है "कोई विकल्प नहीं", दूसरे शब्दों में, केस-असंवेदनशील URL मैच। तीसरी पंक्ति हम खाली रेफरल की अनुमति देते हैं। और अंत में, अंतिम पंक्ति सभी फाइलों को जेपीईजी, जेपीजी, जीआईएफ या पीएनजी के साथ डाउनलोड करती है और उन्हें सर्वर imgur.com से छवि qX4w7.gif के साथ बदल देती है

यदि आवश्यक हो, तो आप अन्यथा कर सकते हैं: विशिष्ट डोमेन के लिए छवियों के लिए सीधे लिंक को प्रतिबंधित करें।

 RewriteEngine On RewriteCond %{HTTP_REFERER} ^http://(.+\.)?myspace\.com/ [NC,OR] RewriteCond %{HTTP_REFERER} ^http://(.+\.)?blogspot\.com/ [NC,OR] RewriteCond %{HTTP_REFERER} ^http://(.+\.)?livejournal\.com/ [NC] RewriteRule .*\.(jpe?g|gif|png)$ http://i.imgur.com/qX4w7.gif [L] 

प्रत्येक RewriteCond, अंतिम को छोड़कर, कोड [NC, OR] को शामिल करना चाहिए। या इसका अर्थ है "या अगला", अर्थात वर्तमान डोमेन या अगले मैच।

इसके अलावा, स्टब छवि के बजाय, आप एक HTTP त्रुटि कोड 403 वापस कर सकते हैं:

 RewriteRule .*\.(jpe?g|gif|png)$ - [F] 

महत्वपूर्ण: छवियों के बजाय एक HTML पृष्ठ वापस करने की कोशिश न करें। आप या तो एक और छवि या एक HTTP त्रुटि वापस कर सकते हैं।

सीधे लिंक को सीमित करें: nginx


नगनेक्स के लिए, सब कुछ समान है:

 location ~* \.(jpe?g|gif|png)$ { set $bad_ref "N"; if ($http_referer !~ ^(http://(.+\.)?myspace\.com|http://(.+\.)?blogspot\.com|http://(.+\.)?livejournal\.com)) { set $bad_ref "Y"; } if ($bad_ref = "Y") { return 444; } } 

अद्यतन: VBart ने अपनी टिप्पणी में सुझाव दिया कि इन उद्देश्यों के लिए ngx_http_referer_module का उपयोग करना बेहतर है।

सीधे लिंक को सीमित करें: Amazon CloudFront पर हस्ताक्षर किए गए URL


उपयोगकर्ताओं को सामग्री वितरित करने के लिए Amazon CloudFront सबसे अच्छे विकल्पों में से एक है। एक साधारण सीडीएन के रूप में अपने प्रत्यक्ष कर्तव्यों के अलावा, वह हस्ताक्षरित लिंक उत्पन्न करने का अवसर भी देता है। इस तरह के लिंक समय सीमा और साथ ही आईपी द्वारा फ़ाइल तक पहुंच को सीमित करना संभव बनाते हैं। इस प्रकार, उदाहरण के लिए, आप यह निर्दिष्ट कर सकते हैं कि छवि 10 मिनट के भीतर उपलब्ध होगी। या कल से शुरू होने वाले 7 दिन।

औसतन, फ़ाइल का लिंक निम्नानुसार है:

1 d111111abcdef8.cloudfront.net/image.jpg? 2 color=red&size=medium 3 &Policy=eyANCiAgICEXAMPLEW1lbnQiOiBbeyANCiAgICAgICJSZXNvdXJjZSI6Imh0dHA 6Ly9kemJlc3FtN3VuMW0wLmNsb3VkZnJvbnQubmV0L2RlbW8ucGhwIiwgDQogICAgICAiQ 29uZGl0aW9uIjp7IA0KICAgICAgICAgIklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiI yMDcuMTcxLjE4MC4xMDEvMzIifSwNCiAgICAgICAgICJEYXRlR3JlYXRlclRoYW4iOnsiQ VdTOkVwb2NoVGltZSI6MTI5Njg2MDE3Nn0sDQogICAgICAgICAiRGF0ZUxlc3NUaGFuIjp 7IkFXUzpFcG9jaFRpbWUiOjEyOTY4NjAyMjZ9DQogICAgICB9IA0KICAgfV0gDQp9DQo 7IkFXUzpFcG9jaFRpbWUiOjEyOTY4NjAyMjZ9DQogICAgICB9IA0KICAgfV0gDQp9DQo 4 &Signature=nitfHRCrtziwO2HwPfWw~yYDhUF5EwRunQA-j19DzZrvDh6hQ73lDx~ -ar3UocvvRQVw6EkC~GdpGQyyOSKQim-TxAnW7d8F5Kkai9HVx0FIu-5jcQb0UEmat EXAMPLE3ReXySpLSMj0yCd3ZAB4UcBCAqEijkytL6f3fVYNGQI6 ~ -ar3UocvvRQVw6EkC ~ GdpGQyyOSKQim-TxAnW7d8F5Kkai9HVx0FIu-5jcQb0UEmat EXAMPLE3ReXySpLSMj0yCd3ZAB4UcBCAqEijkytL6f3fVYNGQI6 5 &Key-Pair-Id=APKA9ONS7QCOWEXAMPLE

और अब अंक के लिए:
  1. आपकी छवि का आधार लिंक। यह वह लिंक है जो आपने पहले हस्ताक्षरित लिंक से पहले छवि तक पहुंचने के लिए उपयोग किया था।
  2. आमतौर पर छवि का उपयोग लॉग करने के लिए उपयोग किया जाता है कि मनमाने ढंग से क्वेरी पैरामीटर। CloudFront आपको इन मापदंडों को स्थानांतरित करने, कैश करने और लॉग इन करने की अनुमति देता है। महत्वपूर्ण: पैरामीटर नाम को क्लाउडफ्रॉस्ट द्वारा आरक्षित लोगों के साथ मेल नहीं खाना चाहिए: समाप्ति , की-जोड़ी-आईडी , नीति , हस्ताक्षर । अपने मापदंडों में x- उपसर्ग जोड़ना सबसे अच्छा है। यह विशेष रूप से उपयोगी होगा यदि आपकी छवियां अमेज़ॅन एस 3 पर संग्रहीत हैं
  3. JSON प्रारूप और रिक्त स्थान के बिना ( विवरण ) में छवियों तक पहुँचने के लिए नियम।
  4. पिछले पैराग्राफ ( विवरण ) से एक्सेस नियमों का हैशेड और हस्ताक्षरित संस्करण।
  5. हस्ताक्षर कुंजी ( विवरण )।

महत्वपूर्ण: CloudFront HTTPS के साथ CNAME का समर्थन नहीं करती है । यानी आप प्रतिस्थापित नहीं कर सकते d111111abcdef8.cloudfront.net d111111abcdef8.cloudfront.net पर images.example.com images.example.com । समस्या के दो समाधान हैं:
  1. छवियों के लिए https://*.cloudfront.com का उपयोग करें।
  2. डोमेन images.example.com छोड़ दें, लेकिन इसका उपयोग HTTP प्रोटोकॉल के माध्यम से करें।
दो विकल्पों में से एक को चुनना अनिवार्य रूप से स्वाद का विषय है। मौलिक रूप से, वे एक दूसरे से अलग नहीं होते हैं।

Ogue उपसंहार


मुझे उम्मीद है कि ऊपर वर्णित दृष्टिकोण आपको वेब पर छवियों की सुरक्षा के कठिन कार्य को जल्दी से नेविगेट करने में मदद करेंगे। और विषय पर कुछ उपयोगी लिंक:

  1. हॉटलिंकिंग: .htaccess जेनरेटर
  2. हॉटलिंकिंग: .htaccess कॉन्फ़िगरेशन
  3. Hotlinking: nginx कॉन्फ़िगरेशन उदाहरण
  4. हॉटलिंकिंग: सत्यापन
  5. Amazon CloudFront पर हस्ताक्षर किए गए URL

Source: https://habr.com/ru/post/In176299/


All Articles