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

הוסטס - פורום אחסון האתרים הגדול בישראל (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?

תודה רבה!!

DvirCohen 29-01-09 21:56

כן, ברור שאפשר יותר מהגנה אחת.
לשאלתך - mysql_real_escape_string מבריח ', ככה שעדיין אפשר היה להכניס לך XSS.

בניה 29-01-09 23:04

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

ואם אתה רוצה למנוע מאנשים להחדיר לך כל מיני דברים לשאילתות שלא אמורים להיות שם אתה משתמש בmysql_escape_string או מאמת שהמידע באמת מהסוג המתאים

עריכה:
לא יצא לי להשתמש בזה, אבל
http://htmlpurifier.org/
אמור לתת לך נקיון יותר בטוח לHTML

dor77 30-01-09 13:06

תודה.
תראו,
אני מכניס למסד נתונים, האופציה פתוחה לכולם, יש לי טופס שקולט את המשתנה ב POST, מכניס אותו למסד, ואז דף אחד מציג את הנתונים מהמסד.
אני רוצה שלא יוכלו להכניס html ולא יוכלו להוסיף ' כלומר לבצע sql injection.
אבל עושים sql injection רק ב get לא? כי מוסיפים ' בכתובת.
אז האם אני צריך לאבטח POSTים ב htmlspacialchars וGETים ב mysql_real_escape_string, אני צודק?
למשל id, שמוצג בכותרת אני מאבטח ב mysql_real_escape_string ואת הנתונים אני מקבל מטופס כמו העלאת מדריכים/חדשות/כל נתון אחר אז אני מעביר ב htmlspacialchars.

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

תודה.


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

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