הוסטס - פורום אחסון האתרים הגדול בישראל

הוסטס - פורום אחסון האתרים הגדול בישראל (https://hosts.co.il/forums/index.php)
-   פורום תיכנות (https://hosts.co.il/forums/forumdisplay.php?f=14)
-   -   הגנה מפני sql injection (https://hosts.co.il/forums/showthread.php?t=99071)

Ori The Man 04-08-12 16:29

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

יש עוד דרכים להתגונן מפני sql injection?

Haimz 04-08-12 16:36

אם אלה עמודים, תשתמש בפונקצייה intval
או להפך בבדיקה של REGEX :
קוד:

preg_match("/^[0-9]+$/", $page);

אדיר 04-08-12 17:28

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

Tomer 04-08-12 17:33

PHP קוד:

$pagenum mysql_escape_string($_GET['pagenum']);
$pagenum = (int)$pagenum

לא רואה סיבה למניפולציות ארוכות יותר על המשתנה

אדיר 04-08-12 17:45

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

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

איציק ברבי 04-08-12 19:42

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

Itay 04-08-12 20:26

ציטוט:

נכתב במקור על ידי איציק ברבי (פרסם 853370)
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

zoharesh 04-08-12 21:42

ציטוט:

נכתב במקור על ידי Tomer (פרסם 853358)
PHP קוד:

$pagenum mysql_escape_string($_GET['pagenum']);
$pagenum = (int)$pagenum

לא רואה סיבה למניפולציות ארוכות יותר על המשתנה

mysql_escape_string לא נחוץ פה אם בכל מקרה אתה ממיר את ערך המשתנה ל-int.
אגב עדיף לעשות שימוש ב-real_escape, או בכלל לעבור לשימוש בPDO.

ציטוט:

נכתב במקור על ידי xPerfection (פרסם 853360)
תומר, זה בדיוק מה שלא נחוץ לעשות (וזאת הסיבה שציינתי את 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 יהיה מהיר יותר במקרה הזה, ובכל מקרה תקבל ערך שהוא מספר.

אדיר 04-08-12 22:53

ציטוט:

נכתב במקור על ידי zoharesh (פרסם 853387)
מה שמצחיק פה זה שבכל מקרה עדיף לבצע סינון.
והנה הדוגמה:
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 למשתנה (אם הוא לא מה שהוא אומר להיות, שלא יהיה בכלל או שנקבע אותו לערך ברירת מחדל כלשהוא).

perfeito 04-08-12 22:58

אם כבר משתמשים ב 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);



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

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