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

הוסטס - פורום אחסון האתרים הגדול בישראל (https://hosts.co.il/forums/index.php)
-   תכנות - מדריכים, code snippets (https://hosts.co.il/forums/forumdisplay.php?f=68)
-   -   [מדריך] PHP - אבטחת נתונים למתחילים (https://hosts.co.il/forums/showthread.php?t=83657)

Hagaibl 09-07-10 09:45

[מדריך] PHP - אבטחת נתונים למתחילים
 
יש מספר אנשים אשר לא ממש יודעים איך להגן נגד פירצות.
אני אנסה להסביר לכם הפעם איך להתגונן נגד פרצות כמו
LFI\RFI
CSRF
XSS
SQL INJECTION
אז בוא נתחיל?

LFI\RFI
קודם כל מה זה? LFI\RFI זה כאשר המשתמש(הפרוץ כביכול) עושה שימוש בInclude פריץ אצלכם באתר בכדי להגיע לקובץ מסוים לדוגמה. אם האתר מקבל מידע מדפים על ידי שהוא מבצע את הדבר הבא:http:/www.yoursite.co.il/index.php?act=main.php
אנו רואים כי האתר מקבל מידע מן הקובץ main.php, כלומר שאם נשנה את הmain.php בקובץ לhttp://www.google.com>התוכן של האתר יהיה הדף של גוגל.
השיטה הכי פשוטה להתגונן נגד הדבר הזה היא לא לעשות שימוש בINCLUDE שמתקבל ישר משורת הכתובת בלי לעבור בדיקה!
עדיף להשתמש בswitch ולהגדיר case לכל אחד מהדפים ואז לבצע INCLUDE כלומר:
PHP קוד:

<?php
switch($_GET['act']) {
    case 
"main":
        include(
"main.php");
        break;
    default:
        include(
"indexContent.php");
}
?>

ואז אתם מוסיפים ערכים וCASE כפי שאתם צריכים פשוט מאוד לא?


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

הדרך הכי טובה להתגונן נגד זה זה לבצע בדיקה פשוטה:
האם ה
PHP קוד:

$_SERVER['HTTP_REFERER'

תואם למה שהוא צריך להיות.

XSS
מהו XSS? זוהי הזרקה אשר מנצלת מקומות פגיעים בקוד להזריק קוד HTML זדוני בכדי לפגוע באתר. למשל אם המשתמש רוצה הוא יכול להזריק שורת חיפוש שתוכנה הוא קוד זדוני.

הדרך הטובה ביותר למנוע את זה היא למחוק בעזרת פונקציות מובנות בPHP את הטאגי HTML שמכילה המחרוזת, להמיר את הסמלים המיוחדים בHTML.
עושים זאת כך:
PHP קוד:

<?php
    $formString 
strip_tags(htmlspecialchars($_POST['string']));
?>

ניתן לעשות גם שימוש בGET במקום POST או REQUEST.

SQL INJECTION
הדרך הכי נפוצה והכי פשוטה יחסית לפריצת אתרים.
איך מזהים SQL INJECTION? דבר ראשון בודקים אם הדף ניהיה לא תקין כלל אם נותנים ערך שלא הגיוני כמו -1 לID
מה הכוונה לדוגמה ויש לכם מערכת מאמרים, אתם רוצים רוצים לקבל את תוכן המאמר על פי הID שנמצא בשורת הכתובת
http://www.yoursite.co.il/article.php?id=1
מה ש"האקר" ינסה לעשות זה לתת ערך -1 ולראות עם הדף יהרס. אם כן הוא יודע שיש פגיעה ולאחר מכן ינסה להכניס את תוכן הSQLI שלו.
בכדי להגן על ערכים מספרים הכי ממולץ לבצע את הדבר הבא:
PHP קוד:

<?php
    $intValue 
is_numeric($_GET['id']) && intval($_GET['id']) > $_GET['id'] : die("Invalid id value");
?>

מה שעשיתי זה ביצעתי בדיקה שמחיבת שהערך יהיה מספרי ושהוא יהיה גדול מ0! כלומר תקין.
אם הבדיקה נכשלה תבוצע פקודת die.

בכדי לאבטח ערכים שהם מחרוזות משתמשים בשלוש פונקציות, אחת להסיר חלקים זדונים של HTML מהדף, השנים האחרות להסיר חלקים של XSS מהדף(הרי אנחנו לא רוצים שיהיה שניהם אה?)
עושים זאת ככה:
PHP קוד:

<?php
    $value 
strip_tags(htmlspecialchars(mysql_real_escape_string($_GET['string'])));
?>

חשוב לצין שיש לבצע את השימוש מפונקציה mysql_real_escape_string רק לאחר שיש חיבור mysql פתוח, אחרת תתקבל שגיאה.

זהו, הינה כמה טיפים ממני.
תהנו!
(תגובה לא עולה כסף :P)

intercooler3819 09-07-10 10:24

כתבה טובה :) כל הכבוד על ההשקעה!
מספר המלצות:

ציטוט:

נכתב במקור על ידי Hagaibl (פרסם 770535)
יש מספר אנשים אשר לא ממש יודעים איך להגן נגד פירצות.
אני אנסה להסביר לכם הפעם איך להתגונן נגד פרצות כמו
LFI\RFI
CSRF
XSS
SQL INJECTION
אז בוא נתחיל?

LFI\RFI
קודם כל מה זה? LFI\RFI זה כאשר המשתמש(הפרוץ כביכול) עושה שימוש בInclude פריץ אצלכם באתר בכדי להגיע לקובץ מסוים לדוגמה. אם האתר מקבל מידע מדפים על ידי שהוא מבצע את הדבר הבא:http:/www.yoursite.co.il/index.php?act=main.php
אנו רואים כי האתר מקבל מידע מן הקובץ main.php, כלומר שאם נשנה את הmain.php בקובץ לhttp://www.google.com>התוכן של האתר יהיה הדף של גוגל.
השיטה הכי פשוטה להתגונן נגד הדבר הזה היא לא לעשות שימוש בINCLUDE שמתקבל ישר משורת הכתובת בלי לעבור בדיקה!
עדיף להשתמש בswitch ולהגדיר case לכל אחד מהדפים ואז לבצע INCLUDE כלומר:
PHP קוד:

<?php
switch($_GET['act']) {
    case 
"main":
        include(
"main.php");
        break;
    default:
        include(
"indexContent.php");
}
?>

ואז אתם מוסיפים ערכים וCASE כפי שאתם צריכים פשוט מאוד לא?


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

הדרך הכי טובה להתגונן נגד זה זה לבצע בדיקה פשוטה:
האם ה
PHP קוד:

$_SERVER['HTTP_REFERER'

תואם למה שהוא צריך להיות.

אני לא יודע אם אתה יודע מה זה CSRF, אבל בדיקת ה REFERER זה לא הפתרון, כיוון שלא בעיה לשנות את ה REFERER, ולא רק זה, דפדפנים לא שולחים את ה REFERER אם התקשורת היא ב SSL

XSS
מהו XSS? זוהי הזרקה אשר מנצלת מקומות פגיעים בקוד להזריק קוד HTML זדוני בכדי לפגוע באתר. למשל אם המשתמש רוצה הוא יכול להזריק שורת חיפוש שתוכנה הוא קוד זדוני.

הדרך הטובה ביותר למנוע את זה היא למחוק בעזרת פונקציות מובנות בPHP את הטאגי HTML שמכילה המחרוזת, להמיר את הסמלים המיוחדים בHTML.
עושים זאת כך:
PHP קוד:

<?php
    $formString 
strip_tags(htmlspecialchars($_POST['string']));
?>

ניתן לעשות גם שימוש בGET במקום POST או REQUEST.

אם כבר אתה משתמש ב strip_tags וב htmlspecialchars אז קודם תסנן את ה HTML ורק לאחר מכן תשתמש ב htmlspecialchars
למרות שיש סוגיה שלמה בעניין של האם להחזיק גרסאות שעברו htmlspecialchars בדטאבייס או לא..


SQL INJECTION
הדרך הכי נפוצה והכי פשוטה יחסית לפריצת אתרים.
איך מזהים SQL INJECTION? דבר ראשון בודקים אם הדף ניהיה לא תקין כלל אם נותנים ערך שלא הגיוני כמו -1 לID
מה הכוונה לדוגמה ויש לכם מערכת מאמרים, אתם רוצים רוצים לקבל את תוכן המאמר על פי הID שנמצא בשורת הכתובת
http://www.yoursite.co.il/article.php?id=1
מה ש"האקר" ינסה לעשות זה לתת ערך -1 ולראות עם הדף יהרס. אם כן הוא יודע שיש פגיעה ולאחר מכן ינסה להכניס את תוכן הSQLI שלו.
בכדי להגן על ערכים מספרים הכי ממולץ לבצע את הדבר הבא:
PHP קוד:

<?php
    $intValue 
is_numeric($_GET['id']) && intval($_GET['id']) > $_GET['id'] : die("Invalid id value");
?>

מה שעשיתי זה ביצעתי בדיקה שמחיבת שהערך יהיה מספרי ושהוא יהיה גדול מ0! כלומר תקין.
אם הבדיקה נכשלה תבוצע פקודת die.

בכדי לאבטח ערכים שהם מחרוזות משתמשים בשלוש פונקציות, אחת להסיר חלקים זדונים של HTML מהדף, השנים האחרות להסיר חלקים של XSS מהדף(הרי אנחנו לא רוצים שיהיה שניהם אה?)
עושים זאת ככה:
PHP קוד:

<?php
    $value 
strip_tags(htmlspecialchars(mysql_real_esace_string($_GET['string'])));
?>

חשוב לצין שיש לבצע את השימוש מפונקציה mysql_real_escape_string רק לאחר שיש חיבור mysql פתוח, אחרת תתקבל שגיאה.

זהו, הינה כמה טיפים ממני.
תהנו!
(תגובה לא עולה כסף :P)

יש עוד כמה אי דיוקים קטנים (למה להשתמש ב INTVAL אם עשית בדיקה שהערך הוא נומרי? מה גם ש is_numeric מקבל סטרינגים כמו 10E10 ומאשר אותם בתור INT)

~The_Sultan~ 09-07-10 10:27

יפה, מדריך שיכול לעזור מאוד :)
ותן קצת קרדיט על ה-SQLI.. |Rolleyes|

ובקשר ל-$_SERVER['HTTP_REFERER'], זה לא ממש מומלץ להשתמש בזה סתם ככה, כי זה יכול לגרום בעיות אם למשל שינית דומיין או אם אתה עובד עם כל כתובות אחרות שיכולות להשתנות.
בגדול עדיף אבטחה עם מסד או קוד CAPTCHA, אבל אם בכל זה מחליטים להשתמש בכתובת המפנה,
אני ממליץ להשתמש בפונקציה הזו:
http://php.net/manual/en/function.parse-url.php
אבל כאן עדיין יש חור, במקרה שהבנאדם ישים על השרת שלו את אותה הכתובת, ולכן, הנה קוד סופי:

PHP קוד:

global $config;

$ref $_SERVER['HTTP_REFERER'];
$current_ref "index.php?act=form&op=fill";
$divide parse_url($ref);
if ((
$divide['scheme']."://".$divide['host'] != $config['site_url']) && ($divide['path'] != $current_ref))
    die(
"False referrer."); 

ובמשתנה הגלובלי $config, צריך להיות משהו כזה:
PHP קוד:

$config['site_url'] == "http://google.com"

|קורץ|

עריכה:
בהמשך למה שזה שמעליי אמר, בשביל לבדוק אם הערך מספרי בשיטה הכי תיקנית אפשר להשתמש בביטוי רגולארי פשוט:
PHP קוד:

if (preg_match("/[^0-9]/"$id))
    die(
"This is not a number."); 


Hagaibl 09-07-10 10:30

ציטוט:

נכתב במקור על ידי ~The_Sultan~ (פרסם 770540)
יפה, מדריך שיכול לעזור מאוד :)
ותן קצת קרדיט על ה-SQLI.. |Rolleyes|

ובקשר ל-$_SERVER['HTTP_REFERER'], זה לא ממש מומלץ להשתמש בזה סתם ככה, כי זה יכול לגרום בעיות אם למשל שינית דומיין או אם אתה עובד עם כל כתובות אחרות שיכולות להשתנות.
בגדול עדיף אבטחה עם מסד או קוד CAPTCHA, אבל אם בכל זה מחליטים להשתמש בכתובת המפנה,
אני ממליץ להשתמש בפונקציה הזו:
http://php.net/manual/en/function.parse-url.php
אבל כאן עדיין יש חור, במקרה שהבנאדם ישים על השרת שלו את אותה הכתובת, ולכן, הנה קוד סופי:

PHP קוד:

global $config;

$ref $_SERVER['HTTP_REFERER'];
$current_ref "index.php?act=form&op=fill";
$divide parse_url($ref);
if ((
$divide['scheme']."://".$divide['host'] != $config['site_url']) && ($divide['path'] != $current_ref))
    die(
"False referrer."

ובמשתנה הגלובלי $config, צריך להיות משהו כזה:
PHP קוד:

$config['site_url'] == "http://google.com"

|קורץ|

מה פתאום, כל הרעיון זה שהמתכנת ישמור איפשהו את המקור ואז ישווה לHTTP REFFER.
אני נותן טיפים לא מדריך חח.

ציטוט:

נכתב במקור על ידי nitsanbn (פרסם 770539)
כתבה טובה :) כל הכבוד על ההשקעה!
מספר המלצות:



יש עוד כמה אי דיוקים קטנים (למה להשתמש ב INTVAL אם עשית בדיקה שהערך הוא נומרי? מה גם ש is_numeric מקבל סטרינגים כמו 10E10 ומאשר אותם בתור INT)

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

~The_Sultan~ 09-07-10 10:41

מה זה קשור? אם אלו אנשים מתחילים אז זה בסדר אם הם לא יאבטחו את האתרים שלהם כמו שצריך? ועל מה אתה אומר מה פתאום?

Hagaibl 09-07-10 10:44

ציטוט:

נכתב במקור על ידי ~The_Sultan~ (פרסם 770543)
מה זה קשור? אם אלו אנשים מתחילים אז זה בסדר אם הם לא יאבטחו את האתרים שלהם כמו שצריך? ועל מה אתה אומר מה פתאום?

על הprase url שלך.
ותאמין לי שהאבטחה הזאת מספיקה היטב.
היא מונעת SQLI כמו שצריך ואת שאר החרא. כל עוד אתה לא תשכח לעשות בהן שימוש הכל יעבוד כמו שצריך.

~The_Sultan~ 09-07-10 10:45

ציטוט:

נכתב במקור על ידי Hagaibl (פרסם 770546)
על הprase url שלך.
ותאמין לי שהאבטחה הזאת מספיקה היטב.
היא מונעת SQLI כמו שצריך ואת שאר החרא. כל עוד אתה לא תשכח לעשות בהן שימוש הכל יעבוד כמו שצריך.

לא לא, זה טיפשי להשתמש רק ב-HTTP REFERER כי אז אם אתה עובר דומיין, כמו שאמרתי, אתה צריך לעבור על כל העמודים במערכת שלך ולשנות את הקוד. בשיטה שאני נתתי אתה צריך רק לשנות את המשתנה $config בהתאמה. לצורך העניין, אתה משנה פה רק פעם אחת.......

Hagaibl 09-07-10 10:59

ציטוט:

נכתב במקור על ידי ~The_Sultan~ (פרסם 770547)
לא לא, זה טיפשי להשתמש רק ב-HTTP REFERER כי אז אם אתה עובר דומיין, כמו שאמרתי, אתה צריך לעבור על כל העמודים במערכת שלך ולשנות את הקוד. בשיטה שאני נתתי אתה צריך רק לשנות את המשתנה $config בהתאמה. לצורך העניין, אתה משנה פה רק פעם אחת.......

:| אז אתה לא קורא כניראה מה שאמרתי, אמרתי שכן צריך להגדיר, אמרתי רק את המשתנה שאליו להשוות, לא נתתי קוד.

~The_Sultan~ 09-07-10 12:14

אינעל העולם, אנשים פה לא יודעים להודות שהם טעו.. אז לך תשבור תראש עם מה שאמרת..

intercooler3819 09-07-10 14:10

ציטוט:

נכתב במקור על ידי ~The_Sultan~ (פרסם 770540)
יפה, מדריך שיכול לעזור מאוד :)
ותן קצת קרדיט על ה-SQLI.. |Rolleyes|

ובקשר ל-$_SERVER['HTTP_REFERER'], זה לא ממש מומלץ להשתמש בזה סתם ככה, כי זה יכול לגרום בעיות אם למשל שינית דומיין או אם אתה עובד עם כל כתובות אחרות שיכולות להשתנות.
בגדול עדיף אבטחה עם מסד או קוד CAPTCHA, אבל אם בכל זה מחליטים להשתמש בכתובת המפנה,
אני ממליץ להשתמש בפונקציה הזו:
http://php.net/manual/en/function.parse-url.php
אבל כאן עדיין יש חור, במקרה שהבנאדם ישים על השרת שלו את אותה הכתובת, ולכן, הנה קוד סופי:

PHP קוד:

global $config;

$ref $_SERVER['HTTP_REFERER'];
$current_ref "index.php?act=form&op=fill";
$divide parse_url($ref);
if ((
$divide['scheme']."://".$divide['host'] != $config['site_url']) && ($divide['path'] != $current_ref))
    die(
"False referrer."); 

ובמשתנה הגלובלי $config, צריך להיות משהו כזה:
PHP קוד:

$config['site_url'] == "http://google.com"

|קורץ|

עריכה:
בהמשך למה שזה שמעליי אמר, בשביל לבדוק אם הערך מספרי בשיטה הכי תיקנית אפשר להשתמש בביטוי רגולארי פשוט:
PHP קוד:

if (preg_match("/[^0-9]/"$id))
    die(
"This is not a number."); 



CAPTCHA בכלל לא מיועד לפתירה של XSRF/CSRF

אפשר להשתמש בזה לזה.. אבל על כל טופס באתר תמקם CAPTCHA?

בנוסף - אין שום סיבה לא להשתמש ב REFERER - רק קח בחשבון שזה לא חובה שדפדפן ישלח REFERER וגם כל אחד יכול לשנות אותו בהתאם למצב רוח

~The_Sultan~ 09-07-10 14:23

למה לא? הוא מיועד למניעת הצפות בעיקרון, אבל מה הבעיה להשתמש בזה גם לזה? זה כמו שביטוי רגולארי לא נועד דווקא בשביל לבדוק האם המשתנה הוא מספר, אלא לדברים מסובכים יותר כמובן, אבל אפשר. וזה לא מזיק.
ואיפה אמרתי שא"א להשתמש בREFERER? אמרתי שאם כבר משתמשים, אז לעשות בצורה שנתתי, שזה לפחות מוריד את הרמה של הפירצות.

Shay Ben Moshe 09-07-10 15:06

כבוד על ההשקעה אבל הקודים שלך ממש לא חכמים...
PHP קוד:

$formString strip_tags(htmlspecialchars($_POST['string'])); 

גם מוחק וגם הופך תגים לתוויות מתאימות. צריך רק אחד מהם (אני אישית בעל htmlspecialchars).
PHP קוד:

$intValue is_numeric($_GET['id']) && intval($_GET['id']) > $_GET['id'] : die("Invalid id value"); 

נתחיל מזה שהפונקציה intval לא ממש יעילה ופה גם מיותרת אם אתה כבר יודע שהמשתנה הוא נומרי. הפתרון החכם הוא או להמיר לint ואז לוודא שהמספר אכן קיים בDB או להשתמש בescaping או משהו בסגנון.
PHP קוד:

$value strip_tags(htmlspecialchars(mysql_real_esace_string($_GET['string']))); 

אותו סיפור כמו קודם...

Erez | TrustMedia.co.il 09-07-10 15:25

לגבי הCSRF אין לי מושג מה זה,אבל לפי התיאור שנתת,הפיתרון הוא לא הכי טוב,מכיוןן שאם כבר מישהו שולח בקשה ידנית לקובץ שמבצע את הפעולות,אז הוא בקלות יכול להוסיף HEADER של הREFFER ואז אתה תחשוב שזה בא מהקובץ המקורי,כך שלא פתרת את הבעיה

RS324 09-07-10 17:18

מדריך נחמד , התעלמת לגמרי מ 2 דברים

1. מאד חשוב , register_globals = on יכול לגרום לפרצות אבטחה מאד חמורות
2. magic_qoutes צריך לוודא שהוא OFF ואם הוא ON אז לעשות STRIP_SLASH על הכל כי אז זה עושה צרות עם ה ESCAPE שפשוט תקבל סלאשים כפולים וכאלה...

לגבי הפתרונות הם מתאימים למקרים הבסיסיים אבל אם לדוגמא יש לך עורך WYSIWYG אז אתה לא בדיוק יכול לעשות STRIP_TAGS....
יש עוד כמה נושאים באבטחה שלא נגעת בהם , אבל זה טוב להתחלה
כל הכבוד....

anti 09-07-10 20:38

PHP קוד:

<?php
/*
------------------------------------------------------------
|           Defense.php Is to free use
|           Defense from: Xss,Sql Inj in url only
|          =============================
|           > Date of Created: 21/12/08
------------------------------------------------------------
*/
class Defense 
{
    Var 
$Url;
    Var 
$Attack;
    Var 
$IP;
    Var 
$Method;
    Var 
$headers;
    Var 
$Out "";
    Var 
$Value;
    Var 
$Email;
    Var 
$Date;
     
      function 
eMail($Subject)
      {
      
$this->headers "MIME-Version: 1.0\r\n";
      
$this->headers.= "Content-type:text/html;charset=windows-1255\r\n";
      
$this->Subject $Subject;
      
$this->Message "<html><head></head><body dir='ltr'><div style='direction: ltr; font-family: arial; font-size: 11px;'>Method Of this Attack: {$this->Method}<br />IP Of this Attack: {$this->IP}<br />Url Of this Attack: {$this->Attack}</body></html>";
      
mail($this->Email,$this->Subject,$this->Message,$this->headers);
      }
    function 
Defense()
    {
    
$this->Url $_SERVER['QUERY_STRING'];
    
$this->Attack $_SERVER['REQUEST_URI'];
    
$this->IP $_SERVER['REMOTE_ADDR'];
    
$this->Value "Defense()";
    
$this->Email "yourmail@gmail.com";
    
$this->Date date("d/m/Y H:i:s");

        if (
preg_match("#(union|drop|alter|update|having|insert|select|create|<(.+)|alert)#i",$this->Url))
        {
                
SetCookie("Defense",$this->Value,time()+3600*2);
                
$this->Method "Url String";
                
$this->eMail("Your site has benn Attacked");
    Die(
$Defense->Out="
    <!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'> 
            <html xml:lang='en' lang='en' xmlns='http://www.w3.org/1999/xhtml'>
    <head>
        <meta http-equiv='content-type' content='text/html; charset=windows-1255' />
        <title>Defense</title>
    </head>
<body style='background-color: #000;'>
<div style='margin: 0 auto 0 auto; text-align: center;'>
    <div style='background-color: #fff; width: auto; height: auto; border: 1px dashed #fafafa;'>
        <pre>Method Of this Attack: {$this->Method}<br />IP Of this Attack: {$this->IP}<br />Url Of this Attack: {$this->Attack}</pre>
    </div>
    <div style='color: #fafafa; font-weight: bold; font-size: 10pt;'>Your Detalis Is Send to the Admin forum</div>
</div>
</body>
    </html>
    "
);
        }
    }
}
$Defense = new Defense;
if (isset(
$_COOKIE['Defense']) && $_COOKIE['Defense'] == $Defense->Value)
{
    Die(
$Defense->Out="
    <!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'> 
            <html xml:lang='en' lang='en' xmlns='http://www.w3.org/1999/xhtml'>
    <head>
        <meta name='author' content='sHoN.G' />
        <meta http-equiv='content-type' content='text/html; charset=windows-1255' />
        <title>Defense</title>
    </head>
<body style='background-color: #000;'>
    <div style='text-align: center; color: #fafafa; font-weight: bold; font-size: 13pt;'>Your Blocked for 2 Hours<br />Reason: You try to Attack the site</div>
    
</body>
    </html>
    "
);
}
?>

קובץ נחמד המגן מ XSS ו SQL INJ בשיטת GET,
פשוט תעשו INCLUDE בעמודים בהם יש חשש..
או תעשו INCLUDE כולל על ידי הכנסת העמוד הזה כ INCLUDE בתוך ה CONFIG
(בהנחה שאתם עשיתם INCLUDE לקובץ הCONFIG שלכם בכל האתר)

Hagaibl 09-07-10 23:58

ציטוט:

נכתב במקור על ידי Shay Falador (פרסם 770574)
כבוד על ההשקעה אבל הקודים שלך ממש לא חכמים...
PHP קוד:

$formString strip_tags(htmlspecialchars($_POST['string'])); 

גם מוחק וגם הופך תגים לתוויות מתאימות. צריך רק אחד מהם (אני אישית בעל htmlspecialchars).
PHP קוד:

$intValue is_numeric($_GET['id']) && intval($_GET['id']) > $_GET['id'] : die("Invalid id value"); 

נתחיל מזה שהפונקציה intval לא ממש יעילה ופה גם מיותרת אם אתה כבר יודע שהמשתנה הוא נומרי. הפתרון החכם הוא או להמיר לint ואז לוודא שהמספר אכן קיים בDB או להשתמש בescaping או משהו בסגנון.
PHP קוד:

$value strip_tags(htmlspecialchars(mysql_real_esace_string($_GET['string']))); 

אותו סיפור כמו קודם...

תמיד הייתי גם משתמש רק בhtmlspecialchars אני כמעט ולא נוגע בstrip_tags התחלתי לעשות שימוש בגלל AJAX.

ציטוט:

נכתב במקור על ידי WiPi (פרסם 770577)
לגבי הCSRF אין לי מושג מה זה,אבל לפי התיאור שנתת,הפיתרון הוא לא הכי טוב,מכיוןן שאם כבר מישהו שולח בקשה ידנית לקובץ שמבצע את הפעולות,אז הוא בקלות יכול להוסיף HEADER של הREFFER ואז אתה תחשוב שזה בא מהקובץ המקורי,כך שלא פתרת את הבעיה

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

ציטוט:

נכתב במקור על ידי RS324 (פרסם 770607)
מדריך נחמד , התעלמת לגמרי מ 2 דברים

1. מאד חשוב , register_globals = on יכול לגרום לפרצות אבטחה מאד חמורות
2. magic_qoutes צריך לוודא שהוא OFF ואם הוא ON אז לעשות STRIP_SLASH על הכל כי אז זה עושה צרות עם ה ESCAPE שפשוט תקבל סלאשים כפולים וכאלה...

לגבי הפתרונות הם מתאימים למקרים הבסיסיים אבל אם לדוגמא יש לך עורך WYSIWYG אז אתה לא בדיוק יכול לעשות STRIP_TAGS....
יש עוד כמה נושאים באבטחה שלא נגעת בהם , אבל זה טוב להתחלה
כל הכבוד....

זה טיפים בסיסים לחלוטין, אני לא בא לדבר פה על קינפוג נכון של השרת, הרי המתכנת לא יבוא ויתחיל לדרוש מהלקוח תשנה את זה ותשנה את זה.
בכמובן שאם תשתמש בstrip_tags זה ידפוק את התוכן של WYSIWYG לכן צריך גם קצת לדעת מתי להשתמש.

liorclub 10-07-10 13:08

כל הכבוד על הכוונות הטובות והנסיון לעזור, זה משהו שיכול לעזור לכל מי שבתחילת דרכו.

יישר כוח !

astricks 15-07-10 15:05

כל הטיפים האלה מתרכזים לאותה נקודה, פשוט לא להסתמך על המשתמש (מוזר שרק דילרים וחנונים קוראים ללקוחות שלהם ככה אבל בסדר) בנוגע לשום דבר. כלומר, כל דבר שנכנס אליכם למערכת, כמו שאני מקווה שאתם עושים בחיים, בודקים בקפדנות ומסננים. KEEP IT SIMPLE

AlmogBaku 20-07-10 23:02

איזה שטויות.
בואו נתחיל מזה שברוב המקרים הפריצות יהיו לשרת עצמו ולא למערכת, משום שקשה מאוד לזהות פרצות אבטחה במערכת שלא ציבורית.

חשוב לחסום שטויות, לכתוב קוד מסודר ונכון, ולבצע הברחה ואימות נתונים מול סוג נתונים. כל השאר יבוא לבד

Hagaibl 21-07-10 00:45

ציטוט:

נכתב במקור על ידי Baku (פרסם 772109)
איזה שטויות.
בואו נתחיל מזה שברוב המקרים הפריצות יהיו לשרת עצמו ולא למערכת, משום שקשה מאוד לזהות פרצות אבטחה במערכת שלא ציבורית.

חשוב לחסום שטויות, לכתוב קוד מסודר ונכון, ולבצע הברחה ואימות נתונים מול סוג נתונים. כל השאר יבוא לבד

זה מה שאני מסביר פה :|.
ותתפלא, רוב ה"מתכנתים" בישראל(אלו שחושבים את עצמם אבל לא באמת מתכנתים) לא עושים גם את זה.

~The_Sultan~ 21-07-10 02:08

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

AlmogBaku 21-07-10 02:09

ציטוט:

נכתב במקור על ידי Hagaibl (פרסם 772137)
זה מה שאני מסביר פה :|.
ותתפלא, רוב ה"מתכנתים" בישראל(אלו שחושבים את עצמם אבל לא באמת מתכנתים) לא עושים גם את זה.

תתפלא לשמוע, אבל השוק קצת יותר גדול מהוסטס ;)


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

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