You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							134 lines
						
					
					
						
							3.7 KiB
						
					
					
				
			
		
		
	
	
							134 lines
						
					
					
						
							3.7 KiB
						
					
					
				<?php
 | 
						|
ini_set('log_errors', 0);
 | 
						|
ini_set('display_errors', 1);
 | 
						|
error_reporting(E_ALL | E_STRICT);
 | 
						|
 | 
						|
// --- Handle config ---
 | 
						|
 | 
						|
$defaults = array(
 | 
						|
    // how many spaces to use for indention, 0 will make it use real tabs
 | 
						|
    'tabsize' => 4,
 | 
						|
 | 
						|
    // whitelist of IPs
 | 
						|
    // use '*' to allow any IP
 | 
						|
    'ip_whitelist' => array('127.0.0.1', '::1'),
 | 
						|
 | 
						|
    // bootstrap file, if defined this file will be included before
 | 
						|
    // the code entered by the user is evaluated. any variables and classes
 | 
						|
    // defined here will be accessible by the eval'd code
 | 
						|
    'bootstrap' => null,
 | 
						|
);
 | 
						|
 | 
						|
if (file_exists(__DIR__.'/config.php')) {
 | 
						|
    $options = include __DIR__.'/config.php';
 | 
						|
    $options = array_merge($defaults, $options);
 | 
						|
} else {
 | 
						|
    $options = $defaults;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
// --- IP Whitelist ---
 | 
						|
 | 
						|
if (!in_array('*', $options['ip_whitelist'], true) &&
 | 
						|
    !in_array($_SERVER['REMOTE_ADDR'], $options['ip_whitelist'], true)
 | 
						|
) {
 | 
						|
	header("HTTP/1.0 401 Unauthorized");
 | 
						|
    die('Access Denied');
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
$debugOutput = '';
 | 
						|
 | 
						|
if (isset($_POST['code'])) {
 | 
						|
	ini_set('html_errors', false);
 | 
						|
 | 
						|
    $code = $_POST['code'];
 | 
						|
 | 
						|
    // --- Evaluate the code ---
 | 
						|
 | 
						|
    ob_start();
 | 
						|
    $memBefore = memory_get_usage(true);
 | 
						|
    $start = microtime(true);
 | 
						|
 | 
						|
    // Remove the < ?php mark
 | 
						|
    // TODO remove also ? > if present
 | 
						|
    $code = preg_replace('{^\s*<\?(php)?\s*}i', '', $code);
 | 
						|
 | 
						|
    /** Run code with bootstrap in separate scope */
 | 
						|
    function runCode($__source_code, $__bootstrap_file)	{
 | 
						|
	    if ($__bootstrap_file) {
 | 
						|
	        require $__bootstrap_file;
 | 
						|
	    }
 | 
						|
	    eval($__source_code);
 | 
						|
	}
 | 
						|
 | 
						|
    runCode($code, $options['bootstrap']);
 | 
						|
 | 
						|
    $end = microtime(true);
 | 
						|
    $memAfter = memory_get_peak_usage(true);
 | 
						|
    $debugOutput .= ob_get_clean();
 | 
						|
 | 
						|
    // ---------------------------
 | 
						|
 | 
						|
    if (isset($_GET['js'])) {
 | 
						|
 | 
						|
    	// --- Send response with metadata in headers ---
 | 
						|
        header('Content-Type: text/plain');
 | 
						|
 | 
						|
        $memory = sprintf('%.3f', ($memAfter - $memBefore) / 1024.0 / 1024.0); // in MB
 | 
						|
        $rendertime = sprintf('%.3f', (($end - $start) * 1000)); // in ms
 | 
						|
 | 
						|
        header('X-Memory-Usage: '. $memory);
 | 
						|
        header('X-Rendertime: '. $rendertime);
 | 
						|
 | 
						|
        echo $debugOutput;
 | 
						|
 | 
						|
        die('#end-php-console-output#');
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
?>
 | 
						|
<!DOCTYPE html>
 | 
						|
<html>
 | 
						|
    <head>
 | 
						|
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
 | 
						|
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
 | 
						|
 | 
						|
        <title>PHP Sandbox</title>
 | 
						|
 | 
						|
        <link rel="stylesheet" type="text/css" href="styles.css" />
 | 
						|
        <script src="jquery-1.9.1.min.js"></script>
 | 
						|
        <script src="ace/ace.js"></script>
 | 
						|
        <script src="ace/theme-monokai.js"></script>
 | 
						|
        <script src="ace/mode-php.js"></script>
 | 
						|
        <script src="php-console.js"></script>
 | 
						|
 | 
						|
        <script>
 | 
						|
            $.console({
 | 
						|
                tabsize: <?= json_encode($options['tabsize']) ?>
 | 
						|
            });
 | 
						|
        </script>
 | 
						|
    </head>
 | 
						|
    <body>
 | 
						|
        <div class="console-wrapper">
 | 
						|
            <div class="input-wrapper">
 | 
						|
                <form method="POST" action="" id="mainform">
 | 
						|
                    <div class="input">
 | 
						|
                        <textarea class="editor" id="editor" name="code"><?=
 | 
						|
                        	(isset($_POST['code']) ? htmlentities($_POST['code'], ENT_QUOTES, 'UTF-8') : "<?php\n\n")
 | 
						|
                        ?></textarea>
 | 
						|
                    </div>
 | 
						|
                        <div class="statusbar">
 | 
						|
                            <span class="position">Line: 1, Column: 1</span>
 | 
						|
                            <span class="runtime-info"></span>
 | 
						|
                			<input type="submit" name="subm" value="Run!"/>
 | 
						|
                        </div>
 | 
						|
                </form>
 | 
						|
            </div>
 | 
						|
            <div class="output-wrapper">
 | 
						|
                <div class="output"><?= htmlentities($debugOutput) ?></div>
 | 
						|
            </div>
 | 
						|
        </div>
 | 
						|
    </body>
 | 
						|
</html>
 | 
						|
 |