sql indection

yair24

Member
sql indection

שלום, יש לי את הקוד הבא:
<? $result = mysql_query("SELECT * FROM xxxxx",$mysql_link) ; $isAuth = false; while($row = mysql_fetch_array($result)) { if($row['xxxx'] === $_POST['username'] && $row['xxxxw'] === $_POST['password']) { $isAuth = true; session_start(); $_SESSION['xxxxx'] = $_POST['xxxxx']; } } if($isAuth) { header("Location: xxxx.php"); } else { header("Location: ./"); } ?>​
האם קוד כזה פגיע לSQL INJECTION? יאיר
 

Terminal Frost

New member
לא. אבל הוא לא יעיל בטירוף

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

kensaggy

New member
Terminal Frost...אם כבר , אז כבר :)

א כבר הסברת לו שהקוד ממש לא יעיל (ואף בגדר לא נכון) למה שלא תסביר לו איך עושים את זה בצורה יותר יעילה\נכונה ?
 

kensaggy

New member
בהחלט...

קודם כל, Terminal Frost לא אמר שיש לך 10000 רשומות, אבל מצב זה אפשרי, וזה מה שחשוב - שזה יכול לקרות. גם אם לא אבל.. אין סיבה לשלוף את כל הרשומות בטבלה ואז לעבור על כולן ולהריץ משפטי IF. חשוב על זמן הריצה ועל כמה הוא ארוך. לעומת זאת, אתה יכול לפרט בשאילתא תנאי, ז"א שאתה יכול במילים אחרות "להגיד לבסיס הנתונים": תן לי את כל הרשומות שבהן שם המשתמש הוא "משה" והסיסמא היא "XYZ". ואחרי שעשית את זה, כל שעליך לעשות הוא לבדוק האם למעשה חזרו רשומות שעונות על התנאי הנ"ל. אם יש באמת משתמש שעונה לשם "משה" והסיסמא שלו היא "XYZ" (כפי שהמשתמש ציין בעת ניסיון כניסה למערכת) ז"א שהוא אכן מי שהוא טוען להיות (כי הרי הוא ידע את הסיסמא) בנוסף ניתן להשתמש בפונ' COUNT (של SQL, לא של PHP) ע"מ לקבל ישר את מספר הרשומות שחזרו. 0 - אין עונים על התנאי, או 1 - יש רשומה שעונה על התנאי. (או יותר, ואז יש לך בעיה בבסיס הנתונים מבחינת איך שארגנת את הטבלאות
) אני ממליץ לך לקרוא על WHERE ו COUNT בתיעוד של MySQL. בהצלחה בהמשך,חן.
 

yair24

Member
שאלה לגבי מסד התונים MYSQL

תגיד לי בבקשה: כשאני מבקש מהמסד לתת לי את כל הרשומות שהשם משתמש בהן הוא משה, ונגיד לצורך העניין שיש לי 10000 רשומות כאלה. מה קורה מבחינת מסד הנתונים? האם הוא עובר על כל הרשומות בשביל למצוא את משה? או שזה משהו אחר? כמו למשל HASH TABLE... האם אתה יכול להפנות אותי למקום מדויק ששם כתוב באיזו צורה מימשו את MYSQL? (זה קוד פתוח לא?) יאיר
 

yair24

Member
אתה טועה.

בטבלה יש מספר בודד של רשומות והוא לא משתנה. אבל תודה בכל מקרה על ההערה. יאיר
 

yair24

Member
בכל מקרה מאוד יעזור לי

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

yair24

Member
תיקון הבקשה

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

stac

New member
תנסה את זה.

<?php // {{{ anti_sql_inject() /* * Anti SQL Injection function, string striper. * * additional: * more then that you can limit the user length input in input box! and check the * length in server side too. * * @author Shahar Iphraimov <pamidor a@t walla.co.il> * @module DB abstraction. * @todo make it faster. */ functoin anti_sql_inject($str = '', $on_fail_die=false) { // TODO add more keywords $badWords = array ('select', 'drop', ';', 'insert'); $str = strtolower(str_replace("'", "''", $str)); $count = count($badWords); if ($on_fail_die) { for ($i=0; $i<$count; $i++) if (strpos($str, $badWords[$i]) === true) die; } else { for ($i=0; $i<$count; $i++) { $str = str_replace($str,$badWords[$i], $str); } } } // }}} ?>​
 

kensaggy

New member
למה לעשות עבודה כפולה? ../images/Emo13.gif

הנה: http://www.phpfreaks.com/quickcode/Anti_SQL_Injection_Login_Filter/203.php
-חן.
 

yair24

Member
תגיד לי אם אני צודק:

בדוגמא שם אם המתמש מכניס שם משתמש או ססמא שמכילה למשל תו @ או / הוא לא יוכל לעשות LOGIN אף פעם נכון? כלומר צריך לעשות בדיקה גם בהרשמה שהמשתמש לא מכניס תוים אסורים...? יאיר
 

yair24

Member
אני מתכוון בהרשמה

אני מתכוון שאם מישהו נרשם ובחר ססמא של r%$#//44 אז הוא לא יוכל לעשות LOGIN נכון?
 

yair24

Member
תודה

אני רואה שזה די דומה למה שחן הביא בכל מקרה תודה גם לך על העזרה.
 

N i X

New member
למה לא...

למה לא רק לשים את המחרוזות שאני עובד איתה בגרשיים, ואז הmysql יתייחס לזה כמחרוזת טקסט בלבד, ואז רק לעשות למחרוזות addslashes...
$bla = addslashes($_GET["bla"]); $qur = "select * from mytbl WHERE name='$bla'";​
 
למעלה