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

הוסטס - פורום אחסון האתרים הגדול בישראל (https://hosts.co.il/forums/index.php)
-   פורום תיכנות (https://hosts.co.il/forums/forumdisplay.php?f=14)
-   -   [טיפ] איך לדעת שה ACT שהכניסו הוא תקין (https://hosts.co.il/forums/showthread.php?t=36637)

LosNir 22-12-06 16:39

[טיפ] איך לדעת שה ACT שהכניסו הוא תקין
 
שלום,
שמתי לב צל הרבה מתכנתים פה, שהם משתמשים בשיטה לא הכי יעילה בשביל לבדוק אם ה ACT תקין.

מה שהם עושים זה לעשות תנאי IF ולבדוק כל פעם ב OR אם ה ACT תקין.

למשל:

PHP קוד:

$act $_GET['act'];
if(
$act == "1" OR $act == "2" OR $act == "3" OR $act == "4" OR $act == "5")
include(
"$act.php");
else
echo 
"error"

שיטה זה לא ממש יעילה, מכיוון שאולי יש לכם הרבה ACTים?
וכל פעם שרוצים להוסיף ACT חדש צריך לעדכן את הדף.

אז אני מראה לכם טיפ קטן שמצאתי, שיכול לעזור לכם:

PHP קוד:

$act $_GET['act'];
if(!@include(
"pages/$act.php"))
echo 
"שגיאה!"

הסבר של הקוד:

בשורה ראשונה אנחנו שולפים את ה ACT שלנו דרך ה GET, כרגיל.
שורה שניה (תנאי ה IF), זה פשוט למדי,
אנחנו בודקים אם לא ניתן לעשות include ל ACT,
אם לא ניתן מציגים שגיאה.. אם כן ניתן, זה פשוט עושה Include אוטומטית.

הערה: שמתי לפני ה include את התו "@" על מנת "להשתיק" את ה include במידה ולא ניתן לעשות include ל ACT.

אופן שימוש:

עכשיו כל דף שאתם מעוניינים שיהיה בתוך ה ACT, מכניסים אותה לתיקיה pages.

ניתן לשפץ קצת את הקוד, ולעשות שרק דפים שמתחילים ב page_ יהיו בתוך ה ACT, ככה למשל:

PHP קוד:

$act $_GET['act'];
if(!@include(
"pages/page_$act.php"))
echo 
"שגיאה!"

פשוט לכו לפי הדמיון שלכם :)

תהנו |קורץ|

DorWD 22-12-06 16:48

וואלה תודה רעיון נחמד :)

SDF 22-12-06 16:53

PHP קוד:

$act $_GET['act'];
if(!@include(
"pages/$act.php"))
echo 
"שגיאה!"

במידה ואנחנו עושים משהו כמו

קוד:

bla.php?act=../../../../usr/home/someuser/somedomain.com/public_html/index
מה יקרה?
לפי דעתי זו לא דרך חכמה לבנות סקריפט שמשתמש הקצה הוא הקובע איזה קובץ הוא יקבל,
צריך להכין רשימה קבוע מראש של קבצים.

Tomer 22-12-06 17:10

ציטוט:

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

$act $_GET['act'];
if(!@include(
"pages/$act.php"))
echo 
"שגיאה!"

במידה ואנחנו עושים משהו כמו

קוד:

bla.php?act=../../../../usr/home/someuser/somedomain.com/public_html/index
מה יקרה?
לפי דעתי זו לא דרך חכמה לבנות סקריפט שמשתמש הקצה הוא הקובע איזה קובץ הוא יקבל,
צריך להכין רשימה קבוע מראש של קבצים.

נתחיל בזה ש include סה"כ יצרף את הקוד לדף, ולא יציג לך אותו.
דבר שני, incldue לא יכול לגשת לתיקיות שאתה לא יכול, וגם לא יכול להוסיף דפים מחוץ לתיקיית ה public_html.

Eli-Hai 22-12-06 17:13

אני מעדיף יותר להשתמש ב-readdir כדי למפות את כל הקבצים שנמצאים אצלי ואיתם אני משתמש ב-$_GET, ואז ליצור איתם switch, שמתעדכן לפי הקובץ, פשוט וקל. יש כאלה שלא בונים עמודים, אלא קוראים לפונקציות מתוך switch או if, elseif, else או כל שיטה אחרת שעולה בדעתכם.
אם תרצו, אני יעבוד על זה עוד מעט, נעשה לכם משהו פשוט עם readdir ו-switch.

tnadav 22-12-06 18:44

ציטוט:

נכתב במקור על ידי LosNir (פרסם 392842)
שלום,
שמתי לב צל הרבה מתכנתים פה, שהם משתמשים בשיטה לא הכי יעילה בשביל לבדוק אם ה ACT תקין.

מה שהם עושים זה לעשות תנאי IF ולבדוק כל פעם ב OR אם ה ACT תקין.

למשל:

PHP קוד:

$act $_GET['act'];
if(
$act == "1" OR $act == "2" OR $act == "3" OR $act == "4" OR $act == "5")
include(
"$act.php");
else
echo 
"error"

שיטה זה לא ממש יעילה, מכיוון שאולי יש לכם הרבה ACTים?
וכל פעם שרוצים להוסיף ACT חדש צריך לעדכן את הדף.

אז אני מראה לכם טיפ קטן שמצאתי, שיכול לעזור לכם:

PHP קוד:

$act $_GET['act'];
if(!@include(
"pages/$act.php"))
echo 
"שגיאה!"

הסבר של הקוד:

בשורה ראשונה אנחנו שולפים את ה ACT שלנו דרך ה GET, כרגיל.
שורה שניה (תנאי ה IF), זה פשוט למדי,
אנחנו בודקים אם לא ניתן לעשות include ל ACT,
אם לא ניתן מציגים שגיאה.. אם כן ניתן, זה פשוט עושה Include אוטומטית.

הערה: שמתי לפני ה include את התו "@" על מנת "להשתיק" את ה include במידה ולא ניתן לעשות include ל ACT.

אופן שימוש:

עכשיו כל דף שאתם מעוניינים שיהיה בתוך ה ACT, מכניסים אותה לתיקיה pages.

ניתן לשפץ קצת את הקוד, ולעשות שרק דפים שמתחילים ב page_ יהיו בתוך ה ACT, ככה למשל:

PHP קוד:

$act $_GET['act'];
if(!@include(
"pages/page_$act.php"))
echo 
"שגיאה!"

פשוט לכו לפי הדמיון שלכם :)

תהנו |קורץ|

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

include("places/".$_GET['act']."/main.php"); 


RS324 22-12-06 18:49

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

LosNir 22-12-06 19:38

נו זה הקטע,
אבל אם יש לך מלא עמודים?
כל פעם תוסיף קייס? לא הכי יעיל...

RS324 22-12-06 19:41

ציטוט:

נכתב במקור על ידי LosNir (פרסם 392949)
נו זה הקטע,
אבל אם יש לך מלא עמודים?
כל פעם תוסיף קייס? לא הכי יעיל...

הרבה יותר יעיל..ובטוח....

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

psycho 22-12-06 20:24

ציטוט:

נכתב במקור על ידי RS324 (פרסם 392920)
למה לא להשתמש ב SWITCH ? הכי פשוט..
לתת לו מספר קייסים אפשריים...אם לא נתפס באחד מהם אז זה הולך ל DEAFULT
ככה שאין שום דבר ושום בעיה של אבטחה...

בדיוק.

כל שאר האלטרנטיבות פשוט לא יעילות.

ולמה להשתמש בשיטה הזו אי-פעם בכלל? של ה INCLUDEים. מיותר.

יש יותר מדי אופציות אחרות יעילות ואפילו עדיפות מבחינת אופטימיזציה

nevo 22-12-06 20:45

עוד רעיון חמוד,
נכון שהACT הוא בדר"כ Id מהמסד והId לא יכול להיות אפס.
תחשבו על זה ערך מספרי של טקסט זה 0.(זה יכול לפתור בעיות עם משהו מכניס בACT מחרוזת)
אין רשומה כזה 0 גם.
מה עושים, פתרון :P
PHP קוד:

$getAct = (isset( $_GET['act']))?$_GET['act']:0;
if( 
intval$_GET['act']) >){
    
// true value and the include :)
}
else
{
    
// false value



tnadav 22-12-06 20:54

ציטוט:

נכתב במקור על ידי psycho (פרסם 392980)
בדיוק.

כל שאר האלטרנטיבות פשוט לא יעילות.

ולמה להשתמש בשיטה הזו אי-פעם בכלל? של ה INCLUDEים. מיותר.

יש יותר מדי אופציות אחרות יעילות ואפילו עדיפות מבחינת אופטימיזציה

יש לך מושג על מה אתה מדבר בכלל?
Include-ים מיותרים?
מה נראה לך שב- Switch עושים?

Switch אולי יותר בטוח, ממש לא יותר מהיר וקשה לתחזוק, אם אתה רוצה משהו יותר נורמאלי תוציא מערך ממסד נתונים שמכיל את כל ה- ACT-ים ה"מותרים" ותבדוק עם ה- act שקיבלת מ- get נמצא במערך...

psycho 22-12-06 21:04

ציטוט:

נכתב במקור על ידי tnadav (פרסם 393027)
יש לך מושג על מה אתה מדבר בכלל?
Include-ים מיותרים?
מה נראה לך שב- Switch עושים?

Switch אולי יותר בטוח, ממש לא יותר מהיר וקשה לתחזוק, אם אתה רוצה משהו יותר נורמאלי תוציא מערך ממסד נתונים שמכיל את כל ה- ACT-ים ה"מותרים" ותבדוק עם ה- act שקיבלת מ- get נמצא במערך...

נשמה, כמה מניפולציות על ה משתנה שמתקבל ב GET וישר רץ ל INCLUDE ואני נחשף לכלכך הרבה פירצות אבטחה.

לא עדיף פשוט לעבוד נטו עם מסד?
או במקרה הכי גרוע ובא לי להשקיע עוד דקה ולעבוד עם MOD REWRITE

Eli-Hai 22-12-06 21:08

טוב אני מתנצל שחשבתי שאפשר להשתמש ב-readdir ו-switch על מנת לשלוף קבצים עם $_GET באופן אוטומטי, טעות שלי. מתנצל.

tnadav 22-12-06 21:22

ציטוט:

נכתב במקור על ידי psycho (פרסם 393045)
נשמה, כמה מניפולציות על ה משתנה שמתקבל ב GET וישר רץ ל INCLUDE ואני נחשף לכלכך הרבה פירצות אבטחה.

לא עדיף פשוט לעבוד נטו עם מסד?
או במקרה הכי גרוע ובא לי להשקיע עוד דקה ולעבוד עם MOD REWRITE

ואיזה מניפולציות?..
אתה יודע מה? הנה קוד שאני מביא לך ותמצא לו פירצה:
PHP קוד:

<?php
include("db.php"); //connecting to DataBase!
//------------------------------------------------------------
$query mysql_query("SELECT `acts` FROM `sitedna`");

while(
$info=mysql_fetch_array($query))
    
$acts[] = $info['acts'];
//------------------------------------------------------------
if(in_array($_GET['act'], $acts)
{    
    if(
file_exists($_GET['act'].".php")
        include(
$_GET['act'].".php");
}
?>

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

RS324 22-12-06 21:43

ציטוט:

נכתב במקור על ידי tnadav (פרסם 393069)
ואיזה מניפולציות?..
אתה יודע מה? הנה קוד שאני מביא לך ותמצא לו פירצה:
PHP קוד:

<?php
include("db.php"); //connecting to DataBase!
//------------------------------------------------------------
$query mysql_query("SELECT `acts` FROM `sitedna`");

while(
$info=mysql_fetch_array($query))
    
$acts[] = $info['acts'];
//------------------------------------------------------------
if(in_array($_GET['act'], $acts)
{    
    if(
file_exists($_GET['act'].".php")
        include(
$_GET['act'].".php");
}
?>

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

אם REGISTER_GLOBALS דולקים אז כן יכולה להיות לך בעיה..

אבל נדלק על הקטע הזה...
מה הרעיון פה... בכל מקרה אתה צריך לכתוב את כל ה ACT האפשריים - אז פשוט תדחוף את זה ב SWITCH

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

אהה וגם לא טיפלת במקרה שה ACT לא מורשה...אין לך שום דבר מוגדר כ DEAFULT....

tnadav 22-12-06 21:59

ציטוט:

נכתב במקור על ידי RS324 (פרסם 393090)
אם REGISTER_GLOBALS דולקים אז כן יכולה להיות לך בעיה..

אבל נדלק על הקטע הזה...
מה הרעיון פה... בכל מקרה אתה צריך לכתוב את כל ה ACT האפשריים - אז פשוט תדחוף את זה ב SWITCH

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

אהה וגם לא טיפלת במקרה שה ACT לא מורשה...אין לך שום דבר מוגדר כ DEAFULT....

לא טיפלתי בזה כי כתבתי משהו ב- NotePed ב- 2 דקות מתוך לחץ שעוד שניה מתחיל ארץ נהדרת :P

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

WebProject 22-12-06 22:38

לא ממש יעיל מה שעשית, עדיף switch, ואגב, "להשתיק" את הinclude? מה זה אמור להגיד למשתמשים שיקראו את זה? פשוט, התו הזה, הוא בעצם מקביל למספר פונקציות שקיימות כמו error_reporting וכו', ובמקרה של ארור, הוא לא מציג אותו, השוני פה שזה רק לפונקצייה של האינקלוד.

:)

SDF 22-12-06 23:33

ציטוט:

נכתב במקור על ידי Tomer (פרסם 392863)
נתחיל בזה ש include סה"כ יצרף את הקוד לדף, ולא יציג לך אותו.
דבר שני, incldue לא יכול לגשת לתיקיות שאתה לא יכול, וגם לא יכול להוסיף דפים מחוץ לתיקיית ה public_html.

זה רק יצרף את הקוד, אבל זה כבר מקרב את הפורץ הפוטנציאלי צעד נוסף אלייך.
רוב השרתים רצים עם mod_php, ז"א כל סקריפטי הPHP רצים תחת היוזר שהapache רץ תחתיו
www או apache או כל שטות אחרת, כדי שהסקריפטים של כל היוזרים יעבדו, הסקריפטים הם בד"כ ב777 (ז"א קריא ע"י others). שזאת פירצה בפני עצמה.

PHP קוד:

<?php
// מציג את היוזר שהסקריפט רץ תחתיו
$processUser posix_getpwuid(posix_geteuid());
print 
"I'm running uder: <b>" $processUser['name'] . "</b><br>\n";
// מציג את היוזר שהקובץ שייך לו
print "File owned by: <b>" get_current_user() . "</b><br>\n";
?>

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

null 23-12-06 12:36

למה לא לבנות מערך עם שמות של עמודים קיימים,
[ או לקלוט את העמודים מתוך המסד למערך ]

ואז כשמקבלים משהו, לבדוק אם הוא קיים במערך,
אם כן אז להציג, אם לא אז לשמור פרטים לטיפול |winky|

עריכה:
אני רואה שמישהו כבר הציעה את זה :)

psycho 23-12-06 13:10

ציטוט:

נכתב במקור על ידי SDF (פרסם 393136)
זה רק יצרף את הקוד, אבל זה כבר מקרב את הפורץ הפוטנציאלי צעד נוסף אלייך.
רוב השרתים רצים עם mod_php, ז"א כל סקריפטי הPHP רצים תחת היוזר שהapache רץ תחתיו
www או apache או כל שטות אחרת, כדי שהסקריפטים של כל היוזרים יעבדו, הסקריפטים הם בד"כ ב777 (ז"א קריא ע"י others). שזאת פירצה בפני עצמה.

PHP קוד:

<?php
// מציג את היוזר שהסקריפט רץ תחתיו
$processUser posix_getpwuid(posix_geteuid());
print 
"I'm running uder: <b>" $processUser['name'] . "</b><br>\n";
// מציג את היוזר שהקובץ שייך לו
print "File owned by: <b>" get_current_user() . "</b><br>\n";
?>

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

safe mode
opendir
וכו'
מדבר אלייך
או שגם את זה אתה עוקף בשניה? :) למה להכליל את "החברות" פה, זה שהם קנו DA ובטוחים שהם מאובטחים זה משו אחד אבל להכליל את כל השאר זה מעליב


------
בכל אופן מר נדב המתכנת הדגול, לא עשית משהו יותר יעיל מ ה SWITCH
שאני בכלל נגדו, אבל אם מתעקשים על ACT בצורה כזו עם אינקלודים וכו'
אז שיבושם להם

tnadav 23-12-06 13:43

ציטוט:

נכתב במקור על ידי psycho (פרסם 393326)
------
בכל אופן מר נדב המתכנת הדגול, לא עשית משהו יותר יעיל מ ה SWITCH
שאני בכלל נגדו, אבל אם מתעקשים על ACT בצורה כזו עם אינקלודים וכו'
אז שיבושם להם

אני אומר שוב ושוב! זה לא יותר יעיל!
זה פשוט יותר קל לתחזוקה, וזאת הבעיה הגדולה של Switch...

ואני לא ממש מבין על מה אתה מדבר, שאתה עושה Switch, אתה לא עושה Include? מה אתה כן עושה?

בנוסף, אתה אמרת שאתה בכלל נגד Switch, מה אתה כן מציע?

Eli-Hai 23-12-06 15:57

אני הצלחתי לבנות משהו פשוט עם foreach וכמה תנאים פשוטים, שהמשתמש שולף את הקובץ בצורה מאובטחת לחלוטין - זה חוסם כתובות, או דפדוף בתיקיות באמצעות ..\ או /.. וכל שיטה אחרת :P

EDIT
שכחתי לציין, זה שולף אוטומטית עם $_GET, בלי צורך לעדכן את קובץ השליפה.
צריך ליטוש אחרון וזהו.

psycho 23-12-06 15:57

ציטוט:

נכתב במקור על ידי tnadav (פרסם 393343)
אני אומר שוב ושוב! זה לא יותר יעיל!
זה פשוט יותר קל לתחזוקה, וזאת הבעיה הגדולה של Switch...

ואני לא ממש מבין על מה אתה מדבר, שאתה עושה Switch, אתה לא עושה Include? מה אתה כן עושה?

בנוסף, אתה אמרת שאתה בכלל נגד Switch, מה אתה כן מציע?

מי צריך לעבוד עם ?act וכו'?

SWITCH נוח כתחלופה למספר רב של IFים

למה לי לעבוד
index.php?page=register
ולא כ
register.php ?

SDF 23-12-06 16:34

ציטוט:

נכתב במקור על ידי psycho (פרסם 393326)
safe mode
opendir
וכו'
מדבר אלייך
או שגם את זה אתה עוקף בשניה? :) למה להכליל את "החברות" פה, זה שהם קנו DA ובטוחים שהם מאובטחים זה משו אחד אבל להכליל את כל השאר זה מעליב

בגלל זה דיברתי על "חברות", ולא חברות.
ובכל אופן, safe mode וopendir לא נעקפים בשניה, לא בPHP לפחות, אבל רוב החברות גם נותנות גישה להרצת CGI, מה שהופך את הנ"ל למיותרים.

הרי אם יש לי יוזר בשרת כלשהו, כל מה שאני צריך לעשות
בשביל לגנוב למישהו את הקוד, זה רק לדעת מה היוזר שלו, והדומיין.
ואז לעשות איזה bla.cgi
קוד:

#!/bin/bash
cat /usr/home/victim_user/victim.com/public_html/index.php

והופ, הקוד אצלי.
וכן, גם על זה אפשר להתגבר עם suexec.
אבל לדעתי, מראש, רצוי שסקריפטים (PHP ודומייהם) ירוצו תחת היוזר שיצר אותם, ולא יוזר אחד,
כמו apache, www, httpd וכו'.

tnadav 23-12-06 16:52

ציטוט:

נכתב במקור על ידי psycho (פרסם 393413)
מי צריך לעבוד עם ?act וכו'?

SWITCH נוח כתחלופה למספר רב של IFים

למה לי לעבוד
index.php?page=register
ולא כ
register.php ?

מה שהבאת בהחלט מיותר, אבל, במערכת גדולה, לפעמים יש צורך להשתמש ב- ACT, למשל, כאשר המערכת מונחית מודולים, ואנחנו רוצים להשתמש במודול מסוים

נריה 23-12-06 21:01

נחמד
אבל אני משתמש ב

הרבה יותר יעיל וטוב
PHP קוד:

switch($page)

case 
'logout'
include 
"out.php"
break;


ומה שלא ניכנס הולך deafult


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

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