יום שלישי, 22 ביולי 2008

העברת אתר ושמירה על SEO

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

הפניות אלה צריכות להיות הפניות http מסוג "301 – Permanent Redirect"
מנועי החיפוש ישמרו כך את הכתובות החדשות במקום הישנות ויפנו אליהן את הגולשים (במקום לחשוב שהדף הלך לאיבוד). השאיפה היא תמיד לשמור על מכסימום קישורים ולכן יש לשאוף ולשמור על החוקים הבאים:


פנייה המגיעה אל דף פנימי בדומיין הישן - תועבר אל אותו דף פנימי בדומיין החדש. במידה ולא ניתן למפות אל דף מוגדר בדומיין החדש - תועבר ההפניה אל דף הבית.

יש לשים לב שבמקרים בהם מגיעה פנייה אל דף שקיים במערכת, אך מוגדרת עבורו גם כתובת חברותית (Freandly URL) תפנה המערכת אל כתובת הדף החברותית.

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


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


במקרים כאלה עלינו לשמור על הקישור ופשוט ליצור הפנית 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

תרשום לי זריקה

על הזרקות SQL ונסיונות לגנוב תעבורה.

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

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

דוגמה לנסיון חדירה כזה ניתן לראות ברישום הלוג הבא (הלוג רושם את נסיון החדירה וכל המידע הנדרש למעקב וטיפול):

זהו קובץ שאמור לקבל דרך משתנה בשם addID, נתון שהוא מספר. בשורה המודגשת אנחנו רואים שמישהו ניסה להזין לשדה זה כתובת URL מאתר אחר, כנראה כדי למשוך ממנו קובץ הוראות לשרת.

======== Warning ===========
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 וצא.
השורה השלישית הזו היא בדיוק מה שתפס את נסיון הפריצה הפעם.

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