flawopen.com/Command Injection/exec() बनाम execFile()
Node.js में exec() और execFile() में क्या अंतर है?
exec() एक string लेता है और उसे shell के माध्यम से चलाता है: pipes और wildcards काम करते हैं, लेकिन अविश्वसनीय input के shell metacharacters command बदल सकते हैं। execFile() डिफ़ॉल्ट रूप से shell शुरू किए बिना दिए गए program को arguments की array के साथ सीधे चलाता है। इससे shell parsing रुकती है, लेकिन हर जोखिम नहीं: target program किसी argument को option समझ सकता है या अप्रत्याशित value पर कार्रवाई कर सकता है।
तुलना
exec(`ls ${dir} | grep .txt`,
(err, out) => {...})
// pipe काम करता है, लेकिन metacharacters भी।
execFile('ls', [dir],
(err, out) => {...})
// shell नहीं; जाँचें कि ls dir argument को कैसे समझता है।
// break out of its own argument
जब shell सुविधाएँ सचमुच आवश्यक हों
यदि command को pipes, globbing या shell redirection चाहिए, तो execFile() इन सुविधाओं को सीधे व्यक्त नहीं कर सकता। बेहतर है कि Node.js में हर चरण अलग शुरू करके streams जोड़ें और pipeline बनाएँ। यदि exec() से बचना संभव न हो, तो अविश्वसनीय input को command string में न रखें। Shell-विहीन argument array भी argument injection नहीं रोकती: हर value को target program के अनुसार validate करें, program समर्थन करे तो -- उपयोग करें, और केवल अपेक्षित commands और options की अनुमति दें। shell: true उन APIs में shell चालू करता है जो सामान्यतः shell नहीं चलाते; इस mode में बिना sanitize किया input कभी न दें।
अक्सर पूछे जाने वाले प्रश्न
Windows batch files सुरक्षा सीमा बदलते हैं
Windows पर .bat और .cmd files को execFile() से सीधे launch नहीं किया जा सकता। Node docs के अनुसार इन्हें exec(), cmd.exe या shell-enabled spawn() से चलाया जा सकता है; इन रास्तों में command interpreter parsing फिर आ जाती है। Native executable या direct API को प्राथमिकता दें। यदि batch file चलाना अनिवार्य हो, तो script path और arguments तय रखें या उस script के सटीक contract के अनुसार validate करें। Node ने shell: true के साथ argument array देने को भी deprecated किया है (v22.15.0 और v23.11.0 से)।
spawn() भी डिफ़ॉल्ट रूप से shell के बिना चलता है और arguments की array लेता है। मुख्य व्यावहारिक अंतर output का है: spawn() streams देता है, जबकि execFile() output को buffer करता है। दोनों target program को argument को option समझने से नहीं रोकते; उस program के अनुसार arguments validate करें। shell: true shell parsing फिर चालू कर देता है।