यह सामग्री शुरुआत प्रोग्रामर के लिए है।
सामग्री
त्रुटि प्रदर्शन
ऐसा क्यों है कि मैं अक्सर किसी वेबसाइट पर कुछ इस तरह से देखता हूँ:
चेतावनी: अपरिवर्तित स्थिर LOCAL_SERVER का उपयोग - लाइन 13 में /web/includes/page-definitions.php में 'LOCAL_SERVER' मान लिया गया
यह मानक PHP त्रुटियों में से एक है, जो कि एक) उपयोगकर्ता के लिए बदसूरत है; b) संभावित खतरनाक।
इसलिए, उन्हें दखल और आदेश दिया जाना चाहिए।
सबसे पहले,
error_reporting फ़ंक्शन हमें यह तय करने की अनुमति देता है कि हम किन त्रुटियों को देखना चाहते हैं।
सिद्धांत रूप में, यह केवल सभी त्रुटियों (error_reporting (0)) के प्रदर्शन को बंद करने के लिए पर्याप्त है, लेकिन हमें इसकी आवश्यकता नहीं है, क्योंकि हम त्रुटियों के बारे में जानना चाहते हैं।
सभी त्रुटियों का स्थिर E_ALL है।
पांचवें संस्करण में, निरंतर E_STRICT दिखाई दिया, जो कोड के बारे में सख्त टिप्पणियां दिखा रहा है।
बेशक, उन्हें देखना वांछनीय है, लेकिन वे E_ALL में शामिल नहीं हैं, इसलिए हम संख्यात्मक मान error_reporting (8191) का उपयोग करेंगे, जो छठे संस्करण की नई त्रुटियों तक, सब कुछ अवशोषित करता है।
जिज्ञासु के लिए ध्यान दें: error_reporting (E_ALL | E_STRICT) उपयुक्त नहीं है, क्योंकि तब PHP 4 शपथ ग्रहण करेगा, न कि यह जानकर कि E_STRICT क्या है। संख्यात्मक मूल्य के साथ कोई समस्या नहीं होगी।
हम DEBUG के लिए एक चेक जोड़ते हैं - कॉन्फ़िगरेशन में एक निरंतर सेट, और,
set_error_handler का उपयोग करके, हम पहले से चल रही सेवा में त्रुटियों को पकड़ लेंगे। वैसे, आपका त्रुटि रिपोर्टर सही लौटना चाहिए, अन्यथा PHP एक मानक त्रुटि फेंक देगा।
परिणाम:
(पांच मापदंडों के साथ एक चर की तुलना करने के लिए, मैं एक विधि की पसंद के बारे में निश्चित नहीं हूं: in_array, सुंदर और बहुत धीमा है, और स्विच केस का मामला तेज है, लेकिन पूरी तरह से बदसूरत है। सौंदर्य एक व्यक्तिपरक मामला है ...
<?php
error_reporting(8191);
if (!DEBUG)
{
function errorHandler ($errno, $errstr, $errfile, $errline)
{
if ($errno == E_ERROR ||
$errno == E_PARSE ||
$errno == E_CORE_ERROR ||
$errno == E_COMPILE_ERROR ||
$errno == E_USER_ERROR)
{
}
return true;
}
set_error_handler('errorHandler');
}
?>
register_globals
4.2.0 register_globals PHP .
, , , PHP if ($username == 'admin')…
, .
POST, GET, COOKIE superglobals $_POST, $_GET, $_COOKIE.
import_request_variables, .
.
.register_globals:
<?php
...
if (check_admin($..., $...))
{
...
$user_level = 169;
}
...
if ($user_level > 150)
{
echo 'Boom!';
}
?>
— , $user_level
( 0 , , 0 ),
foo.php?user_level=999 .
SQL injection magic_quotes
<?php
$user = mysql_fetch_assoc(mysql_query("SELECT * FROM `users` WHERE `username` = '{$_POST['username'}' AND `password` = '{$_POST['password']}'"));
?>
. ' OR `username` = 'admin, .
, , .
, - , SQL injection.
PHP , , , escape ( ,
addslashes).
?
. , . , .
, 100- SQL injection.
. ) , . ) , SQL
mysql_real_escape_string ( ).
:
<?php
{
if (function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc())
{
function stripslashes_deep($value)
{
if(is_array($value))
{
$value = array_map('stripslashes_deep', $value);
}
elseif (!empty($value) && is_string($value))
{
$value = stripslashes($value);
}
return $value;
}
$_POST = stripslashes_deep($_POST);
$_GET = stripslashes_deep($_GET);
$_COOKIE = stripslashes_deep($_COOKIE);
}
}
?>
(mysql_real_escape_string — , . ?)
<?php
function quote($value) {
if (!is_numeric($value)) {
$value = "'".mysql_real_escape_string($value)."'";
}
return $value;
}
?>
. - SQL, quote:
<?php
$user = mysql_fetch_assoc(mysql_query('SELECT * FROM `users` WHERE `username` = '.quote($_POST['username']).' AND `password` = '.quote($_POST['password'])));
?>
, .
.
,
.
, , .
<?php
if (are_bad_symbols($data)) boo();
?>
<?php
if (!all_good_symbols($data)) boo();
is_numeric($data);
preg_match('/[a-z0-9_-]*/i', $data)
...
?>
, .
, - %00 , , , .
, , , , .
.
.
,
.
include, require, readfile, eval, ``, system, exec, create_function, dir, fopen .
, , , , — - .
<?php
include($_GET['module'] . '.php');
?>
. '../../../../../etc/passwd%00', , — -.
, cookies , , .
, , — .
cookies ID.
PHP , .
<?php
session_start();
$_SESSION['userid'] = 168;
session_write_close();
?>
, cookies - , ?$_GET, $_POST, $_COOKIE, .
Trust no one! :)