╠εµσ≥ ±δ≤≈Φ≥ⁿ± ≥αΩ, ≈≥ε φαßε≡ ⌠≤φΩ÷ΦΘ, εßσ±∩σ≈ΦΓασ∞√⌡ PHP/FI φσ ΓΩδ■≈ασ≥ Γ ±σß ±∩σ÷Φ⌠Φ≈σ±Ω≤■ ⌠≤φΩ÷Φ■, Γ Ωε≥ε≡α ∞εµσ≥ Γα∞ ∩ε≥≡σßεΓα≥ⁿ± . ╥∙α≥σδⁿφε ±δσΣ≤ ∩≤φΩ≥α∞, ε∩Φ±αφφ√∞ φΦµσ, Γ√ ±∞εµσ≥σ ΣεßαΓΦ≥ⁿ Γα°Φ ±εß±≥Γσφφ√σ ⌠≤φΩ÷ΦΦ PHP/FI.
╧≡σµΣσ, ≈σ∞ ┬√ φα≈φσ≥σ ⌡α≈Φ≥ⁿ Γφ≤≥≡σφφ■■ ε≡παφΦτα÷Φ■ PHP/FI, φ≤µφε φαΘ≥Φ Ωε∩Φ■ ∩ε±δσΣφσΘ Γσ≡±ΦΦ Bison. Bison - GNU ≡σαδΦτα÷Φ YACC (Yet Another Compiler Compiler). YACC, Ωε≥ε≡√Θ °σδ ± Γα°σΘ ε∩σ≡α÷ΦεφφεΘ ±Φ±≥σ∞εΘ, ∞εµσ≥ εΩατα≥ⁿ± , α ∞εµσ≥ Φ φσ εΩατα≥ⁿ± Σε±≥α≥ε≈φε ∩≡Φσ∞δΦ∞√∞, φε ∩≡ε±≥ε ≈≥εß√ ≤Σε±≥εΓσ≡Φ≥ⁿ± , δ≤≈°σ Σεß√≥ⁿ Bison. ┬√ ∞εµσ≥σ φαΘ≥Φ σπε Γ ftp://prep.ai.mit.edu/pub/gnu.
═≤µφε ≥αΩµσ ∩≡ε±∞ε≥≡σ≥ⁿ Makefile Φ ΓΩδ■≈Φ≥ⁿ ε≥δαΣΩ≤. ╧≡ε±≥ε ≡ατΩε∞∞σφ≥Φ≡≤Θ≥σ ±≥≡εΩ≤ DEBUG Γ ⌠αΘδσ Makefile. ┬√⌡εΣφεΘ ⌠αΘδ Φφ⌠ε≡∞α÷ΦΦ ε≥δαΣΩΦ ε∩≡σΣσδ σ≥± ∩σ≡σ∞σφφεΘ DEBUG_FILE Γ php.h. ╧ε ≤∞εδ≈αφΦ■ ≤±≥αφεΓδσφ Γ /tmp/php.err. ┬√ ∞εµσ≥σ Φτ∞σφ ≥ⁿ σπε, ±επδα±φε Γα°Φ∞ ∩ε≥≡σßφε±≥ ∞.
╟αΩδ■≈Φ≥σδⁿφα Γσ∙ⁿ Ωε≥ε≡≤■ φ≤µφε Φ∞σ≥ⁿ Γ ΓΦΣ≤ - ≥ε, ≈≥ε php Γ√∩εδφ σ≥± ± ≥σ∞ µσ ΦΣσφ≥Φ⌠ΦΩα≥ε≡ ∩εδⁿτεΓα≥σδ ≈≥ε Φ httpd φα Γα°σΘ ±Φ±≥σ∞σ, σ±δΦ Ωεφσ≈φε ┬√ φσ Γ√∩εδφ σ≥σ, σπε ± ≤±≥αφεΓδσφφ√∞ ßΦ≥ε∞ setuid, Φ ²≥ε≥ ∩εδⁿτεΓα≥σδⁿ httpd Γεεß∙σ φσ Φ∞σσ≥ Σε±≥≤∩α Σδ τα∩Φ±Φ Ω ≡ατδΦ≈φ√∞ Ωα≥αδεπα∞. ▌≥ε ετφα≈ασ≥ ²≥ε, σ±δΦ ┬√ Σσδασ≥σ ≈≥ε-δΦßε, ≈≥ε Γ√τ√Γασ≥ php Ω Σα∞∩≤ ∩α∞ ≥Φ, ┬√ ∞εµσ≥σ φσ ∩εδ≤≈Φ≥ⁿ ⌠αΘδ Σα∞∩α. ╧≡ε±≥εΘ ±∩ε±εß ≡σ°σφΦ ±ε±≥εΦ≥ Γ ≥ε∞ ≈≥ε φ≤µφε ±Σσδα≥ⁿ Ωα≥αδεπ, πΣσ ┬√ ⌡≡αφΦ≥σ Γα° ≥σ±≥εΓ√σ .html ⌠αΘδ√, Σε±≥≤∩φ√∞ Γ±σ∞ ∩ε τα∩Φ±Φ. PHP Φτ∞σφ σ≥ ≥σΩ≤∙ΦΘ Ωα≥αδεπ φα Ωα≥αδεπ .html ⌠αΘδα, Ωε≥ε≡√Θ ±≈Φ≥ασ≥√Γασ≥± , Φ ≥αΩΦ∞ εß≡ατε∞ ε≥ß≡α±√Γα≥ⁿ Ωε≡Ω≤ ≥≤Σα, σ±δΦ ±∞εµσ≥.
┬ ∩ε±δσΣ≤■∙Φ⌡ °απα⌡ ∞√ ß≤Σσ∞ Φ±∩εδⁿτεΓα≥ⁿ ⌠≤φΩ÷Φ■ Time(), Σδ Φδδ■±≥≡Φ≡α÷ΦΦ, ΩαΩ ΣεßαΓΦ≥ⁿ ⌠≤φΩ÷Φ■.
σ±δΦ Γα°α ⌠≤φΩ÷Φ ∩≡ΦφΦ∞ασ≥ ε≥ 0 Σε 6 α≡π≤∞σφ≥εΓ, ≥ε Σε±≥≤∩φ√ - ∩≡σΣε∩≡σΣσδσφφ√σ π≡α∞∞α≥ΦΩΦ. ┬√ ∞εµσ≥σ ∩≡ε∩≤±≥Φ≥ⁿ ²≥ε≥ °απ.
├≡α∞∞α≥ΦΩα Γα°σΘ ⌠≤φΩ÷ΦΦ ε∩≡σΣσδ σ≥± Γ ⌠αΘδσ parse.raw. ╧σ≡Γ√∞ Σσδε∞ φ≤µφε ΣεßαΓΦ≥ⁿ δσΩ±σ∞≤. ╦σΩ±σ∞α - Ωδ■≈σΓεσ ±δεΓε, Φτ ß≤ΩΓ Γσ≡⌡φσπε ≡σπΦ±≥≡α, Ωε≥ε≡εσ εß√≈φε ±εΓ∩αΣασ≥ ± Φ∞σφσ∞ Γα°σΘ ⌠≤φΩ÷ΦΦ. ┬±σ δσΩ±σ∞√ ε∩≡σΣσδσφ√ Γφα≈αδσ ⌠αΘδα parse.raw. ╧ε≡ ΣεΩ φσ Φ∞σσ≥ τφα≈σφΦ . ╟α≥σ∞ φ≤µφε ±⌠ε≡∞Φ≡εΓα≥ⁿ ⌠αΩ≥Φ≈σ±Ωεσ ∩≡αΓΦδε π≡α∞∞α≥ΦΩΦ YACC. ╨α±±∞ε≥≡Φ≥σ ±≤∙σ±≥Γ≤■∙Φσ ∩≡αΓΦδα, Φ φαΘΣΦ≥σ ⌠≤φΩ÷Φ■, Ωε≥ε≡α ∩ε⌡εµα φα ΣεßαΓδ σ∞≤■. ╚∞σΘ≥σ Γ ΓΦΣ≤, ≈≥ε ßεδⁿ°Φφ±≥Γε φε≡∞αδⁿφ√⌡ ⌠≤φΩ÷ΦΦ - ±≥αφΣα≡≥φ√σ ⌠≤φΩ÷ΦΦ, Ωε≥ε≡√σ ±≈Φ≥√Γα■≥ ∩α≡α∞σ≥≡√ Φτ ±≥σΩα Γ√≡αµσφΦΘ. ┬α°α ⌠≤φΩ÷Φ ±Ωε≡σσ Γ±σπε ß≤Σσ≥ ε≥φσ±σφα Ω ²≥εΘ π≡≤∩∩σ, Γ ²≥ε∞ ±δ≤≈ασ Γα∞ φσ φ≤µφε ß≤Σσ≥ ≥≡επα≥ⁿ ⌠αΘδ parse.raw.
≈≥εß√ ±Σσδα≥ⁿ ²≥ε, ∩εΣ≡σΣαΩ≥Φ≡≤Θ≥σ lex.c, Φ φαΘΣΦ≥σ ⌡²°-≥αßδΦ÷≤ ΓßδΦτΦ Γσ≡⌡φσΘ ≈α±≥Φ ⌠αΘδα. ═αΘΣΦ≥σ ±≥≡εΩ≤, static cmd_table_t cmd_table[22][30] = {, Ωε≥ε≡α ε∩≡σΣσδ σ≥ φα≈αδε ⌡²°-≥αßδΦ÷√. [22] [30] ε∩≡σΣσδ σ≥ ≡ατ∞σ≡ 2 ∞σ≡φεπε ∞α±±ΦΓα, Ωε≥ε≡√Θ ±εΣσ≡µΦ≥ ⌡²°-≥αßδΦ÷≤. 22 ²≥ε φα σΣΦφΦ÷≤ ßεδⁿ°α ∞αΩ±Φ∞αδⁿφα ΣδΦφα Φ∞σφΦ ⌠≤φΩ÷ΦΦ, Φ 30 ε≥φε±Φ≥± Ω ∞αΩ±Φ∞αδⁿφε∞≤ ≈Φ±δ≤ ⌠≤φΩ÷ΦΘ Γ δ■ßε∞ ⌡²° ±∩Φ±Ωσ. ┼±δΦ ┬√ ∩≡σΓ√°ασ≥σ δ■ßεσ Φτ ²≥Φ⌡ επ≡αφΦ≈σφΦΘ, ∩≡ε±≥ε ≤ΓσδΦ≈ⁿ≥σ Φ⌡ ∩≡ ∞ε τΣσ±ⁿ.
▌≥α ⌡²°-≥αßδΦ÷α ταΓεσΓαδα ß√ Γ ±ε≡σΓφεΓαφΦ ⌡ αß±εδ■≥φεσ τΓαφΦσ ±α∞εΘ ∩≡ε±≥εΘ ⌡²°-≥αßδΦ÷√ Γε Γ±σ∞ ∞Φ≡σ. ╒²° τφα≈σφΦσ - ²≥ε ΣδΦφα ±≥≡εΩΦ Φ∞σφΦ ⌠≤φΩ÷ΦΦ, Ωε≥ε≡≤■ φ≤µφε ⌡²°Φ≡εΓα≥ⁿ. ╥αΩ Σδ φα°σπε ∩≡Φ∞σ≡α Time(), φ≤µφε ΣεßαΓΦ≥ⁿ Γ⌡εΣ Σδ τφα≈σφΦ ⌡²°α 4 . ╥αΩΦ∞ εß≡ατε∞ ∞√ ΣεßαΓδ σ∞ ±δσΣ≤■∙≤■ ±≥≡εΩ≤ Ω ⌡²°-±∩Φ±Ω≤ Σδ 4:
{ "time",INTFUNC0,UnixTime },
▌≥ε≥ τα∩Φ±ⁿ ε≥εß≡αµασ≥ ±≥≡εΩ≤ φα δσΩ±σ∞≤ INTFUNC0. ┬√ ∞εµσ≥σ ∩εΦ±Ωα≥ⁿ π≡α∞∞α≥ΦΩ≤ Σδ δσΩ±σ∞√ INTFUNC0 Γ parse.raw, Φ ≤ΓΦΣσ≥σ, ≈≥ε ²≥ε - εß∙α π≡α∞∞α≥ΦΩα Σδ Γφ≤≥≡σφφσπε Γ√τεΓα ⌠≤φΩ÷ΦΦ ßστ ∩α≡α∞σ≥≡εΓ. ╤≥≡εΩα Γ ΩαΓ√≈Ωα⌡, Γδ σ≥± ⌠αΩ≥Φ≈σ±ΩεΘ ±≥≡εΩεΘ, Ωε≥ε≡α ß≤Σσ≥ Φ±∩εδⁿτεΓα≥ⁿ± Γ .html ⌠αΘδα⌡, Σδ Γ√τεΓα ⌠≤φΩ÷Φ■. ╚∞σΘ≥σ Γ ΓΦΣ≤, ≈≥ε Φ∞σφα ⌠≤φΩ÷ΦΦ PHP/FI ≡σπΦ±≥≡εφσταΓΦ±Φ∞√. ╚ ταΩδ■≈Φ≥σδⁿφ√Θ ²δσ∞σφ≥ - UnixTime, ²≥ε ≡σαδⁿφε Γ√τ√Γασ∞α ⌠≤φΩ÷Φ .
void UnixTime(void) { char temp[32]; sprintf(temp,"%ld",(long)time(NULL)); Push(temp,LNUMBER); }
╬ß≡α≥Φ≥σ ΓφΦ∞αφΦσ, ≈≥ε ⌠≤φΩ÷Φ Γδ σ≥± ⌠≤φ÷ΦσΘ void.▌≥ε ≤Ωατ√Γασ≥, ≈≥ε εφα φσ ΓετΓ≡α∙ασ≥ φΦ≈σπε. ▌≥ε ∞εµσ≥ ∩εΩατα≥ⁿ± ∩≤≥αφφ√∞, ∩ε≥ε∞≤ ≈≥ε ε≈σΓΦΣφε ⌠≤φΩ÷Φ ≥αΩ ΦδΦ Φφα≈σ Σεδµφα ΓετΓ≡α≥Φ≥ⁿ Γ≡σ∞ . ┬≡σ∞ ΓετΓ≡α∙ασ≥± , φε φσ ΩαΩ τφα≈σφΦσ ΓετΓ≡α∙ασ∞εσ ⌠≤φΩ÷ΦσΘ. ╬φε ∩ε∞σ∙ασ≥± Γ ≥ε, ≈≥ε φατ√Γασ≥± ±≥σΩε∞ Γ√≡αµσφΦΘ. ╤≥σΩ Γ√≡αµσφΦΘ - ∩≡ε±≥ε ±≥σΩ ±≥≡εΩ Φ ±Γ ταφφ√⌡ ± φΦ∞Φ ≥Φ∩εΓ. PHP/FI ∩εφΦ∞ασ≥ ≥εδⁿΩε 3 ε±φεΓφ√⌡ ≥Φ∩α ∩σ≡σ∞σφφ√⌡: STRING, LNUMBER Φ DNUMBER. STRING - ±Φ∞Γεδⁿφα ±≥≡εΩα, LNUMBER - ΣδΦφφεσ ÷σδεσ ≈Φ±δε, Φ DNUMBER - τφα≈σφΦσ double ΦδΦ float. ┬ ²≥ε∞ ∩≡Φ∞σ≡σ Time() , τφα≈σφΦσ, Ωε≥ε≡εσ ß≤Σσ≥ ΓετΓ≡α∙σφε - Γ≡σ∞ , Γ√≡αµσφφεσ Γ ⌠ε≡∞α≥σ Unix (≈Φ±δε ±σΩ≤φΣ φα≈Φφα ± φΓα≡ . 1 1970) Φ - ≥αΩΦ∞ εß≡ατε∞ ÷σδεσ ≈Φ±δε. ╤≥σΩ Γ√≡αµσφΦ ∩≡ΦφΦ∞ασ≥ ≥εδⁿΩε ±≥≡εΩΦ, ≥αΩΦ∞ εß≡ατε∞ ∞√ ∩≡σεß≡ατ≤σ∞, ± ∩ε∞ε∙ⁿ■ sprintf, ΣδΦφφεσ ÷σδεσ ≈Φ±δε Γ ±≥≡εΩ≤ Φ ∩ε∞σ∙ασ∞ ²≥ε τφα≈σφΦσ Γ ±≥σΩ, ≤Ωατ√Γα , ≈≥ε ²≥ε ⌠αΩ≥Φ≈σ±ΩΦ Γδ σ≥± ΣδΦφφ√∞ ÷σδ√∞ ≈Φ±δε∞ ± ∩ε∞ε∙ⁿ■ ±≥≡εΩΦ: Push(temp,LNUMBER);
┬ φΦµφσΘ ∩εδεΓΦφσ ⌠αΘδα php.h ┬√ φαΘΣσ≥σ ∩εδφ√Θ ±∩Φ±εΩ ∩≡ε≥ε≥Φ∩εΓ Γ±σ⌡ ⌠≤φΩ÷ΦΘ Γ php. ╬φΦ ±π≡≤∩∩Φ≡εΓαφ√ ∩ε ⌠αΘδα∞, Γ Ωε≥ε≡√⌡ εφΦ ∩ε Γδ ■≥± . ╧≡ε±≥ε ΣεßαΓⁿ≥σ Γα° ∩≡ε≥ε≥Φ∩ Ω ±εε≥Γσ≥±≥Γ≤■∙σ∞≤ ∞σ±≥≤ Γ ²≥ε∞ ⌠αΘδσ. ┬ φα°σπε ∩≡Φ∞σ≡α Time() ß≤Σσ≥ ΣεßαΓδσφα ±δσΣ≤■∙α ±≥≡εΩα:
void UnixTime(void);
┬√ Σεδµφ√ ∩ε∞φΦ≥ⁿ ε ≥ε∞ ≈≥ε φ≤µφε ∩σ≡σΣσδ√Γα≥ⁿ ±Φφ≥αΩ±Φ≈σ±ΩΦΘ αφαδΦτα≥ε≡ Γ± ΩΦΘ ≡ατ, ΩεπΣα Φτ∞σφσφ σ≥± ⌠αΘδ parse.raw. ┬ΓσΣΦ≥σ: make parser, ≈≥εß√ ±Σσδα≥ⁿ ²≥ε. ╟α≥σ∞ ±ΣσδαΘ≥σ φε≡∞αδⁿφ≤■ Ωε∞∩Φδ ÷Φ■, ΓΓσΣ : make, σ±δΦ ≥εδⁿΩε ²≥ε Γ√∩εδφσφε.
Time() - ²≥ε ∩≡Φ∞σ≡, Φδδ■±≥≡Φ≡≤■∙ΦΘ °απΦ, ∩≡Φ ΣεßαΓδσφΦΦ ⌠≤φΩ÷ΦΦ. ┬ετ∞εµφε, ≈≥ε ⌠≤φΩ÷Φ , Ωε≥ε≡≤■ ┬√ τα⌡ε≥Φ≥σ ΣεßαΓΦ≥ⁿ ß≤Σσ≥ φσ∞φεπε ßεδσσ ±δεµφεΘ ≈σ∞ ²≥ε≥ ∩≡Φ∞σ≡. ┬ετ∞εµφε Γ√ τα⌡ε≥Φ≥σ ∩σ≡σΣαΓα≥ⁿ ∩α≡α∞σ≥≡√ Γα°σΘ ⌠≤φΩ÷ΦΦ Φ ∞αφΦ∩≤δΦ≡εΓα≥ⁿ ²≥Φ∞Φ ∩α≡α∞σ≥≡α∞Φ ΩαΩΦ∞-δΦßε ±∩ε±εßε∞. ┬ετ∞εµφε Γ√ Σαµσ τα⌡ε≥Φ≥σ ≈≥εß√ εφα Γ√τ√Γαδα±ⁿ ≡ατδΦ≈φ√∞Φ ±∩ε±εßα∞Φ. ▌≥Φ ∩εφ ≥Φ ß≤Σ≤≥ ∩≡εΦδδ■±≥≡Φ≡εΓαφ√ PHP/FI ⌠≤φΩ÷ΦσΘ Crypt(). ╤∞. ≥αΩµσ ≡ατΣσδ, εταπδαΓδσφφ√Θ ╟α∞σ≈αφΦ ∩ε ⌡αΩαφΦ■ ╩εΣα Σδ φσ±ΩεδⁿΩε ßεδⁿ°σπε ≈Φ±δα ≥σ⌡φΦ≈σ±ΩΦ⌡ Σσ≥αδσΘ ε≥φε±Φ≥σδⁿφε φα∩Φ±αφΦ ΩεΣα Σδ PHP/FI.
├≡α∞∞α≥ΦΩα Crypt() Γ parse.raw:
%token CRYPT . . . | CRYPT '(' expr ',' expr ')' { if(GetCurrentState(NULL) || inCase || inElseIf) Crypt(1); } | CRYPT '(' expr ')' { if(GetCurrentState(NULL) || inCase || inElseIf) Crypt(0); }
╟Σσ±ⁿ ∩εΩαταφε, ΩαΩ ε∩≡σΣσδΦ≥ⁿ π≡α∞∞α≥ΦΩ≤, Ωε≥ε≡α ∩ετΓεδ σ≥, Γ√τ√Γα≥ⁿ ⌠≤φΩ÷Φ■ ± 1 ΦδΦ 2 ∩α≡α∞σ≥≡α∞Φ. ┬√ ∞εµσ≥σ φα∩Φ±α≥ⁿ ≡ατδΦ≈φ√σ ⌠≤φΩ÷ΦΦ, ≈≥εß√ εß≡αßα≥√Γα≥ⁿ εßα ±δ≤≈α , ΦδΦ ∩≡ε±≥ε ∩ε±√δα≥ⁿ ∩α≡α∞σ≥≡ ≡σµΦ∞α, ΩαΩ Γ√∩εδφσφε τΣσ±ⁿ, Σδ ≤ΩαταφΦ ≡σµΦ∞α, Γ Ωε≥ε≡ε∞ ⌠≤φΩ÷Φ Γ√τΓαφα. ╬ß≡α≥Φ≥σ ΓφΦ∞αφΦσ, ≈≥ε Γ ²≥ε∞ ±δ≤≈ασ φσδⁿτ Φ±∩εδⁿτεΓα≥ⁿ εΣφ≤ Φτ ∩≡σΣε∩≡σΣσδσφφ√⌡ INTFUNC π≡α∞∞α≥ΦΩ, ≥αΩ ΩαΩ Γα°α ⌠≤φΩ÷Φ ∞εµσ≥ ∩≡ΦφΦ∞α≥ⁿ ∩σ≡σ∞σφφεσ ≈Φ±δε ∩α≡α∞σ≥≡εΓ.
─≡≤πεΘ Φδδ■±≥≡Φ≡≤σ∞√Θ α±∩σΩ≥ - ΩαΩ ⌠αΩ≥Φ≈σ±ΩΦ ∩≡σΣ±≥αΓΦ≥ⁿ ∩α≡α∞σ≥≡√ ⌠≤φΩ÷ΦΦ . ┬ ßεδⁿ°Φφ±≥Γσ ±δ≤≈ασΓ ┬√ τα⌡ε≥Φ≥σ Φ±∩εδⁿτεΓα≥ⁿ ΦΣσφ≥Φ⌠ΦΩα≥ε≡ expr. ▌≥ε≥ ΦΣσφ≥Φ⌠ΦΩα≥ε≡ ετφα≈ασ≥, ≈≥ε ∩α≡α∞σ≥≡ - Γ√≡αµσφΦσ. ┬√≡αµσφΦσ ∞εµσ≥ ß√≥ⁿ δΦ≥σ≡αδⁿφεσ τφα≈σφΦσ, εß≡α∙σφΦσ Ω ⌠≤φΩ÷ΦΦ ΦδΦ Ωε∞ßΦφα÷Φ ∞φεπΦ⌡ Γ√≡αµσφΦΘ. ╤∞. parse.raw Σδ ∩εδφεπε ε∩≡σΣσδσφΦ π≡α∞∞α≥ΦΩΦ yacc Σδ Γ√≡αµσφΦΘ Σδ ßεδⁿ°σπε ΩεδΦ≈σ±≥Γα Σσ≥αδσΘ.
╟α∩Φ±ⁿ ╒²°-╥αßδΦ÷√ Γ lex.c:
{ "crypt",CRYPT,NULL },
╬ß≡α≥Φ≥σ ΓφΦ∞αφΦσ, ≈≥ε ∩ε±δσΣφΦΘ ²δσ∞σφ≥ - NULL, Γ ²≥ε∞ ±δ≤≈ασ εß≡α∙σφΦσ Ω ⌠≤φΩ÷ΦΦ εß≡αßα≥√Γασ≥± ∩≡ ∞ε Γ parse.raw. ┼±δΦ ┬√ Φ±∩εδⁿτεΓαδΦ INTFUNC π≡α∞∞α≥ΦΩ≤, ≥ε ┬√ ∩ε∞σ±≥Φ≥σ Φ∞ Γα°σΘ ⌠≤φΩ÷ΦΦ Γ∞σ±≥ε NULL. ╘αΩ≥Φ≈σ±Ωα ⌠≤φΩ÷Φ Crypt φα⌡εΣΦ≥± Γ crypt.c:
/* * If mode is non-zero, a salt is expected. * If mode is zero, a pseudo-random salt will be selected. */ void Crypt(int mode) { #if HAVE_CRYPT Stack *s; char salt[8]; char *enc; salt[0] = '\0'; if(mode) { s = Pop(); if(!s) { Error("Stack error in crypt"); return; } if(s->strval) strncpy(salt,s->strval,2); } s = Pop(); if(!s) { Error("Stack error in crypt"); return; } if(!salt[0]) { salt[0] = 'A' + (time(NULL) % 26); salt[1] = 'a' + (time(NULL) % 26); salt[2] = '\0'; } enc = (char *)crypt(s->strval,salt); #if DEBUG Debug("Crypt returned [%s]\n",enc); #endif Push(enc,STRING); #else Error("No crypt support compiled into this version"); #endif }
═αΦßεδσσ Γαµφ√Θ α±∩σΩ≥ ²≥εΘ ⌠≤φΩ÷ΦΦ - ²≥ε Γ√τεΓ s = Pop(). ╧α≡α∞σ≥≡√ Σδ ⌠≤φΩ÷ΦΦ Σεδµφ√ ß√≥ⁿ Γ√≥εδΩφ≤≥√ Φτ ±≥σΩα Γ√≡αµσφΦΘ εΣΦφ τα Σ≡≤πΦ∞. ╩επΣα ┬√ ∩Φ°Φ≥σ ⌠≤φΩ÷Φ■, Ωε≥ε≡α ∩≡ΦφΦ∞ασ≥ φσ±ΩεδⁿΩε α≡π≤∞σφ≥εΓ, φσ ταß√ΓαΘ≥σ, ≈≥ε ±≥σΩ - ²≥ε ±≥≡≤Ω≥≤≡α Σαφφ√⌡ "∩ε±δσΣφΦ∞ ∩≡Φ°σδ", "∩σ≡Γ√∞ Γ√°σδ" . ▌≥ε ετφα≈ασ≥ ²≥ε, ∩α≡α∞σ≥≡√ ß≤Σ≤≥ Γ√≥αδΩΦΓα≥ⁿ± Φτ ±≥σΩα Γ εß≡α≥φε∞ ∩ε≡ ΣΩσ. ╧ε±δσΣφΦΘ ∩α≡α∞σ≥≡ Γ√≥αδΩΦΓασ≥± ∩σ≡Γ√∞. ┬ Γ√°σ≤∩ε∞ φ≤≥ε∞ ∩≡Φ∞σ≡σ ∞√ Γ√ ±φ σ∞, Γ√τΓαφα δΦ ⌠≤φΩ÷Φ ± 2 ∩α≡α∞σ≥≡α∞Φ. ┼±δΦ Σα, ∩α≡α∞σ≥≡ Γ√≥αδΩΦΓασ≥± Φτ ±≥σΩα Φ ±ε⌡≡αφ σ≥± . ╟α≥σ∞ Φτ ±≥σΩα Γ√≥αδΩΦΓασ≥± ±δσΣ≤■∙ΦΘ ∩α≡α∞σ≥≡. Pop() ΓετΓ≡α∙ασ≥ ≤Ωατα≥σδⁿ φα ±≥≡≤Ω≥≤≡≤ Stack (s). ╤≥≡≤Ω≥≤≡α Stack ∩ε⌡εµα φα (Φτ php.h):
/* Expression Stack */ typedef struct Stack { short type; unsigned char *strval; long intval; double douval; VarTree *var; struct Stack *next; } Stack;
╥Φ∩ type ß≤Σσ≥ εΣΦφ Φτ STRING, LNUMBER ΦδΦ DNUMBER. Strval, intval Φ douval Ωε∞∩εφσφ≥√ - ±≥≡εΩΦ, integer Φ double ∩≡σΣ±≥αΓδσφΦ τφα≈σφΦ ±εε≥Γσ≥±≥Γσφφε. ┼±δΦ Γ√≡αµσφΦσ - ⌠αΩ≥Φ≈σ±ΩΦ ε∩≡σΣσδσφφα ∩σ≡σ∞σφφα , Ωε∞∩εφσφ≥α var ±εΣσ≡µΦ≥ ≤Ωατα≥σδⁿ φα ∩σ≡σ∞σφφ≤■ ±≥≡≤Ω≥≤≡≤, Ωε≥ε≡α ε∩≡σΣσδ σ≥ ²≥≤ ∩σ≡σ∞σφφ≤■.
┬ φα°σΘ ⌠≤φΩ÷ΦΦ Crypt() φα± Φφ≥σ≡σ±≤σ≥ ≥εδⁿΩε ±≥≡εΩεΓεσ τφα≈σφΦσ ∩α≡α∞σ≥≡α, ≥αΩ ≈≥ε ∞√ Φ±∩εδⁿτ≤σ∞ s->strval. ╠φεπε ⌠≤φΩ÷ΦΘ PHP/FI ∞επ≤≥ Σσδα≥ⁿ ≡ατδΦ≈φ√σ Γσ∙Φ Γ ταΓΦ±Φ∞ε±≥Φ ε≥ ≥Φ∩α ∩σ≡σ∞σφφεΘ ∩≡ε±≥ε ∩≡εΓσ≡ s->type Φ Φ±∩εδⁿτ≤ s->strval, s->intval Φ/ΦδΦ s->douval ±εε≥Γσ≥±≥Γσφφε.
╧ε±δσ Γ√τεΓα ≡σαδⁿφεΘ ⌠≤φΩ÷ΦΦ Crypt() Φ ∩εδ≤≈σφΦ °Φ⌠≡εΓαφφεΘ ±≥≡εΩΦ, φα°α ⌠≤φΩ÷ΦΦ Crypt() Γ√τ√Γασ≥ Push(enc, STRING); ∩ε∞σ∙α ΓετΓ≡α∙ασ∞εσ τφα≈σφΦσ Γ ±≥σΩ Γ√≡αµσφΦΘ. ═≤µφε ε≥∞σ≥Φ≥ⁿ, ≈≥ε ±≥σΩ Γ√≡αµσφΦΘ ε≈Φ∙ασ≥± ∩ε±δσ ΩαµΣεΘ ±≥≡εΩΦ PHP/FI, ≥αΩ ≈≥ε, σ±δΦ ┬√ ∩ε∞σ∙ασ≥σ Γ√≡αµσφΦ Γ ±≥σΩ, Ωε≥ε≡√σ φΦΩεπΣα φσ Γ√≥αδΩΦΓα■≥± ≈σ∞-δΦßε, ²≥ε φσ ß≤Σσ≥ Φ∞σ≥ⁿ τφα≈σφΦ .
┬√τεΓ Debug() Γ ∩≡Φ∞σ≡σ Crypt() ∩εΩατ√Γασ≥, ΩαΩ ΣεßαΓΦ≥ⁿ Γ√ΓεΣ ε≥δαΣε≈φεΘ Φφ⌠ε≡∞α÷ΦΦ Ω Γα°σΘ ⌠≤φΩ÷ΦΦ. Debug() - ²≥ε ⌠≤φΩ÷Φ ± ∩σ≡σ∞σφφ√∞ ±∩Φ±Ωε∞ ∩α≡α∞σ≥≡εΓ, ≥ε≈φε ≥αΩ µσ ΩαΩ printf.
[═αταΣ] [╤εΣσ≡µαφΦσ] [┬∩σ≡σΣ]