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

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

-VladK- 01-06-06 05:47

כיצד ניתן ללאבטחת את הGET?
 
כלומר...
ידוע שאפשר להוסיף קודים זדוניים בGET...כלומר במקום:
index.php?p=134
אפשר להחליף ת134 בOR למשל או כל דבר אחר...אז איך אני יכול לעשות שקודם שהPHP יבדוק אם מה שהוא קלד הוא 100% מספר? ידוע שיש לדוגמה את האות e שתכלס היא גם "מספר" כי יש לך במתמתיקה ערך מספרי...אז איך אני יכול לעשות כך שהוא יקח אך ורק מספרים ? (אהה ושאלו יהיו מספרים שלמים בלבד...)

אההה ויש לי עוד שאלה...
נגיד ואני רוצה לעשות הוצאה של נתונים מהמסד מID שנמצא בכתובת...כלומר אני נכנס ככה:
index.php?act=news&id=452
כיצד אני יכול לעשות כך שנגיד וכתבה מס' 452 לא נמצאת אז שידפיס שהכתבה לא נמצאת...

omaniusd 01-06-06 06:45

ציטוט:

נכתב במקור על ידי CriSis
כלומר...
ידוע שאפשר להוסיף קודים זדוניים בGET...כלומר במקום:
index.php?p=134
אפשר להחליף ת134 בOR למשל או כל דבר אחר...אז איך אני יכול לעשות שקודם שהPHP יבדוק אם מה שהוא קלד הוא 100% מספר? ידוע שיש לדוגמה את האות e שתכלס היא גם "מספר" כי יש לך במתמתיקה ערך מספרי...אז איך אני יכול לעשות כך שהוא יקח אך ורק מספרים ? (אהה ושאלו יהיו מספרים שלמים בלבד...)

אההה ויש לי עוד שאלה...
נגיד ואני רוצה לעשות הוצאה של נתונים מהמסד מID שנמצא בכתובת...כלומר אני נכנס ככה:
index.php?act=news&id=452
כיצד אני יכול לעשות כך שנגיד וכתבה מס' 452 לא נמצאת אז שידפיס שהכתבה לא נמצאת...

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

כלל ברזל2-
תבנה דפי שגיאה מותאמים אישית לכל שגיאה שעלולה להיות.

מפה, זה כבר תלוי בארכיטקטורה של המערכת שלך.

-VladK- 01-06-06 07:29

ציטוט:

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

כלל ברזל2-
תבנה דפי שגיאה מותאמים אישית לכל שגיאה שעלולה להיות.

מפה, זה כבר תלוי בארכיטקטורה של המערכת שלך.

לא ממש הבנתי את הראשון...והשני כבר מוכן אצלי...על כל שגיאה יש לי כבר עמוד משלה....

בניה 01-06-06 07:52

ב"ה


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

Eli-Hai 01-06-06 08:01

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

ישנן מספר פונקציות, אשר יעזרו לך לדעת אם ה$_GET מכיל -
  • אותיות (abc)
  • מספרים (123)
  • אותיות ומספרים (abc123)
ברגע שהוא מוצא אותיות, הוא יכול להדפיס שגיאה (הMySQL), וכך בעצם לגרום לשגיאות, אך אנחנו נחסום זאת עם פונקציה פשוטה, is_numeric().

הקוד הוא פשוט, וכתבתי לך קוד קל לדוגמא,
PHP קוד:

$page $_GET['p'];

if( empty(
$page) ) exit("Error: Costum Error.");
elseif( !
is_numeric($page) ) exit("Error: Costum Error."); 

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

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

EDIT
לגבי שאלתך השנייה, אני לא ממש הבנתי, אך בכל מקרה כתבתי הסבר, אממ, הבנתי מהשאלה, שאתה רוצה לדעת, אם קיים במסד הנתונים שלך מאמר / כתבה בעלת הID המצויין. עושים שימוש בmysql_num_rows() ובתנאי פשוט. כתבתי לך גם את השיאלתה וגם את השליפה, אם לא יעבוד, אני אעבוד על זה מאוחר יותר בlocalhost.

PHP קוד:

$id $_GET['id'];

$sql "SELECT * FROM `table` WHERE `id` = " $id;
$result mysql_query($sql) or die(mysql_error());

$count mysql_num_rows($result);
    if(
$count == 0) exit("Article don't exists");

while(
$output mysql_fetch_object($result))
    echo 
$output->article


eLad 01-06-06 08:17

בעיקרון במספרים זו דרך העבודה שלי:

קוד:

var nId = fCheckIsNumeric(Request.QueryString("nId")) || 0
הפונקציה fCheckIsNumeric מקבל ביטוי כלשהו (מחרוזת), מפרקת ממנו את כל מה שהוא לא מספר בעזרת RegExp ומחזירה מספר או Null, אם היא תחזיר null אז nId ייקבל 0 בהתאם לתנאי שרשום מעלה ואז בעצם המערכת תכנס ל EOF (לא נמצאו רשומות) ובזה פתרנו את הבעיה

Tomer 01-06-06 10:37

PHP קוד:

$id mysql_escape_string($_GET['id']); 

יעשה לך את העבודה בד"כ בנוגע לאבטחה והזרקות בכתובת..

-VladK- 01-06-06 11:08

ומה הוא עושה?


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

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