התקנת Rails על Windows; שלב אחרי שלב

זהו יותר מדריך מאשר פוסט לבלוג; אבל נקרא לזה פוסט רק לצורך ההבנה. בפוסט זה אני אסביר כיצד להתקין את Ruby, Rails, Ruby Gems, Mysql על שרת Windows 2000 (ווינדוס XP צריך להיות אותו דבר).

Read More

Share Comments

מה זה Ruby On Rails ?

הרבה שואלים מה זה Ruby On Rails (בקיצור RoR) איך משתמשים בזה והאם זה קיים גם אצלנו בשרת?

זה התחיל מ Ruby בלבד, רק לאחר מכן הגיע ה Rails. זה התחיל מזה ש Ruby הינה שפת תכנות קוד-פתוח שפותחה ביפן בשנת 1995. ברוב השרתים כיום Ruby כבר מותקנת ופועלת בידיוק כמו שאר שפות התכנות הפועלות על אותו השרת כמו PHP, ASP ו Perl .

Read More

Share Comments

Twitter טוענים שהם זורקים את Rails ועוברים ל PHP

השמועה הזאת רצה במספר רב של מקורות: אחרי כמעט שנתיים מלאות של בעיות אופטמזציה ופרופילים טוויטר שוקל לנטוש את ה framework אשר הוא משתמש בו כרגע (ruby on rails) ולהתחיל מחדש עם PHP או JAVA (פתרון אחר שהם הציעו זה להמשיך עם Ruby אבל לנטוש את Rails).

Read More

Share Comments

הצפנת סיסמאות - זה לא כל כך פשוט!

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

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

כיום ישנם כמה שירותים/דרכים לאתר את הסטרינג המקורי של HASH בעזרת חיפוש קצר באתרים כמו MD5 LookUp יאתר את הטקסט המקורי של HASH במידה והוא קיים במאגר. לא ניתן לדעת מה הטקסט המקורי היה אלה אם כן הוא קיים במאגר כלשהו שאפשר יהיה לאתר אותו לפי ה HASH שלו.

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

כדי למנוע זאת ישנו מונח בקריפטוגרפיה הנקרא Salting שמאפשר הוספה של תווים אקראים לסטרינג כדי לקבל HASH שונה מה HASH של הסטרינג ללא ה SALT. במובן פשוט יותר יהיה הרבה יותר קשה לפרוץ סיסמא שהוצפה בעזרת SHA1 או MD5 המכילה SALT.

נשאלת השאלה במה עדיף להשתמש MD5 או SAH1 ? ובכן MD5 הוא יותר פופולארי ונתמך מגרסא 4 ומעלה. SHA1 הוא פופולארי לא פחות אבל נתמך בגרסאות של PHP 4.3.0 ומעלה. שניהם הם הצפנות חד צדדיות, MD5 מצפין בעזרת 32 בייטים של תווים לעומת SHA1 שמצפין בעזרת 40 בייטים. מאגר המידע של ה HASHES שקיים ל MD5 הוא גדול יותר משל SHA1 לכן הסיכוי שמשהו יאתר את הסיסמא המוצפנת של MD5 הוא גבוה יותר. לכן אם ישנה אפשרות עדיף לעבוד עם SHA1 .

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

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

נתחיל בעזרת זה שאנחנו נכתוב הכל ל PHP 5 ונשתמש במתודות סטטיות ככה שלא צריך לשנות שם כלום.

נקרא למחלקה Hash וגם שם הקובץ יהיה Hash.php ככה שיהיה אפשר להשתמש ב __autoload כדי לטעון אותה.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
class Hash
{
# Secret key that will be used to generate the salt
private static $secret_key = "some secret key that should be changed to something harder to break and decrypt abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
/**
* Constructor
*
*/
function __construct()
{
# Over ride secret key
/* You can alter the secret key with something other then the default by calling self::$secret_key = "something else"; */
}
/**
* Compare passwords function
*
* Function to compare plain text password with it's hash
*
* @param string $plain_text
* @param string $encrypted
* @param string $salt
* @return boolean
*/
public static function ComparePassword($plain_text, $encrypted, $salt)
{
if( $encrypted == self::HashData($plain_text, $salt) )
{
return true;
}
return false;
}
/**
* Hash data
*
* Function to hash the actual plain text string
* using a combination of sha1 & md5 and a salt
*
* @param string $plain_text
* @param string $salt
* @return string
*/
public static function HashData( $plain_text, $salt, $len=32 )
{
return substr(md5($salt) . sha1($plain_text), 0, $len);
}
/**
* Makes a salt
*
* function to generate a salt
*
* @param int $len
* @return string
*/
public static function MakeSalt( $len=5 )
{
$salt = substr(md5(uniqid(rand(), true)), 0, $len);
return substr($salt . sha1($salt . self::$secret_key), 0, $len);
}
}

הסבר קצר על הפונקציות, פונקציה ComparePassword משמשת בישביל לאמת אם ה HASH של הסיסמא זהה לסטרינג שהועבר לפונקציה וה SALT. (דוגמאות בהמשך). פונקציה HashData בעצם מחזירה את ה HASH של הסטרינג שהועבר אליה בפרמטר וה SALT גם הוא הועבר. פונקציה MakeSalt בעצם יוצרת SALT.

בישביל שזה יעבוד אתם תדרשו לשמור את הסיסמא ואת ה SALT במסד הנתונים כדי שיהיה ניתן אחר כך לשלוף אותם ולאמת אותם.

לצורך דוגמא נניח וקבלנו עכשיו משתנה מטופס בשם password בתוך משתנה סופרגלובאלי POST לכן הקוד הבא:

$_POST['password'];```
1
2
3
4
5
ידפיס את הסיסמא שהמשתמש הזין בטופס. מה שאנחנו נעשה זה נעביר את הסיסמא לערך שנגדיר וניצור ערך נוסף שיחזיק את ה SALT גם אותו נצור מיד לדוגמא:
```$password = $_POST['password']; // Hold the password from the form
$salt = Hash::MakeSalt(); // Create a 5 long random salt string

עכשיו כדי שיהיה ניתן לאמת אחר כך נצטרך לשמור את הערך password$ בשדה בטבלה ואת הערך salt$ בשדה נפרד בטבלה לכל משתמש שנרשם.

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

= mysql_fetch_array($mysql_resource); Query here to fetch member information from database
1
2
3
4
5
6
7
8
9
10
$password = $_POST['password']; // the password the member entered in the loggin form
$hashpass = $row['password']; // the hash password that is saved in the DB
$salt = $row['salt']; // the salt of the member hash saved in the DB
// Check to see if the passwords are the same
if( Hash::ComparePassword( $password, $hashpass, $salt ) )
{
echo "password ok you are logged in";
}

זאת אומרת שהערך password$ מכיל את הסיסמא שהמשתמש הזין בטופס ההתחברות, הערך hashpass$ זהו ה HASH של הסיסמא של המשתמש שמגיע מהמסד, הערך salt$ זהו ה SALT שנוצר למשתמש בעת ההרשמה ונשמר במסד הנתונים. לאחר מכן מעבירים הכל לפונקציה בתור פרמטרים שמחזירה true/false ומציגה את מה שצריך במידה וזה נכון/לא נכון.

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

המחלקה תעבוד רק עם PHP 5. כמו כן לא צריך לעשות require או include במידה ואתה משתמשים ב autoload__ .

Share Comments

עבודה עם פריימוורק או התחלה חדשה?

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

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

אני למשל הגעתי מה Zend Framework (אלה מה?!) עבדתי איתה קצת ואחרי זמן קצר הבנתי שהיא פחות framework אלה יותר ספריה של דברים שימושיים, וזה לא מה שחיפשת. מצאתי אתר מאוד שימושי ל frameworks ב PHP בשם PHP Frameworks (כמה אירוני), האתר הזה מספק רשימה של frameworks הכתובים ב PHP בלבד ומציג אותן בתוך טבלה נוחה לקריאה ומפרט על כל אחת, מה יש בה ומה אין לעומת השאר. ככה שאתה תוכל לבחור את הטובה ביותר מבין כל הרשימה. בין כל ה frameworks המוצגים שם אפשר לראות את הפופולארים ביותר כמו Zend Framework , Cake PHP, Symfony, Prado ואחרים. אני אישית התנסתי עם ZF, Cake PHP, Prado ואת האמת לא ממש התרשמתי מהם. כשהסתכלתי מקרוב אפשר היה להבחין ב 2 רשומות בלבד שתומכות בכל הקריטריונים המוצגים שם וכתובות ב PHP 5. הלא הן Prado & Yii למען האמת שניהם נכתבו על ידי אותו בנאדם (Qiang) שבעצם התחיל עם Prado אבל נתקל בכל כך הרבה דברים שאפשר היה לשפר ולשנות שהחליט לכתוב משהו מהתחלה וקרא לזה Yii .

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


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

  • שימוש ותמיכה ב MVC (קיצור של Model-View-Controller) זהו כנראה השילוב המנצח של כל המערכות שנכתבות כרגע, כתיבת מערכת תוך כדי חלוקה של הקוד והעיצוב הם דבר הכרחי, כתיבת קובץ PHP שמכיל בתוכו את ה HTML היא לא פרקטיקה טובה לתכנות ויש להמנע מזה.

  • מסדי נתונים, אני אישית משתמש ב MYSQLi אבל אני עדיין רוצה שה framework יוכל לעבוד עם MSSQL, MYSQL, SQLlite, Oracle ואחרים כדי שיהיה ניתן לפנות לכמה שיותר משתמשים עם התקנות שונות בעזרת מערכת אחת.

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

  • EDP , מונח נוסף שלא פחות חשוב (קיצור של Event Driven Programming) מאפשר לכם לתכנת פעולות מסויימות שיבוצעו על סמך פעולות אחרות שנעשות תוך כדי הרצה. נשמע קצת מפולח אבל בהחלט עוזר.


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

מסקנה

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

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

Share Comments