ثبت نام

لغو گزارش خطا

آواتار کاربر
پست: 13
تشکر کرده: 1 پست
تشکر شده: 15 پست
تاریخ عضویت: 31 تیر 94, 09:36

لغو گزارش خطا

پستتوسط php6 » 3 مرداد 94, 18:03

بهتر است پس از طراحی و پیاده سازی یک سیستم ، حتماً قبل از آپلود بر روی وب ، در ابتدای فایل اصلی ، کد:
کد: انتخاب همه
error_reporting(0);

را قرار دهیم تا اوّلا امنیت سیستم حفظ شود ، ثانیاً به خاطر برخی خطاهای غیر ضروری که دانستن آن برای کاربران لازم نیست ، قالب سایت به هم نریزد.

البتّه همیشه باید عملیات مهم را به صورت مشروط انجام دهیم.
مثلاً اگر به فلان محتوا دسترسی نباشد ، پیغام مناسبی چاپ شود ، که هم سرنخ خاصی به دست هکرها ندهد و هم متوجّه وجود مشکل بشویم.
توسّط : متخصّص php - JavaScript - Html - Css - MySql - Apachi - WEB

2 کاربر از این پست تشکر کرده اند.

مدیر ارشد و مؤسس سایت
آواتار کاربر
پست: 25
تشکر کرده: 16 پست
تشکر شده: 13 پست
تاریخ عضویت: 20 بهمن 91, 03:55
محل اقامت: اهواز

Re: لغو گزارش خطا

پستتوسط Nabi » 4 مرداد 94, 09:09

در تکمیل صحبتهای دوست خوبمون php6،

اینکار برای جلوگیری از نمایش بخشی از کدها در پیغام های خطا، در زمان رخداد اونهاست که ممکنه سرنخی برای هکر ها باشه.
البته انجام اینکار ممکنه Debug پروژه رو دچار مشکل کنه چراکه توسعه دهنده نیاز به دیدن خطاها داره. از همین جهت، گاهاً با تعریف یک ثابت که تعیین کننده مد debug هست میتونیم مشخص کنیم که error_reporting روشن یا خاموش باشه.
یک کد شبیه به این:
کد: انتخاب همه
define('DEBUG', true);
if (DEBUG) {
   error_reporting(0);
} else {
   error_reporting(E_ALL);
}

که با true قرار دادن اون در زمان توسعه میتونید خطاها رو ببینید و بعد از پایان کار اون رو false کنید تا خطاها دیده نشن.

کار جالب دیگه ای که میشه انجام داد اینه خطاهای سیستمی php رو خودمون مدیریت کنیم. یعنی هم پیغام اونها رو تغییر بدیم و حتی در زمان رخداد، بجای نمایششون، اونها رو در یک فایل ذخیره کنیم و یا حتی به ایمیلی ارسال کنیم.
برای اینکه مدیریت خطاهای سیستمی php رو به دست بگیریم میتونید از قطعه کد زیر استفاده کنید:

کد: انتخاب همه
<?php
// we will do our own error handling
error_reporting(0);

// user defined error handling function
function userErrorHandler($errno, $errmsg, $filename, $linenum, $vars)
{
    // timestamp for the error entry
    $dt = date("Y-m-d H:i:s (T)");

    // define an assoc array of error string
    // in reality the only entries we should
    // consider are E_WARNING, E_NOTICE, E_USER_ERROR,
    // E_USER_WARNING and E_USER_NOTICE
    $errortype = array (
                E_ERROR              => 'Error',
                E_WARNING            => 'Warning',
                E_PARSE              => 'Parsing Error',
                E_NOTICE             => 'Notice',
                E_CORE_ERROR         => 'Core Error',
                E_CORE_WARNING       => 'Core Warning',
                E_COMPILE_ERROR      => 'Compile Error',
                E_COMPILE_WARNING    => 'Compile Warning',
                E_USER_ERROR         => 'User Error',
                E_USER_WARNING       => 'User Warning',
                E_USER_NOTICE        => 'User Notice',
                E_STRICT             => 'Runtime Notice',
                E_RECOVERABLE_ERROR  => 'Catchable Fatal Error'
                );
    // set of errors for which a var trace will be saved
    $user_errors = array(E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE);
   
    $err = "<errorentry>\n";
    $err .= "\t<datetime>" . $dt . "</datetime>\n";
    $err .= "\t<errornum>" . $errno . "</errornum>\n";
    $err .= "\t<errortype>" . $errortype[$errno] . "</errortype>\n";
    $err .= "\t<errormsg>" . $errmsg . "</errormsg>\n";
    $err .= "\t<scriptname>" . $filename . "</scriptname>\n";
    $err .= "\t<scriptlinenum>" . $linenum . "</scriptlinenum>\n";

    if (in_array($errno, $user_errors)) {
        $err .= "\t<vartrace>" . wddx_serialize_value($vars, "Variables") . "</vartrace>\n";
    }
    $err .= "</errorentry>\n\n";
   
    // for testing
    // echo $err;

    // save to the error log, and e-mail me if there is a critical user error
    error_log($err, 3, "/usr/local/php4/error.log");
    if ($errno == E_USER_ERROR) {
        mail("phpdev@example.com", "Critical User Error", $err);
    }
}


function distance($vect1, $vect2)
{
    if (!is_array($vect1) || !is_array($vect2)) {
        trigger_error("Incorrect parameters, arrays expected", E_USER_ERROR);
        return NULL;
    }

    if (count($vect1) != count($vect2)) {
        trigger_error("Vectors need to be of the same size", E_USER_ERROR);
        return NULL;
    }

    for ($i=0; $i<count($vect1); $i++) {
        $c1 = $vect1[$i]; $c2 = $vect2[$i];
        $d = 0.0;
        if (!is_numeric($c1)) {
            trigger_error("Coordinate $i in vector 1 is not a number, using zero",
                            E_USER_WARNING);
            $c1 = 0.0;
        }
        if (!is_numeric($c2)) {
            trigger_error("Coordinate $i in vector 2 is not a number, using zero",
                            E_USER_WARNING);
            $c2 = 0.0;
        }
        $d += $c2*$c2 - $c1*$c1;
    }
    return sqrt($d);
}

$old_error_handler = set_error_handler("userErrorHandler");

// undefined constant, generates a warning
$t = I_AM_NOT_DEFINED;

// define some "vectors"
$a = array(2, 3, "foo");
$b = array(5.5, 4.3, -1.6);
$c = array(1, -3);

// generate a user error
$t1 = distance($c, $b) . "\n";

// generate another user error
$t2 = distance($b, "i am not an array") . "\n";

// generate a warning
$t3 = distance($a, $b) . "\n";

?>



با حذف کد // echo $err; شما میتونید به شکل موقت خطاهای سفارشی شده رو در خروجی مشاهده کنید.

(منبع)

بازگشت به کدنویسی PHP

چه کسی آنلاین است

کاربران حاضر در این انجمن : کاربر عضو شده ای موجود نیست و 0 مهمان