𝗣𝗛𝗣 ਬੱਗਸ #𝟮𝟭 ਤੋਂ #𝟯𝟬: ਆਮ ਗਲਤੀਆਂ
PHP ਤੁਹਾਨੂੰ ਬਿਨਾਂ ਕਿਸੇ ਚੇਤਾਵਨੀ ਦੇ ਗਲਤੀਆਂ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦਿੰਦਾ ਹੈ। ਇਹ ਅਕਸਰ ਫੇਲ ਹੋਣ ਦੇ ਬਾਵਜੂਦ ਵੀ ਚੱਲਦਾ ਰਹਿੰਦਾ ਹੈ। ਇਸ ਨਾਲ ਚੁੱਪਚਾਪ ਡੇਟਾ ਖਰਾਬ ਹੋ ਸਕਦਾ ਹੈ ਜਾਂ ਸੁਰੱਖਿਆ ਵਿੱਚ ਕਮੀਆਂ ਆ ਸਕਦੀਆਂ ਹਨ।
ਇੱਥੇ ਬਚਣ ਲਈ 10 ਅਹਿਮ ਬੱਗਸ ਹਨ:
ਮਲਟੀਬਾਈਟ ਟੈਕਸਟ (Multibyte Text)
strlen()ਬਾਈਟ ਗਿਣਦਾ ਹੈ, ਅੱਖਰ ਨਹੀਂ। ਇਹ ਹਿੰਦੀ ਜਾਂ ਇਮੋਜੀ ਟੈਕਸਟ ਨੂੰ ਖਰਾਬ ਕਰ ਦਿੰਦਾ ਹੈ। ਇਸ ਦੀ ਬਜਾਏmb_strlen()ਦੀ ਵਰਤੋਂ ਕਰੋ।ਅਵੈਲੀਡੇਟਡ (Unvalidated) API ਕਾਲਸ
file_get_contents()ਚੁੱਪਚਾਪ ਫੇਲ ਹੋ ਸਕਦਾ ਹੈ।json_decode()null ਰਿਟਰਨ ਕਰ ਸਕਦਾ ਹੈ। ਹਮੇਸ਼ਾ ਚੈੱਕ ਕਰੋ ਕਿ ਜਵਾਬ (response) false ਹੈ ਜਾਂ ਨਹੀਂ ਅਤੇjson_last_error()ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ।ਟੈਂਪਰੇਰੀ ਕੁਕੀਜ਼ (Temporary Cookies) ਬਿਨਾਂ ਐਕਸਪਾਇਰੀ ਡੇਟ ਦੇ
setcookie()ਬ੍ਰਾਊਜ਼ਰ ਬੰਦ ਹੋਣ 'ਤੇ ਕੁਕੀ ਨੂੰ ਡਿਲੀਟ ਕਰ ਦਿੰਦਾ ਹੈ। ਐਕਸਪਾਇਰੀ ਸਮਾਂ ਸੈੱਟ ਕਰੋ ਅਤੇ XSS ਹਮਲਿਆਂ ਨੂੰ ਰੋਕਣ ਲਈhttponlyਫਲੈਗ ਦੀ ਵਰਤੋਂ ਕਰੋ।ਅਸੁਰੱਖਿਅਤ ਫਾਈਲ ਅਪਲੋਡਸ (Unsafe File Uploads) ਸਿਰਫ਼ ਫਾਈਲ ਐਕਸਟੈਂਸ਼ਨਾਂ ਦੀ ਜਾਂਚ ਕਰਨਾ ਕਾਫ਼ੀ ਨਹੀਂ ਹੈ। ਹੈਕਰ
shell.phpਦਾ ਨਾਮ ਬਦਲ ਕੇshell.jpgਕਰ ਦਿੰਦੇ ਹਨ। ਅਸਲ MIME ਟਾਈਪ ਦੀ ਜਾਂਚ ਕਰਨ ਲਈfinfo_file()ਦੀ ਵਰਤੋਂ ਕਰੋ।ਫਾਰਮੈਟ ਕੀਤੇ ਸਟ੍ਰਿੰਗਸ (Strings) ਨਾਲ ਗਣਿਤ PHP ਅੰਕਾਂ ਨੂੰ ਕਾਮੇ (comma) 'ਤੇ ਪੜ੍ਹਨਾ ਬੰਦ ਕਰ ਦਿੰਦਾ ਹੈ। "1,299.00" ਬਣ ਜਾਂਦਾ ਹੈ 1। ਗਣਨਾ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ
str_replace()ਨਾਲ ਕਾਮੇ ਹਟਾ ਦਿਓ। ਆਪਣੇ ਡੇਟਾਬੇਸ ਵਿੱਚ ਰਅਅ (raw) ਅੰਕ ਸਟੋਰ ਕਰੋ।ਸਾਂਝੀਆਂ ਸਟੈਟਿਕ ਪ੍ਰਾਪਰਟੀਜ਼ (Shared Static Properties) ਸਟੈਟਿਕ ਪ੍ਰਾਪਰਟੀਜ਼ ਕਲਾਸ ਦੀ ਹੁੰਦੀਆਂ ਹਨ, ਆਬਜੈਕਟ ਦੀ ਨਹੀਂ। ਹਰ ਇੰਸਟੈਂਸ (instance) ਇੱਕੋ ਡੇਟਾ ਸਾਂਝਾ ਕਰਦਾ ਹੈ। ਯੂਜ਼ਰ-ਵਿਸ਼ੇਸ਼ ਡੇਟਾ ਲਈ ਆਮ ਪਬਲਿਕ ਪ੍ਰਾਪਰਟੀਜ਼ ਦੀ ਵਰਤੋਂ ਕਰੋ।
Exit ਤੋਂ ਬਿਨਾਂ ਰੀਡਾਇਰੈਕਟਸ (Redirects)
header("Location: ...")ਸਿਰਫ਼ ਬ੍ਰਾਊਜ਼ਰ ਨੂੰ ਇੱਕ ਹਦਾਇਤ ਭੇਜਦਾ ਹੈ। ਸਰਵਰ ਸਕ੍ਰਿਪਟ ਨੂੰ ਚਲਾਉਣਾ ਜਾਰੀ ਰੱਖਦਾ ਹੈ। ਰੀਡਾਇਰੈਕਟ ਤੋਂ ਬਾਅਦ ਹਮੇਸ਼ਾexit()ਨੂੰ ਕਾਲ ਕਰੋ।SQL ਇੰਜੈਕਸ਼ਨ (SQL Injection) ਵੇਰੀਏਬਲਸ ਨੂੰ ਸਿੱਧੇ ਕੁਐਰੀ ਸਟ੍ਰਿੰਗਸ (query strings) ਵਿੱਚ ਪਾਉਣ ਨਾਲ ਹੈਕਰ ਤੁਹਾਡੇ ਡੇਟਾਬੇਸ ਨੂੰ ਕੰਟਰੋਲ ਕਰ ਸਕਦੇ ਹਨ। PDO ਦੇ ਨਾਲ prepared statements ਦੀ ਵਰਤੋਂ ਕਰੋ।
ਮੈਮੋਰੀ ਕ੍ਰੈਸ਼ (Memory Crashes)
file_get_contents()ਪੂਰੀਆਂ ਫਾਈਲਾਂ ਨੂੰ RAM ਵਿੱਚ ਲੋਡ ਕਰਦਾ ਹੈ। ਵੱਡੀਆਂ ਫਾਈਲਾਂ 'ਤੇ ਇਹ ਤੁਹਾਡੇ ਸਰਵਰ ਨੂੰ ਕ੍ਰੈਸ਼ ਕਰ ਦਿੰਦਾ ਹੈ। ਫਾਈਲਾਂ ਨੂੰ ਲਾਈਨ-ਦਰ-ਲਾਈਨ ਪੜ੍ਹਨ ਲਈfopen()ਅਤੇfgets()ਦੀ ਵਰਤੋਂ ਕਰੋ।ਚੁੱਪਚਾਪ ਡੇਟਾਬੇਸ ਗਲਤੀਆਂ (Silent Database Errors) PDO ਡਿਫੌਲਟ ਰੂਪ ਵਿੱਚ ਚੁੱਪ ਰਹਿੰਦਾ ਹੈ। ਗਲਤੀਆਂ ਐਕਸਪੈਕਸ਼ਨ (exceptions) ਸੁੱਟਣ ਦੀ ਬਜਾਏ false ਰਿਟਰਨ ਕਰਦੀਆਂ ਹਨ।
PDO::ATTR_ERRMODEਨੂੰPDO::ERRMODE_EXCEPTION'ਤੇ ਸੈੱਟ ਕਰੋ।
ਹੱਲ ਸਧਾਰਨ ਹੈ: ਸਪਸ਼ਟ ਰਹੋ। ਹਰ ਰਿਟਰਨ ਵੈਲਯੂ ਨੂੰ ਚੈੱਕ ਕਰੋ। ਹਰ ਇਨਪੁਟ ਨੂੰ ਵੈਲੀਡੇਟ ਕਰੋ। ਕਦੇ ਵੀ ਇਹ ਨਾ ਮੰਨੋ ਕਿ ਕੋਈ ਫੰਕਸ਼ਨ ਸਹੀ ਤਰ੍ਹਾਂ ਕੰਮ ਕਰ ਗਿਆ ਹੈ।