הרשם שאלות ותשובות רשימת חברים לוח שנה הודעות מהיום

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

   
|!|

השב
 
כלים לאשכול תצורת הצגה
ישן 04-08-12, 16:29   # 1
Ori The Man
משתמש - היכל התהילה
 
מיני פרופיל
תאריך הצטרפות: Oct 2005
מיקום: חיפה
גיל: 34
הודעות: 3,694
שלח הודעה באמצעות MSN אל Ori The Man Send a message via Skype™ to Ori The Man

Ori The Man לא מחובר  

הגנה מפני sql injection

אהלן,
אני מאמין שורבכם מתעסקים בזה בכל מערכת,
יש לי מערכת גלריה שמקבלת ב GET את מספר העמוד,ולפי זה מציגה את התמונות.
כמובן עשיתי שאם יש לי רק 4 עמודים ומישהו מקליד את המספר 7 במקום זה יציג לו את העמוד האחרון.
ב GET השתמשתי ב mysql_real_escape_string אבל אם אכניס רק את התו ' זה עדיין יציג לי שגיאה של SQL.

יש עוד דרכים להתגונן מפני sql injection?
  Reply With Quote
ישן 04-08-12, 16:36   # 2
Haimz
חבר וותיק
 
מיני פרופיל
תאריך הצטרפות: Sep 2010
הודעות: 1,221

Haimz לא מחובר  

אם אלה עמודים, תשתמש בפונקצייה intval
או להפך בבדיקה של REGEX :
קוד:
preg_match("/^[0-9]+$/", $page);
  Reply With Quote
ישן 04-08-12, 17:28   # 3
אדיר
עסק רשום [?]
 
מיני פרופיל
תאריך הצטרפות: Mar 2008
מיקום: אשקלון
הודעות: 1,714

אדיר לא מחובר  

להעשרה:
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

Last edited by אדיר; 04-08-12 at 17:32..
  Reply With Quote
ישן 04-08-12, 17:33   # 4
Tomer
Whatever
 
Tomer's Avatar
 
מיני פרופיל
תאריך הצטרפות: Oct 2005
הודעות: 7,039
שלח הודעה באמצעות MSN אל Tomer Send a message via Skype™ to Tomer

Tomer לא מחובר  

PHP קוד:
$pagenum mysql_escape_string($_GET['pagenum']);
$pagenum = (int)$pagenum
לא רואה סיבה למניפולציות ארוכות יותר על המשתנה
__________________
תומר
  Reply With Quote
ישן 04-08-12, 17:45   # 5
אדיר
עסק רשום [?]
 
מיני פרופיל
תאריך הצטרפות: Mar 2008
מיקום: אשקלון
הודעות: 1,714

אדיר לא מחובר  

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

צריך לבצע אימות די פשוט:
אם הקלט הוא מספר שלם, ממשיכים, אם לא - אין סיבה להמשיך.
(בהתאם למקרה) אם המספר גדול מ- 0, ממשיכים, אם לא - אין סיבה להמשיך.
ההמשך ידוע.
  Reply With Quote
ישן 04-08-12, 19:42   # 6
איציק ברבי
עסק רשום [?]
 
מיני פרופיל
תאריך הצטרפות: Feb 2011
הודעות: 970

איציק ברבי לא מחובר  

if(is_numeric($_GET['id'])){
//other checks
}
__________________

איציק ברבי - שירות לקוחות
כתובת אתר: http://build-net.co.il/
איימל: Support@build-net.co.il
טלפון: 052-3937296.
  Reply With Quote
ישן 04-08-12, 20:26   # 7
Itay
חבר מתקדם
 
מיני פרופיל
תאריך הצטרפות: Oct 2005
גיל: 35
הודעות: 564

Itay לא מחובר  

ציטוט:
נכתב במקור על ידי איציק ברבי צפה בהודעה
if(is_numeric($_GET['id'])){
//other checks
}
http://php.net/manual/en/function.is-numeric.php
ואני אצטט את הדוגמא..
ציטוט:
'42' is numeric
'1337' is numeric
'1e4' is numeric
'not numeric' is NOT numeric
'Array' is NOT numeric
'9.1' is numeric
  Reply With Quote
ישן 04-08-12, 21:42   # 8
zoharesh
חבר מתקדם
 
מיני פרופיל
תאריך הצטרפות: Dec 2007
הודעות: 600

zoharesh לא מחובר  

ציטוט:
נכתב במקור על ידי Tomer צפה בהודעה
PHP קוד:
$pagenum mysql_escape_string($_GET['pagenum']);
$pagenum = (int)$pagenum
לא רואה סיבה למניפולציות ארוכות יותר על המשתנה
mysql_escape_string לא נחוץ פה אם בכל מקרה אתה ממיר את ערך המשתנה ל-int.
אגב עדיף לעשות שימוש ב-real_escape, או בכלל לעבור לשימוש בPDO.

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

צריך לבצע אימות די פשוט:
אם הקלט הוא מספר שלם, ממשיכים, אם לא - אין סיבה להמשיך.
(בהתאם למקרה) אם המספר גדול מ- 0, ממשיכים, אם לא - אין סיבה להמשיך.
ההמשך ידוע.
מה שמצחיק פה זה שבכל מקרה עדיף לבצע סינון.
והנה הדוגמה:
PHP קוד:
<?php
if(isset($_GET['page'])) {
is_int($_GET['page']) ? $page $_GET['page'] : $page 1;
}
PHP קוד:
<?php
if(isset($_GET['[page'])) {
$page = (int) $_GET['page'];
}
מבחינת זמן ביצוע לדעתי הintval יהיה מהיר יותר במקרה הזה, ובכל מקרה תקבל ערך שהוא מספר.
__________________


HIGHDESIGN.co.il עיצוב ובניית אתרים.
  Reply With Quote
ישן 04-08-12, 22:53   # 9
אדיר
עסק רשום [?]
 
מיני פרופיל
תאריך הצטרפות: Mar 2008
מיקום: אשקלון
הודעות: 1,714

אדיר לא מחובר  

ציטוט:
נכתב במקור על ידי zoharesh צפה בהודעה
מה שמצחיק פה זה שבכל מקרה עדיף לבצע סינון.
והנה הדוגמה:
PHP קוד:
<?php
if(isset($_GET['page'])) {
is_int($_GET['page']) ? $page $_GET['page'] : $page 1;
}
PHP קוד:
<?php
if(isset($_GET['[page'])) {
$page = (int) $_GET['page'];
}
מבחינת זמן ביצוע לדעתי הintval יהיה מהיר יותר במקרה הזה, ובכל מקרה תקבל ערך שהוא מספר.
הדוגמה הראשונה לא תעבוד, המשתנה הוא string ולא int (אף על פי שהערך שלו הינו מספר שלם).
הדוגמה השנייה היא bad practice, רצוי להימנע מביצוע casting למשתנה (אם הוא לא מה שהוא אומר להיות, שלא יהיה בכלל או שנקבע אותו לערך ברירת מחדל כלשהוא).
  Reply With Quote
ישן 04-08-12, 22:58   # 10
perfeito
חבר בקהילה
 
מיני פרופיל
תאריך הצטרפות: Jul 2012
הודעות: 102

perfeito לא מחובר  

אם כבר משתמשים ב mysql

http://php.net/manual/en/ref.pdo-mysql.php

בקצרה:
אחת הסיבות שעשו את הדרייבר הזה הוא בשביל להעביר את
ההגנה לדרייבר עצמו לדוגמא:

קוד:
$sth = $dbh->prepare('SELECT name WHERE id = :id');
$id = '1';
$sth->bindParam(':id', $id, PDO::PARAM_INT);

Last edited by perfeito; 04-08-12 at 23:04.. סיבה: ex
  Reply With Quote
השב

חברים פעילים הצופים באשכול זה: 1 (0 חברים ו- 1 אורחים)
 


חוקי פירסום
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is מופעל
סמיילים הם מופעל
[IMG] קוד מופעל
קוד HTML מכובה

קפיצה לפורום


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

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