16-10-2009, 09:55
|
מנהל
|
|
חבר מתאריך: 26.07.08
הודעות: 6,473
|
|
תודה רבה
סידרתי את הקוד המקורי כדי שיהיה נוח לקרוא ולהבין מה קורה:
קוד PHP:
function cleaned_mysql($value)
{
// get_magic_quotes_gpc() = check whether it's active
$magic_quotes_active = get_magic_quotes_gpc();
// function_exists checks whether mysql_real... exists
$new_enough_php_version = function_exists("mysql_real_escape_string");
if ($new_enough_php_version)
{
// if magic_quotes... is active, it means that it already add slashes to value. so... strip them and let mysql_real... do the job
if($magic_quotes_active)
$value = stripslashes($value);
// mysql_real... does the job anyhow
$value = mysql_real_escape_string($value);
}
else
{
// if magic_quotes doesn't exist, then add slashes to $value so it will be prepared to DB
if(!$magic_quotes_active)
$value = addslashes($value);
}
return $value;
}
רק הערה קטנה:
בפונקציה הורדת את לוכסני ההברחה ש-PHP היה שם בעצמו אם magic_quotes היה On.
לענ"ד עדיף יהיה לעשות את זה בתחילת הסקריפט.
הסיבה היא שבמקרים שבהם משתמש שולח מידע באמצעות טופס HTML, ואתה צריך להחזיר את הקלט לשדות הטופס בעקבות שגיאות של קלט לא מתאים - אז בכל מקרה תצטרך להריץ stripslashes על כל הקלט, ולאחר מכן htmlspecialchars.
לכן פונקציית ה-stripslashes לא מתאימה שם.
בנוסף צריך לעשות הפרדה בין פעולות שקשורות לדברים שונים:
אתה מריץ פונקציית stripslashes על קלט מסויים בגלל ש-PHP הוסיף את זה בעצמו אוטומטית, ואנחנו לא מעוניינים בזה. האם יש לזה קשר ל-SQL או MySQL? לא... לכן מבחינה הגיונית (או מבחינה אחרת שאני לא זוכר את שמה) זה לא נכון שהפונקציה stripslahes תהיה ממוקמת בפונקציה שמסננת תוים במחרוזות מידע שיועברו לשאילתא.
נהוג לשים את הפונקציה stripslashes בתחילת הקוד, לפני שמבצעים פעולות על הקלט, לדוגמא:
קוד PHP:
// supplied by php.net
function stripslashes_deep($value)
{
return is_array($value)
? array_map('stripslashes_deep', $value)
: stripslashes($value);
}
if (get_magic_quotes_gpc())
{
// Remove all slashes that were created by PHP
$_GET = array_map('stripslashes_deep', $_GET);
$_POST = array_map('stripslashes_deep', $_POST);
$_COOKIE = array_map('stripslashes_deep', $_COOKIE);
}
// now we have the original input.
לכן אחרי שהורדנו את stripslahses מהפונקציה שכתבת:
קוד PHP:
class interface_MySQL
{
//...
public function init()
{
//...
$this->mysql_real_escape_string_Exists = function_exists("mysql_real_escape_string");
//...
}
public function cleaned_mysql($value)
{
return $this->mysql_real_escape_string_Exists
? mysql_real_escape_string($value)
: addslashes($value);
}
//...
}
וזהו
|