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

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

dor77 26-01-09 16:44

עזרה - שימוש בפונצקיה htmlspecialchars
 
שלום.

מן הסתם המערכות שבניתי עד כה פריצות ללא מעט פירצות אבטחה, כי לא עשיתי כלום בשביל לחסום את זה.
אפילו הזרקתי לעצמי XSS.
בשביל למנוע XSS הפונקציה htmlspecialchars מספיקה [?].

מתי אני משתמש בה? בהוצאה? או בהכנסה?

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

תודה (:

daMn 26-01-09 17:32

בעיקרון, מצד האתר בפן האבטחה, אתה צריך לוודא איזה נתונים אתה מקבל מכל מקום שמשתמש יכול להכניס בו קלט, שים לב שקלט ייכנס לך באחד או יותר מהשיטות הבאות POST/GET/COOKIE/SESSION, אתה פשוט צריך לוודא שאם למשל בGET אתה מצפה לקבל ערך שהוא מספר נניח במשתנה בשם id אז אתה משתמש בפונקציות שמוודאות שזה אכן מספר.
אתה צריך לעבור ולסנן על כל קלט אפשרי שיש לך באתר, בשביל נתונים שאתה מכניס למסד נתונים משתמשים בaddslashess ואם המסד שלך הוא MySql ותומך בפונקציה mysql_real_escape_string אז היא מקבלת עדיפות.

dor77 26-01-09 18:15

mysql_real_escape_string זה לא נגיד sql injection?
אני רוצה לחסום בפני sql injection ו xss, בשביל xss מטפסים, אני אמור להשתמש בhtmlspecialchars לא?

אני מקבל נתונים מPOST.

כאילו אני מקבל משתנה מטוספ, ואז מגדיר אותו:

$var=$_POST['var'];

ואז מכניס את $var למסד.

אני אמור להשתמש בפונקציה בדף הזה, שאני מכניס את var למסד?

או בדף שאני מציג את var?

DvirCohen 26-01-09 19:16

תקשיב, אל תחשוב איך לחסום באופן ספציפי XSS או SQL INJ.
תהיה ראש גדול.
כמו שדאמן אמר לך, תסנן את הקלט שאתה מקבל ככה שהוא יהיה רק מה שאתה רוצה שיהיה בו.

אני אתן לך דוגמא,
קודם כל כמובן תשתמש בhtmlspecialchars ותחסום עוד ביטויים מסוכנים באופן ידני (כמו ביטויי JS למיניהם, כל מיני document.cookie ודברים כאלה).

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

ככה לכל סוגי הקלטים שלך..

dor77 26-01-09 20:59

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

ובקשר ל intval, מה זה קשור ל id?
את ה id אני מציג, אני כותב למשל:
"לחץ כאן על מנת להגיע לפרוקיל שלך"
שזה בעצם קישור הוא ככה:
www.example.com/userid=
ואני מוסיף את המשתנה id שהוצא מהמסד.
אין פה קלט, הוא מופיע רק בכתובת.

בכל אופן, אשמח לדוגמא ב htmlspecialchars.

Ron | CSite.co.il 26-01-09 21:03

בטח שיש קלט,
אתה קולט את המשתנה מהכתובת,
תנסה דבר כזה:

תכין דף שקולט id מהכתובת, משהו כזה: example.co.il/index.php?id=5
ואז תשים במקום ה 5 גרש, כלומר:
example.co.il/index.php?id='

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

dor77 27-01-09 21:04

כן, sql injection.
רגע, בוא נתעסק שנייה ב XSS.
מה אני עושה עם המשתנה?
קלטתי אותו מטופס (POST), יש י את השורה הזאת:

PHP קוד:

$var=$_POST['name']; 

את זה אני אמור "לעטוף"?

תודה רבה.

Ron | CSite.co.il 27-01-09 21:10

כן, ככה:

PHP קוד:

$var htmlspecialchars($_POST['name']) ; 


DvirCohen 27-01-09 22:46

רון הראה לך את אופן השימוש.
אבל שוב, הפונקציה הזאת לא מספיקה.
הפונקציה הזאת לא חוסמת את התו ' אלא רק את התווים <>"&.
מה שאומר שנניח ואתה עושה טופס התחברות עם שאילתה כזאת:
PHP קוד:

$user htmlspecialchars($_POST['user']);
$pass htmlspecialchars($_POST['pass']);

$q mysql_query("SELECT * FROM `members` WHERE `user` = '".$user."' AND `pass` = '".$pass."'"); 

אני עדיין יוכל להזריק לך דבר כזה:
קוד:

' OR 'a'='a
והשאילתה תהיה:
קוד:

SELECT * FROM `members` WHERE `user` = 'something' AND `pass` = '' OR 'a'='a'

dor77 29-01-09 15:51

ציטוט:

נכתב במקור על ידי DvirCohen (פרסם 695131)
רון הראה לך את אופן השימוש.
אבל שוב, הפונקציה הזאת לא מספיקה.
הפונקציה הזאת לא חוסמת את התו ' אלא רק את התווים <>"&.
מה שאומר שנניח ואתה עושה טופס התחברות עם שאילתה כזאת:
PHP קוד:

$user htmlspecialchars($_POST['user']);
$pass htmlspecialchars($_POST['pass']);

$q mysql_query("SELECT * FROM `members` WHERE `user` = '".$user."' AND `pass` = '".$pass."'"); 

אני עדיין יוכל להזריק לך דבר כזה:
קוד:

' OR 'a'='a
והשאילתה תהיה:
קוד:

SELECT * FROM `members` WHERE `user` = 'something' AND `pass` = '' OR 'a'='a'

כן, sql injection, אז שאלה, למה לא ישר לשים mysql_real_escape_string?
אפשר לוותר על htmlspecialchars? או שזה משהו שונה?
בכללי, אפשר לשים יותר מהגנה אחת? כלומר גם htmlspecialchars וגם mysql_real_escape_string?

תודה רבה!!


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

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