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

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

בניה 29-11-08 21:23

ציטוט:

נכתב במקור על ידי vadimg88 (פרסם 684585)
כמו שאמרתי לא תמצא משהו ודאי ב 100% לכן אל תסתמך על זה. אבל באתר http://il.php.net/manual/en/function.base64-decode.php יש פונקציה שאכן נראית כמו אחת שתעבוד הכי טוב בעניין הזה.

PHP קוד:

function checkBase64Encoded($encodedString)
{
    
$length strlen($encodedString);

    
// Check every character.
    
for ($i 0$i $length; ++$i
    {
        
$c $encodedString[$i];
        if (
        (
$c '0' || $c '9')
        && (
$c 'a' || $c 'z')
        && (
$c 'A' || $c 'Z')
        && (
$c != '+')
        && (
$c != '/')
        && (
$c != '=')
        ) {
            
// Bad character found.
            
return false;
        }
    }
    
// Only good characters found.
    
return true;


הפונקציה בודקת תו תו ומוודא שזה נמצא בטווח התווים של האלפבית של ההצפנה שווה לנסות.

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

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

intercooler3819 29-11-08 21:30

לדעתי פתרתי אתת הבעיה כבר קודם
תקראו את התגובה שלי זה דיי ממצא
הכי קל לעשות DECODE, אם קיבלת FALSE אז זה אומר שזה לא BASE64 ENCODED
אם לא קיבלת FALSE אז קח את הערך שקיבלת מהDECODE, תעביר עליו ENCODE ואז תשווה אותו עם הערך המקורי שהוא צריך להיות ENCODED, אם הם שווים --> זה מוצפן בBASE 64

בהצלחה

Shon12 29-11-08 23:07

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

הקוד:
PHP קוד:

<?php
$string 
"#iu3498r";
$new;
$out;

        if (
base64_encode($new) == $string)
        {
        
$out "BASE64";
        }
        else {
        
$out "Not a BASE64";
        }


    if (!
base64_decode($string))
    {
    
$out "can't decode";
    }

    else {
    
$new base64_decode($string);
    }

echo 
$out;
?>


intercooler3819 29-11-08 23:27

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

function checkBase64Encoded ($encodedString)
{
    
$length strlen($encodedString); 

    for (
$i 0$i $length; ++$i)  
    { 
        
$c $encodedString[$i]; 
        if ( 
        (
$c '0' || $c '9'
        && (
$c 'a' || $c 'z'
        && (
$c 'A' || $c 'Z'
        && (
$c != '+'
        && (
$c != '/'
        && (
$c != '='
        ) { 
            return 
false
        } 
    } 

     if (
base64_decode($encodedString) === FALSE)
     {
          return 
false;
     }
     else if (
base64_encode(base64_decode($encodedString)) !== $encodedString)
     {
          return 
false;
     }

     return 
true;


לא בדקתי
תתפנק

DvirCohen 29-11-08 23:28

PHP קוד:

$new
$out

אני לא יכול לראות את זה :\
אם אתה לא מקצה למשתנים ערך אל תצהיר עליהם בכלל..חבל על הזיכרון

intercooler3819 29-11-08 23:34

ציטוט:

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

$new
$out

אני לא יכול לראות את זה :\
אם אתה לא מקצה למשתנים ערך אל תצהיר עליהם בכלל..חבל על הזיכרון

זה כנראה מתכנת שעבר משפה אחרת לPHP
ודביר - PHP בכללי זוללת זכרון כי אתה לא ממש מגדיר משתנים ואז האינטרפרטר לא בדיוק מקצה גדלים (אינט של 8 ביט או 16 או 32 והלאה), בגלל זה ההערה שלך ממש לא במקום

אני יורה לעצמי ברגל אם אתה מגדיר סוגי משתנים בPHP בקוד שלך (:

בניה 29-11-08 23:39

ציטוט:

נכתב במקור על ידי nitsanbn (פרסם 684613)
זה כנראה מתכנת שעבר משפה אחרת לPHP
ודביר - PHP בכללי זוללת זכרון כי אתה לא ממש מגדיר משתנים ואז האינטרפרטר לא בדיוק מקצה גדלים (אינט של 8 ביט או 16 או 32 והלאה), בגלל זה ההערה שלך ממש לא במקום

אני יורה לעצמי ברגל אם אתה מגדיר סוגי משתנים בPHP בקוד שלך (:

היא לא זוללת,היא מקצה הכל באופן דינאמי.
והגודל int קבוע מראש לפי מספר שקבוע מphp.ini

Shon12 29-11-08 23:46

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

vadimg88 30-11-08 09:55

לפי הדוקומנטציה בישביל שה DECODE יחזיר FALSE צריך להעביר לו פרמטר שני שיהיה שוורה ל TRUE או 1

PHP קוד:

if (base64_decode($encodedString) === FALSE

צריך להיות

PHP קוד:

if (base64_decode($encodedStringture) === FALSE


DvirCohen 30-11-08 18:14

ציטוט:

נכתב במקור על ידי nitsanbn (פרסם 684613)
זה כנראה מתכנת שעבר משפה אחרת לPHP
ודביר - PHP בכללי זוללת זכרון כי אתה לא ממש מגדיר משתנים ואז האינטרפרטר לא בדיוק מקצה גדלים (אינט של 8 ביט או 16 או 32 והלאה), בגלל זה ההערה שלך ממש לא במקום

אני יורה לעצמי ברגל אם אתה מגדיר סוגי משתנים בPHP בקוד שלך (:

האמת שאני לא יודע איך אפשר להגדיר סוג משתנה כשאתה מצהיר עליו.
מאז שאני לומד JAVA, אם הייתי יודע איך להצהיר על סוג משתנה, יש מצב הייתי עושה את זה.

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

ציטוט:

נכתב במקור על ידי Shon12 (פרסם 684617)
בקשר לאיך שהגדרתי את המשתנים - אני לא בקיא באיך שהמשתנים נכנסים לזיכרון וכל זה, אבל לפעם הבאה אני אדע.
בכל מקרה הרעיון של ניצן באמת עובד חלק, ניצן את האמת? לא הבנתי אפילו איך זה עובד... אתה יכול להסביר?
כלומר איך הוא באמת מזהה שזאת הצפנה תקינה בזה שעשית לו ENCODE וDECODE, לפי מה שטיפה הבנתי שסגרת את כל הקומבינציות אם ההצפנה תקינה או לא.

ברגע שיש לך מחרוזת, ותעשה לה encode ואז decode שוב והיא תהיה שווה למחרוזת שהייתה בהתחלה, זה אומר שהמחרוזת הוצפנה, כי אז הencode שלה יהיה תמיד זהה.
אם תיקח סתם מחרוזת, לדוגמא dvir==, ותעשה לה encode, ואז תעשה decode למחרוזת החדשה, זה לא יהיה אותו דבר.


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

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