![]() |
הגנה מפני sql injection
אהלן,
אני מאמין שורבכם מתעסקים בזה בכל מערכת, יש לי מערכת גלריה שמקבלת ב GET את מספר העמוד,ולפי זה מציגה את התמונות. כמובן עשיתי שאם יש לי רק 4 עמודים ומישהו מקליד את המספר 7 במקום זה יציג לו את העמוד האחרון. ב GET השתמשתי ב mysql_real_escape_string אבל אם אכניס רק את התו ' זה עדיין יציג לי שגיאה של SQL. יש עוד דרכים להתגונן מפני sql injection? |
אם אלה עמודים, תשתמש בפונקצייה intval
או להפך בבדיקה של REGEX : קוד:
preg_match("/^[0-9]+$/", $page); |
להעשרה:
http://wp.tutsplus.com/tutorials/cre...with-wordpress http://vip.wordpress.com/2011/10/13/...d-sanitization הדוגמאות כאן הן על וורדפרס, זה ממש לא קריטי. ספר מומלץ בנושא: http://www.amazon.com/Pro-PHP-Securi.../dp/1430233184 |
PHP קוד:
|
תומר, זה בדיוק מה שלא נחוץ לעשות (וזאת הסיבה שציינתי את 2 הקישורים בתגובה שלי).
במקרה הזה - כאשר אנחנו מצפים לקלט שהוא מספר שלם, אנחנו נקבל אותו אך ורק אם הוא מספר שלם, אין שום סיבה לבצע עליו סינון כלשהו (ובטח שלא להמיר אותו למספר). צריך לבצע אימות די פשוט: אם הקלט הוא מספר שלם, ממשיכים, אם לא - אין סיבה להמשיך. (בהתאם למקרה) אם המספר גדול מ- 0, ממשיכים, אם לא - אין סיבה להמשיך. ההמשך ידוע. |
if(is_numeric($_GET['id'])){
//other checks } |
ציטוט:
ואני אצטט את הדוגמא.. ציטוט:
|
ציטוט:
אגב עדיף לעשות שימוש ב-real_escape, או בכלל לעבור לשימוש בPDO. ציטוט:
והנה הדוגמה: PHP קוד:
PHP קוד:
|
ציטוט:
הדוגמה השנייה היא bad practice, רצוי להימנע מביצוע casting למשתנה (אם הוא לא מה שהוא אומר להיות, שלא יהיה בכלל או שנקבע אותו לערך ברירת מחדל כלשהוא). |
אם כבר משתמשים ב mysql
http://php.net/manual/en/ref.pdo-mysql.php בקצרה: אחת הסיבות שעשו את הדרייבר הזה הוא בשביל להעביר את ההגנה לדרייבר עצמו לדוגמא: קוד:
$sth = $dbh->prepare('SELECT name WHERE id = :id'); |
ציטוט:
אך אין זה אומר שצריך לוותר גם על האימות. אין שום סיבה לשלוח את השאילתה למסד או בכלל לבצע התקשרות כלשהי עם המסד בנושא כל עוד הערך אינו עונה על ההגדרה הבסיסית ביותר שהיא "מספר שלם הגדול מ- 0". אני לא יודע כמה פעמים עוד אצטרך לומר את אותם הדברים בניסוח שונה, אם אני אומר משהו בצורה לא ברורה אשמח לדעת על זה. |
ציטוט:
הוא פשוט שאל לגבי mysql injection... |
ציטוט:
parameter binding היא דרך נפלאה להפריד לחלוטין בין התחביר של השאילתה לבין הערכים המוצבים בה. |
אימות על ידי ctype_digit.
PHP קוד:
|
כל הזמנים הם GMT +2. הזמן כעת הוא 08:21. |
מופעל באמצעות VBulletin גרסה 3.8.6
כל הזכויות שמורות ©
כל הזכויות שמורות לסולל יבוא ורשתות (1997) בע"מ