הוסטס - פורום אחסון האתרים הגדול בישראל

הוסטס - פורום אחסון האתרים הגדול בישראל (https://hosts.co.il/forums/index.php)
-   פורום תיכנות (https://hosts.co.il/forums/forumdisplay.php?f=14)
-   -   אבטחת מידע, 2 שאלות וקצת עזרה (https://hosts.co.il/forums/showthread.php?t=77284)

SniR-S 04-08-09 22:19

אבטחת מידע, 2 שאלות וקצת עזרה
 
דבר ראשון, איך אני יכול לעשות שיהיה במשתה מסויים רק מספר ולא טקסט? (URL הזרקות)
דבר שני, איך אתם מאבטחים? עם איזה שיטות אתם עובדים נגד הזרקות?
אתם מסננים מילות SQL ? \:
אשמח לקבל קצת מידע לגבי זהתוה :-)

Shillo 04-08-09 22:40

אם אתה רוצה לעשות משתנה מסויים רק מספר, זה לא אפשרי בPHP.
מה שכן, עם PHP 5 אתה יכול לסנן טיפוסים של ארגומנטים שמועברים לפונקציה, זה נקרא Type Hinting. למשל אתה יכול ליצור פונקציה כזו:
קוד:

function setNum(int $value)
{
  global $num ;
  $num = $value ;
}

אם תנסה להעביר לפונקציה ארגומנט שהוא לא מטיפוס מספר שלם (int / integer ), אז PHP יציג שגיאה. דוגמא:
קוד:

setNum("this is a string") // תחזיר שגיאה

$int = 32;
setNum($int) // לא תחזיר שגיאה, כי הארגומנט הוא 32 (טיפוס = מספר שלם = int / integer )

בקשר להגנה נגד הזרקות, הפיתרון הוא מאוד פשוט. לפני שאתה מוציא לפועל את השאילתת SQL שלך, אתה צריך להעביר את השאילתה דרך פונקציה מסויימת שמטפלת בתווים אסורים בתוך השאילתה. ( הפונקציה בסה"כ מוסיפה לוכסן אחורי "\" לפני התו האסור)
דרך נוספת לעשות את זה, זה עם ביטויים רגולרים, אבל אין צורך. בכל מקרה, בPHP לפי מה שאני בדקתי בכמה ממשקים של מסדי נתונים, יש בהם פונקציה שנקראת real_escape_string, למשל, אם אתה משתמש במסד mysql, אתה יכול להשתמש בפונקציה הזאתי
שתטפל בתווים האסורים בשאילתה שלך:
mysql_real_escape_string.

אם אתה רוצה פונקציה שלא דורשת עבודה עם מסד נתונים מסויים, אז קח:
קוד:

          function real_escape_string( $unescaped_string ) {
                  $prepend_chars = array() ;
                  $prepend_chars["\\\x00"] = "\x00" ;
                  $prepend_chars["\\\n"] = "\n" ;
                  $prepend_chars["\\\r"] = "\r" ;
                  $prepend_chars['\\\''] = "'" ;
                  $prepend_chars["\\\""] = "\"" ;
                  $prepend_chars["\\\x1a"] = "\x1a" ;

                  foreach( $prepend_chars as $key => $value )
                          $unescaped_string = str_replace( $value, $key, $unescaped_string ) ;

                  return $unescaped_string ;
          }

אם לא הבנת משהו תגיד לי.

SniR-S 05-08-09 09:22

שאלה, לכל משתנה שנשלח לשאילתא אני אמור להצמיד הפונקציה mysql_real_escape_string ?
ומה עם שאילתות שאני מוציא? (שולח מהשרת למשתמש)
אגב לא הבנתי כ"כ את הפונקציה, הבנתי שהיא מסננת ירידת / שבירת שורה
מספרים הקסדצימלים, גרש וגרשיים מה זה אבל x1a ?, ואיך אני משתמש בה?
בצורה הזו זה בסדר?:
PHP קוד:

real_escape_string($name);
// או שאני חייב משתנה?
$name real_escape_string($name); 


Jerba 05-08-09 09:47

בקשר לשאלה הראשונה, במקום שיזרוק שגיאה..

אתה יכול לבדוק עם הפונקציה הזאת אם המשתנה מכיל רק מספרים: http://il.php.net/manual/en/function.is-numeric.php

בהצלחה

Shillo 05-08-09 12:06

ציטוט:

נכתב במקור על ידי Snir Shamka (פרסם 732059)
שאלה, לכל משתנה שנשלח לשאילתא אני אמור להצמיד הפונקציה mysql_real_escape_string ?
ומה עם שאילתות שאני מוציא? (שולח מהשרת למשתמש)
אגב לא הבנתי כ"כ את הפונקציה, הבנתי שהיא מסננת ירידת / שבירת שורה
מספרים הקסדצימלים, גרש וגרשיים מה זה אבל x1a ?, ואיך אני משתמש בה?
בצורה הזו זה בסדר?:
PHP קוד:

real_escape_string($name);
// או שאני חייב משתנה?
$name real_escape_string($name); 


x1a אני לא בדיוק יודע, אבל אני יודע שזה ברשימת התווים המסוכנים של הSQL.

בקשר לקוד שכתבת, אם תכתוב רק real_escape_string($name); זה לא טוב, כי הפונקציה לא עובדת עם רפרנס והיא רק מחזירה ערך, זאת אומרת שאתה צריך לעבוד בצורה כזו:
קוד:

// סתם דוגמא, אתה יכול לשים פה מה שאתה רוצה
$name = $_GET['name'];
// אם אתה משתמש בפונקציה שלי
$name = real_escape_string($name);


SniR-S 07-08-09 09:26

אקי, נגיד שזה בסדר עד עכשיו, אבל אני רוצה לאבטח הזרקות GET
לדוגמא אם יהיה במשתנה מסויים תו מסוכן הוא יפנה ישר לעמוד מסויים או יסנן אותו משהו כזה.
אני לא מצליח להכניס את הפונקציה mysql_real_escape_string למשתנה GET
זתומרת, זה לא מועיל היא לא עושה כלום ?
אני רוצה שלא יוכלו לפצל לי את השאילתא ובכלל לא לשלוח שאילתות במשתנים
לסנן את התווים שלהם ומילות שמורות..

intercooler3819 07-08-09 09:39

בנוגע למספרים
אתה יכול לקבל גם מספר שכולל את האות E ואני מניח שזה קצת גדול עליך ולא תכננת שיעבירו בכתובת.. זה היה עובר את הפונקציה של שילה אבל לא את זו:
PHP קוד:

<?php

function nitsanNumeric($v)
{
     return 
preg_match("~^[0-9]+$~"$v);
}

ואם אתה רוצה עם פונקציות מובנות של php אז יש לך את הפונקציה intval תחפש בגוגל

mayden 07-08-09 13:31

אגב, טיפ קטן.. אם יש לך שדה במסד שאתה יודע שהוא צריך להיות ערך מספרי בלבד - אז כבר במסד הנתונים שים אותו מסוג INT.


כל הזמנים הם GMT +2. הזמן כעת הוא 09:56.

מופעל באמצעות VBulletin גרסה 3.8.6
כל הזכויות שמורות ©
כל הזכויות שמורות לסולל יבוא ורשתות (1997) בע"מ