שאלות

yair24

Member
שאלות

שלום, 1. יש לי מספר רשומות של טקסט במסד נתונים נגיד משהו כמו ספר אורחים. עכשיו מה שאני רוצה לעשות זה דף מנהל שיכול למחוק כמה רשומות שהוא רוצה. אז הדף מציג את כל ההודעות בטבלה ולכל הודעה הוא מצרף גם CHECKBOX עם VALUE שהוא המספר הסידורים של ההודעה. המנהל מסמן את כל ההודעות למחיקה ולוחץ מחק. עכשיו השאלה היא איך אני קולט את כל הCHECKBOXES האלה... זה מופיע לי ככה:
pd=1&pd=4&pd=6&pd=7​
איך אני קולט את זה? 2. COOKIES אם אני משתמש בSETCOOKIES הוא אומר לי שצריך לרשום את זה למעלה מעל הכל... בASP אפשר לעשות RESPONSE.COOKIES מתי שרוצים... אין דבר כזה בPHP? יאיר
 

yair24

Member
אני צריך את הCOOKIES בשביל...

יש לי דפי ADMIN אני צריך שכשהמנהל מכניס ססמא ושם משתמש ולוחץ SUBMIT אז בדף הACTION של הFORM הוא בודק אם הססמא בסדר ואז אם כן הוא שם COOKIE שנעלמת מיד כשסוגרים את הדף. אבל כל עוד לא סגרו את הדף אז הוא בLOGIN ואז יש עוד כל מיני דפי ניהול שבודקים אם הCOOKIE קיים ואם כן זה אומר שהבן אדם עדיין בLOGIN הקטע הוא שאני חייב לבדוק את המסד נתונים בשביל להשוות את הססמאות אבל אחרי בדיקה כזאת הוא כבר לא נותן לי לשים COOKIE. בASP עשיתי בדיוק ככה וזה עבד. אם זאת לא הדרך בPHP אני אשמח אם מישהו יוכל להסביר איך עושים את זה. תודה יאיר
 

yair24

Member
אוקיי בקשר לCOOKIES

כנראה שלא ככה עושים את זה בPHP... מצאתי פתרון כאן: http://www.chipmunk-scripts.com/tutorials/loginsystem.php אם למישהו יש זמן לקרוא את זה וחושב שזאת לא הדרך הנכונה הוא מוזמן להגיב. (למרות שהרבה תגובות, אין פה...) בקשר לשאלה השניה עם הCHECKBOXES עוד לא מצאתי אם מישהו יודע שיכתוב בבקשה. יאיר
 

yair24

Member
SESSION...

לפי מה שהבנתי בASP לא כל כך מומלץ להשתמש במשתני SESION כי למשל אם יש לך פורום שיש בו הרבה אנשים בLOGIN ברגע אחד נתון, אז אם הLOGIN שלהם רשום בCOOKIE אז זה טוב כי זה לוקח את הCOOKIE מהמחשב של הלקוח. אבל אם זה משתנה SESSION אז כל משתנה כזה לוקח משאבים מהשרת, ואז זה מאט את הכל. וככל שיש יותר אנשים בLOGIN זה יותר איטי. בעיקרון אצלי זה לא משנה כי יש רק מנהל אחד שהוא בLOGIN אבל סתם בשביל העיקרון. זה נכון ההשוואה פה? או שהSESSION הזה לא קשור למשתני SESSION בASP...? יאיר
 

N i X

New member
אגב, ניראה לי שאפשר לפרוץ את זה...

אם נסתקל רגע לסקריפט שבודק אם שם המשתמש והסיסמא נכונים:
<? if (isset($submit)) // name of submit button { $query = "select * from logintable where username='$username' and password='$password'"; $result = mysql_query($query) ; $isAuth = false; //set to false originally while($row = mysql_fetch_array($result)) { if($row['username'] === $username) //above row checks to see if username/password combination exists { $isAuth = true; session_start(); session_register('username'); } } if($isAuth) { print "logged in successfully<br>"; print "<A href='index.php'>Go to Admin Panel</a>"; } else //if login/pass does not exist { print "Wrong username or password"; } } ?>​
כמה טענות בקשר לקוד: א. משתמש ב register_globals, זה מילא, סתם מעצבן. ב. מעביר ישר את המשתנים מה form, לתוך ה query, מה שמאפשר לפורץ, לרשום כסיסמא מה שבא לו, וכך לנסות לשים משהו בQUERY:
"open' OR 1 OR '"​
(בלי הגרשיים בסוף ובהתחלה) וכך נקבל:
$username == 'bla' $password == "open' OR 1 OR '"
מה שיתן לנו את הquery:
select * from logintable where username='bla' and password='open' OR 1 OR ''​
הquery הזה, יחזיר את כל הרשומות בטבלה. לפורץ נשאר לגלות מה השם הראשון בטבלה, אומנם לא קל, אבל כך אפשר לקבל גישה כמשתמש הראשון שרשום בטבלה, בלי לדעת את הסיסמא. אגב, אם להתאמץ קצת, אפשר פשוט להוסיף משתמש משלך. נחשו מה יקרה אם נשים בשדה של הסיסמא:
"open' OR 1; INSERT INTO logintable (username, password) VALUES ('owned', 'owned'); SELECT logintable where username='owned' and password='owned"​
אולי הסקריפט לא יעבוד טוב, אבל הפורץ הצליח להוסיף את עצמו לבסיס נתונים. זה מאוד לא בטוח להעביר דברים ישר לquery בלי לבדוק אותם קודם.
 

yair24

Member
יפה!!

הבנתי פחות או יותר את הכוונה של הפורץ. אבל רגע בשביל שהפורץ יראה את הרשומות האלה זה צריך להציג לו אותם על הדפדפן ואין שם קוד שמציג את הרשומות לא? אין שם ECHO... או שלא הבנתי טוב? ואם אתה יכול להסביר את שוב את השאילתה הזאת עם ה1 OR 1? מה קורה שם בדיוק? אני הבנתי רק בערך וחשוב לי להבין את זה לעומק... יאיר
 

N i X

New member
הנה...

ה OR 1; בא שם בשביל להפוך את התנאי לאמת, יש שם הרי:
SELECT * from bla WHERE user='$user' AND pass='$pass'​
מה שאני עושה, זה בעצם להוסיף OR 1; ואז אנחנו מקבלים:
SELECT * from bla WHERE user='$user' AND pass='$pass' OR 1;​
השאילתה הזאת בעצם אומרת, תביא לי רשומות שהשם משתמש בהן שווה ל$user והסיסמא שווה ל$pass. או (OR) שתביא לי רשומות שיש בהן משהו בכלל (1). ולכן זה יביא את כל הרשומות. אם תסתקל בקוד, הוא בודק רק את הרשומה הראשונה, לכן אתה צריך לדעת את השם משתמש הכי ראשון, שזה קצת בעיה. אם כבר, אז הפורץ בטח ילך על האפשרות השניה, ופשוט יוסיף לעצמו שם וסיסמא משלו.
 

yair24

Member
רגע

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

N i X

New member
הוא צריך לנחש את השם הראשון בטבלה.

זה מה שאמרתי.
 

N i X

New member
פתרון אפשרי...

if (!ereg("^[[:alnum:]_]+$", $user) || !ereg("^[[:alnum:]_]+$", $pass)) { die(print("only alphanumeric caracters and '_' allowed")); }​
 

yair24

Member
גם שיטה 2 בלתי אפשרית

אם אתה מנסה לפרוץ איך אתה יודע שקוראים לטבלה LOGIN TABLE? הרי אתה לא יכול לראות את זה... אלא אם כן ממש הצלחת לפרוץ לשרת אבל אז אתה לא צריך בכלל להוסיף את עצמך אתה פשוט יכול להסתכל ולראות שמות קיימים.... יאיר
 

N i X

New member
כל השיטות בלתי אפשריות

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

N i X

New member
עוגיות נשלחות בheader נקודה.

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

yair24

Member
למה לא נותן דבר?

קודם כל תודה על ההתיחסות... הטבלה נבנית בצורה דינאמית לCHECKBBOX יש את אותו NAME אבל המנהל כל פעם מסמן מספר הודעות שונה למחיקה. כלומר הוא יכול לבחור את הודעה 1 2 5 8 למחוק, ואז זה יעבור בצורה כזאת: pd=1&pd=2&pd=5&pd=8 ופעם אחרת הוא יכול לסמן את הודעות 22 ו14 ואז זה יעבור ככה: pd=22&pd=14 לא יכול להיות שPHP לא יודע לקבל את הנתונים האלה כמערך באיזה שהיא צורה... אתה אומר שזאת לא הדרך לעשות את זה? יאיר
 

yair24

Member
טעות שלי!!

חשבתי שהיה כתוב שם INPUT TYPE אבל כתוב INPUT NAME זאת אומרת שמה שאני צריך לעשות זה בעצם ככה:
input type=checkbox name=array[]​
ואז אני צריך לקלוט את זה באיזשהי צורה... חבל שהם לא כותבים ליד הנושא הזה שם איך קולטים את זה בPHP... אבל אני אחפש שם תודה יאיר
 

N i X

New member
אתה מקבל את זה במערך...

תראה למעטה, יש בתגובות דוגמאות.
 
למעלה