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

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

HOLD 30-05-10 11:36

איך לשפר את האבטחה באתר?
 
כרגע זה הקוד שמאחזר נתונים:

PHP קוד:

$Id $_GET['id'];
if(!
ctype_digit($Id)) header('Location:404.php') or die;
$Id mysql_real_escape_string($Id);
$result=mysql_query("SELECT Name,Date,Text FROM Users WHERE Id=".$Id,$link); 

האם יש כאן חור אבטחה?

קראתי איפשהו על איזה שיטה שאתה מכניס משתנים עם סימני שאלה, כדאי לשנות לזה? מישהו מכיר?

תודה.

~The_Sultan~ 30-05-10 12:59

מה זה $link?
ואתה יכול לעשות דבר כזה לדעתי:
PHP קוד:

$Id $_GET['id']; 
if ((!
is_numeric($Id)) || ($Id <= 0))
   
header("Location: 404.php");

$Id mysql_real_escape_string($Id); 
$result=mysql_query("SELECT Name,Date,Text FROM Users WHERE Id=".$Id,$link); 

זה פשוט בודק אם ID זה מספר בעזרת הפונקציה is_numeric, וכמובן שה-AUTO INCREMENT של תאי ID לא יכול להיות 0 או מינוס לכן זה בודק גם את זה.

HOLD 30-05-10 14:07

ציטוט:

נכתב במקור על ידי ~The_Sultan~ (פרסם 765807)
מה זה $link?
ואתה יכול לעשות דבר כזה לדעתי:
PHP קוד:

$Id $_GET['id']; 
if ((!
is_numeric($Id)) || ($Id <= 0))
   
header("Location: 404.php");

$Id mysql_real_escape_string($Id); 
$result=mysql_query("SELECT Name,Date,Text FROM Users WHERE Id=".$Id,$link); 

זה פשוט בודק אם ID זה מספר בעזרת הפונקציה is_numeric, וכמובן שה-AUTO INCREMENT של תאי ID לא יכול להיות 0 או מינוס לכן זה בודק גם את זה.

תודה.
(אם מישהו רוצה להוסיף או משהו הוא מוזמן.)

RS324 30-05-10 14:34

$id = intval($_GET['id']

יהפוך אותו להיות מספרי ואם יכניסו שם שטויות הוא יהפוך להיות 0

Daniel 30-05-10 19:46

בקוד שהבאת יש חור אבטחה רציני.

header לא מבטל את פעולה הסקריפט. הדפדפן יכול "להתעלם" מה-Location, וכמובן - העיבוד ימשך. הדרך שבה אתה מזהה היא בסדר לחלוטין. אפשר גם להשתמש ב-intval, אבל שימוש ב-ctype_digit והפנייה לדף שגיאה נחשב עדיף - רק לא לשכוח לשים exit; / die(); אחרי ה-header

רומן 30-05-10 22:05

עדיף לך לבדוק בדרך הזו:

PHP קוד:

if((int) $id 0


Shay Ben Moshe 30-05-10 22:41

אני רואה שתי אופציות חכמות, אחת להמיר את המשתנה לint (עדיף על ידי casting ולא על ידי intval, הרבה יותר מהיר) מה שחוסם לחלוטין את האופציה להכניס משתנה לא תקין. האופצייה השנייה היא לוודא תקינות בעזרת is_int וזהו.
אופציה 1:
PHP קוד:

$Id = (int)$_GET['id'];
$result=mysql_query("SELECT Name,Date,Text FROM Users WHERE Id=".$Id,$link); 

אופציה 2:
PHP קוד:

$Id $_GET['id'];
if(!
is_int($Id)) {
    
header('Location:404.php');
    die;
}
$result=mysql_query("SELECT Name,Date,Text FROM Users WHERE Id=".$Id,$link); 


HOLD 31-05-10 11:25

ציטוט:

נכתב במקור על ידי MasterT (פרסם 765875)
בקוד שהבאת יש חור אבטחה רציני.

header לא מבטל את פעולה הסקריפט. הדפדפן יכול "להתעלם" מה-Location, וכמובן - העיבוד ימשך. הדרך שבה אתה מזהה היא בסדר לחלוטין. אפשר גם להשתמש ב-intval, אבל שימוש ב-ctype_digit והפנייה לדף שגיאה נחשב עדיף - רק לא לשכוח לשים exit; / die(); אחרי ה-header

אם אני עושה ככה:

PHP קוד:

header('Location:404.php') or die; 

זה מונע מהדפדפן להתעלם? או שצריך לרשום את ה-die שורה מתחת?

תודה לכל המגיבים.

~The_Sultan~ 31-05-10 12:38

ההבדל בין הפעולה exit ל-die() זה ש-exit מסיימת את פעילות הצד שרת ו-die() מסיימת אותה עם אפשרות לביצוע פעולה כלשהי. אני חושב שאתה יכול לעשות פשוט ככה:
PHP קוד:

die(header("Location: 404.php")); 

גם מה שאתה כתבת אמור לעבוד.

HOLD 04-06-10 12:50

ציטוט:

נכתב במקור על ידי MasterT (פרסם 765875)
בקוד שהבאת יש חור אבטחה רציני.

header לא מבטל את פעולה הסקריפט. הדפדפן יכול "להתעלם" מה-Location, וכמובן - העיבוד ימשך. הדרך שבה אתה מזהה היא בסדר לחלוטין. אפשר גם להשתמש ב-intval, אבל שימוש ב-ctype_digit והפנייה לדף שגיאה נחשב עדיף - רק לא לשכוח לשים exit; / die(); אחרי ה-header

איך אני יכול להתעלם מה-location?
ואם אני משתמש ב-or die() זה שקול לזה שאני ארשום die() שורה מתחת? או שיש בזה חור אבטחה?


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

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