![]() |
הגנה מפני 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'); |
כל הזמנים הם GMT +2. הזמן כעת הוא 15:37. |
מופעל באמצעות VBulletin גרסה 3.8.6
כל הזכויות שמורות ©
כל הזכויות שמורות לסולל יבוא ורשתות (1997) בע"מ