{"id":305,"date":"2008-01-05T15:38:00","date_gmt":"2008-01-05T15:38:00","guid":{"rendered":"http:\/\/marvelliu.wordpress.com\/2008\/01\/05\/kbs%e7%b3%bb%e7%bb%9fphplib%e5%bc%80%e5%8f%91%e7%ae%80%e4%bb%8b"},"modified":"2008-01-05T15:38:00","modified_gmt":"2008-01-05T15:38:00","slug":"kbs%e7%b3%bb%e7%bb%9fphplib%e5%bc%80%e5%8f%91%e7%ae%80%e4%bb%8b","status":"publish","type":"post","link":"https:\/\/marvelliu.space\/?p=305","title":{"rendered":"kbs\u7cfb\u7edfphplib\u5f00\u53d1\u7b80\u4ecb"},"content":{"rendered":"<p>\u5199\u8fd9\u7bc7\u6587\u7ae0\u7684\u539f\u56e0\u662f\u5411lilac dev\u7ec4\u4ecb\u7ecd\u4e00\u4e0b\u5982\u4f55\u5165\u95e8 lilac bbs web \u7684\u5f00\u53d1\uff0c\u7531\u4e8elilac bbs \u662f\u57fa\u4e8ekbs\u7cfb\u7edf\u7684\uff0c\u6240\u4ee5\u6211\u4e3b\u8981\u8bb2\u7684\u4e5f\u662f\u57fa\u4e8ekbs\u7cfb\u7edf\u7684web\u5f00\u53d1\u3002<\/p>\n<p>kbs\u7cfb\u7edf\u7684web\u4e3b\u8981\u5206\u4e3a\u4e09\u4e2a\u90e8\u5206\uff1aphp\u9875\u9762\u5f00\u53d1\uff0cphp\u6269\u5c55\u548c\u5e95\u5c42\u7684c\u8bed\u8a00\u51fd\u6570\u5e93\u3002<\/p>\n<p>php\u9875\u9762\u5f00\u53d1\u4e3b\u8981\u6d89\u53ca\u7684\u5c31\u662f\u6211\u4eec\u5e38\u7528\u7684php\u5e38\u89c4\u5f00\u53d1\uff0c\u5176\u5b9e\u5c31\u662f\u4e00\u4e2aphp\u7684\u89e3\u91ca\u5668\u89e3\u91ca\u8fd0\u884cphp\u9875\u9762\uff0c\u518d\u52a0\u4e0acss\u3001js\u548chtml\u90a3\u4e9b\u4e1c\u897f\u3002<\/p>\n<p>php\u6269\u5c55\u662f\u4f7f\u7528zend\u7684\u7279\u6027\uff0c\u5b83\u53ef\u4ee5\u5c06c\u8bed\u8a00\u7f16\u5199\u7684\u4ee3\u7801\u7f16\u8bd1\u6210\u4e8c\u8fdb\u5236\u6587\u4ef6\uff0c\u7136\u540e\u5c06\u8fd9\u4e2a\u4e8c\u8fdb\u5236\u6587\u4ef6\u52a0\u8f7d\u4e3a\u4e00\u4e2aphp\u7684\u5e93\u6587\u4ef6(.so\u683c\u5f0f)\uff0c\u7531apache\u542f\u52a8\u7684\u65f6\u5019\u68c0\u67e5\u6ce8\u518c\uff0c\u7136\u540e\u5728\u4e0a\u5c42\u7684php\u9875\u9762\u4e2d\u88ab\u52a8\u6001\u8f7d\u5165\u3001\u8c03\u7528\u548c\u91ca\u653e\u3002<\/p>\n<p>\u81f3\u4e8e\u5e95\u5c42\u7684C\u8bed\u8a00\u51fd\u6570\u5e93\uff0c\u5176\u5b9e\u5c31\u662f\u7528C\u8bed\u8a00\u5199\u7684\u51fd\u6570\u7684\u96c6\u5408\uff0c\u53ef\u4ee5\u4f9bphp\u6269\u5c55\u4e2d\u7684C\u8bed\u8a00\u4ee3\u7801\u8c03\u7528\u7684\u3002\u4ec5\u6b64\u800c\u5df2\u3002<\/p>\n<p>\u6211\u6253\u7b97\u7528\u81ea\u5e95\u5411\u4e0a\u7684\u65b9\u6cd5\u8bb2\uff0c\u5c31\u4e3e\u4e00\u4e2a\u6700\u7b80\u5355\u7684\u5b9e\u4f8b\u5427\uff1a\u7528\u6237\u767b\u5f55\u3002<\/p>\n<p>\u9996\u5148\uff0c\u6211\u4eec\u5148\u770b\u4e00\u4e2a\u7528C\u8bed\u8a00\u7f16\u5199\u7684\u9a8c\u8bc1\u7528\u6237\u4fe1\u606f\u7684\u51fd\u6570checkpasswd2\uff0c\u8fd9\u4e2a\u51fd\u6570\u5728libBBS\/pass.c\u4e2d\uff1a<br \/><code><br \/> 71 int checkpasswd2(const char *passwd, const struct userec *user)<br \/> 72 {<br \/> 73 #ifdef CONV_PASS<br \/> 74     if (user-&gt;passwd[0]) {<br \/> 75         return checkpasswd(user-&gt;passwd, passwd);<br \/> 76     } else<br \/> 77 #endif<br \/> 78     {<br \/> 79         unsigned char md5passwd[MD5_DIGEST_LENGTH];<br \/> 80<br \/> 81         igenpass(passwd, user-&gt;userid, md5passwd);<br \/> 82 \/*<br \/> 83         if (memcmp(md5passwd,user-&gt;md5passwd,MD5_DIGEST_LENGTH)) {<br \/> 84             unsigned char w_md5passwd[MD5_DIGEST_LENGTH];<br \/> 85             w_igenpass(passwd,user-&gt;userid,w_md5passwd);<br \/> 86             if (memcmp(w_md5passwd,user-&gt;md5passwd,MD5_DIGEST_LENGTH)) return 0;<br \/> 87             memcpy(user-&gt;md5passwd,md5passwd,MD5_DIGEST_LENGTH);<br \/> 88             bbslog(\"5system\",\"Convert %s password.\",user-&gt;userid);<br \/> 89         }<br \/> 90     return 1;<br \/> 91 *\/<br \/> 92         return !(memcmp(md5passwd, user-&gt;md5passwd, MD5_DIGEST_LENGTH));<br \/> 93     }<br \/> 94 }<br \/><\/code><br \/>\u770b\u8d77\u6765\u5e94\u8be5\u5f88\u7b80\u5355\uff0c\u6bd4\u8f83\u660e\u4e86\u3002\u8fd9\u5c31\u662f\u4e00\u4e2a\u6700\u57fa\u672c\u7684kbs\u51fd\u6570\uff0c\u51e0\u4e4e\u6ca1\u6709\u4ec0\u4e48\u4f9d\u8d56\u9879\u3002\u8fd9\u4e2a\u51fd\u6570\u53ef\u4ee5\u88abssh\u3001telnet\u548cwww\u8fd9\u4e9b\u4e0a\u5c42\u7684\u5e94\u7528\u8c03\u7528\uff0c\u4f46\u662f\u5e95\u5c42\u5c31\u662f\u8fd9\u4e00\u4e2a\u51fd\u6570\u3002<\/p>\n<p>\u505a\u5b8c\u9a8c\u8bc1\u51fd\u6570\u4e4b\u540e\uff0c\u6211\u4eec\u9700\u8981\u7f16\u5199\u4e00\u4e2aphp\u6269\u5c55\u3002\u8981\u4f7fphp\u9875\u9762\u80fd\u591f\u7528\u5230\u8fd9\u4e2acheckpasswd2\u51fd\u6570\uff0c\u90a3\u4e48\u6211\u4eec\u9700\u8981\u6709\u4e00\u4e2aphp\u6269\u5c55\uff0c\u5176\u4e2d\u6709\u4e00\u4e2a\u51fd\u6570bbs_checkpasswd\uff0c\u8fd9\u4e2a\u51fd\u6570\u5176\u5b9e\u662f\u4e00\u4e2a\u9002\u914d\u5668\uff0c\u8fde\u63a5php\u9875\u9762\u7684\u8c03\u7528\u548ccheckpasswd2\u51fd\u6570\u3002\u8fd9\u4e2a\u51fd\u6570\u5728bbs2www\/phplib\/phpbbs.user.c\uff1a<br \/><code><br \/>PHP_FUNCTION(bbs_checkpasswd)<br \/>114 {<br \/>115     char *s;<br \/>116     int s_len;<br \/>117     char *pw;<br \/>118     int pw_len;<br \/>119     long ret;<br \/>120     int unum = 0;<br \/>121     long ismd5 = 0;<br \/>122     struct userec *user;<br \/>123     int ac = ZEND_NUM_ARGS();<br \/>124<br \/>125     if (ac != 2 || zend_parse_parameters(2 TSRMLS_CC, \"ss\", &amp;s, &amp;s_len, &amp;pw, &amp;pw_len) != SUCCESS) {<br \/>126         if (ac!= 3 || zend_parse_parameters(3 TSRMLS_CC, \"ssl\", &amp;s, &amp;s_len, &amp;pw, &amp;pw_len, &amp;ismd5) != SUCCESS) {<br \/>127             WRONG_PARAM_COUNT;<br \/>128         }<br \/>129     }<br \/>130     if (s_len &gt; IDLEN)<br \/>131         s[IDLEN] = 0;<br \/>132     if (pw_len &gt; PASSLEN)<br \/>133         pw[PASSLEN] = 0;<br \/>134     if (pw[0] == '')<br \/>135         ret = 1;<br \/>136     else if ((s[0] != 0) &amp;&amp; !(unum = getuser(s, &amp;user)))<br \/>137         ret = 2;<br \/>138     else {<br \/>139         if (s[0] == 0)<br \/>140             user = getCurrentUser();<br \/>141         if (user) {<br \/>142             if (ismd5) {<br \/>143                 ismd5 = !(memcmp(pw, user-&gt;md5passwd, MD5PASSLEN));<br \/>144             } else {<br \/>145                 ismd5 = checkpasswd2(pw, user);<br \/>146             }<br \/>147             if (ismd5) {<br \/>148                 ret = 0;<br \/>149                 if (s[0] != 0)<br \/>150                     setcurrentuser(user, unum);<br \/>151             } else {<br \/>152                 ret = 1;<br \/>153                 logattempt(user-&gt;userid, getSession()-&gt;fromhost, \"www\");<br \/>154             }<br \/>155         } else {<br \/>156             ret = 1;<br \/>157         }<br \/>158     }<br \/>159     RETURN_LONG(ret);<br \/>160 }<br \/><\/code><\/p>\n<p>\u53ef\u4ee5\u770b\u51fa\uff0c\u8fd9\u4e2a\u51fd\u6570\u4e0ephp\u5bc6\u5207\u76f8\u5173\uff0cphp zend\u4f1a\u89e3\u6790\u4e0a\u5c42php\u9875\u9762\u8c03\u7528\u53d8\u91cf\uff0c\u7136\u540e\u5904\u7406\u8fd9\u4e9b\u53d8\u91cf\uff0c\u800c\u6211\u4eec\u8981\u505a\u7684\uff0c\u5c31\u662f\u68c0\u67e5\u8fd9\u4e9b\u53d8\u91cf\u7684\u5408\u6cd5\u6027\uff0c\u7136\u540e\u5c06\u5176\u4f20\u5230checkpasswd2\u5373\u53ef\u3002<\/p>\n<p>\u7528\u6237\u767b\u9646\u7684\u65f6\u5019\uff0c\u9996\u5148\u4f1a\u4f7f\u7528js\u68c0\u67e5\u8f93\u5165\u4fe1\u606f\u5408\u6cd5\u6027\uff0c\u7136\u540e\u8f6c\u5230bbslogin.php\u8fd9\u4e2a\u9875\u9762\u3002\u6211\u4eec\u53ef\u4ee5\u53d1\u73b0\u6709\u8fd9\u4e48\u4e00\u53e5\uff1a<br \/><code><br \/>2 require(\"www2-funcs.php\");<br \/><\/code><br \/>\u4e5f\u5c31\u662f\u8bf4\u8fd9\u4e2a\u9875\u9762\u9700\u8981\u52a0\u8f7dwww2-funcs.php\uff0c\u90a3\u4e48\u6211\u4eec\u518d\u770b\u770bwww2-funcs.php\uff0c\u53d1\u73b0<\/p>\n<p><code><br \/> 11 if (BUILD_PHP_EXTENSION==0)<br \/> 12     @dl(\"$topdir\/..\/libexec\/bbs\/libphpbbslib.so\");<br \/><\/code><br \/>\u5176\u5b9e\u5c31\u662f\u8fd9\u53e5\u8bdd\uff0cphp\u4f7f\u7528\u4e86dl\u8c03\u7528\u4e86\u6211\u4eec\u7f16\u5199\u7684php\u6269\u5c55libphpbbslib.so\uff0c\u8fd9\u4e2a\u7c7b\u4f3c\u4e8eC#\u4e2d\u7684dllimport\u8c03\u7528COM\u4e00\u6837\u3002<\/p>\n<p>\u597d\uff0c\u6211\u4eec\u56de\u5230bbslogin.php\uff0c\u52a0\u8f7d\u4e4b\u540e\uff0c\u5373\u53ef\u4f7f\u7528libphpbbslib.so\u7684\u51fd\u6570\u4e86\u3002<br \/><code><br \/> 24 if (($id!=\"guest\")&amp;&amp;bbs_checkpasswd($id,$passwd)!=0) error_alert(\"\u7528\u6237\u5bc6\u7801\u9519\u8bef\uff0c\u8bf7\u91cd\u65b0\u767b\u5f55\uff01\");<br \/><\/code><\/p>\n<p>OK\uff0c\u5c31\u662f\u8fd9\u6837\u7684\uff0cphp\u9875\u9762\u8c03\u7528bbs_checkpasswd\uff0c\u7136\u540e\u5f97\u5230\u8fd4\u56de\u503c\uff0c\u5c31\u53ef\u4ee5\u5224\u65ad\u7528\u6237\u5bc6\u7801\u4e86\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u5199\u8fd9\u7bc7\u6587\u7ae0\u7684\u539f\u56e0\u662f\u5411lilac dev\u7ec4\u4ecb\u7ecd\u4e00\u4e0b\u5982\u4f55\u5165\u95e8 lilac bbs web \u7684\u5f00\u53d1\uff0c\u7531\u4e8elilac bbs \u662f\u57fa\u4e8ekbs\u7cfb\u7edf\u7684\uff0c\u6240\u4ee5\u6211\u4e3b\u8981\u8bb2\u7684\u4e5f\u662f\u57fa\u4e8ekbs\u7cfb\u7edf\u7684web\u5f00\u53d1\u3002 kbs\u7cfb\u7edf\u7684web\u4e3b\u8981\u5206\u4e3a\u4e09\u4e2a\u90e8\u5206\uff1aphp\u9875\u9762\u5f00\u53d1\uff0cphp\u6269\u5c55\u548c\u5e95\u5c42\u7684c\u8bed\u8a00\u51fd\u6570\u5e93\u3002 php\u9875\u9762\u5f00\u53d1\u4e3b\u8981\u6d89\u53ca\u7684\u5c31\u662f\u6211\u4eec\u5e38\u7528\u7684php\u5e38\u89c4\u5f00\u53d1\uff0c\u5176\u5b9e\u5c31\u662f\u4e00\u4e2aphp\u7684\u89e3\u91ca\u5668\u89e3\u91ca\u8fd0\u884cphp\u9875\u9762\uff0c\u518d\u52a0\u4e0acss\u3001js\u548chtml\u90a3\u4e9b\u4e1c\u897f\u3002 php\u6269\u5c55\u662f\u4f7f\u7528zend\u7684\u7279\u6027\uff0c\u5b83\u53ef\u4ee5\u5c06c\u8bed\u8a00\u7f16\u5199\u7684\u4ee3\u7801\u7f16\u8bd1\u6210\u4e8c\u8fdb\u5236\u6587\u4ef6\uff0c\u7136\u540e\u5c06\u8fd9\u4e2a\u4e8c\u8fdb\u5236\u6587\u4ef6\u52a0\u8f7d\u4e3a\u4e00\u4e2aphp\u7684\u5e93\u6587\u4ef6(.so\u683c\u5f0f)\uff0c\u7531apache\u542f\u52a8\u7684\u65f6\u5019\u68c0\u67e5\u6ce8\u518c\uff0c\u7136\u540e\u5728\u4e0a\u5c42\u7684php\u9875\u9762\u4e2d\u88ab\u52a8\u6001\u8f7d\u5165\u3001\u8c03\u7528\u548c\u91ca\u653e\u3002 \u81f3\u4e8e\u5e95\u5c42\u7684C\u8bed\u8a00\u51fd\u6570\u5e93\uff0c\u5176\u5b9e\u5c31\u662f\u7528C\u8bed\u8a00\u5199\u7684\u51fd\u6570\u7684\u96c6\u5408\uff0c\u53ef\u4ee5\u4f9bphp\u6269\u5c55\u4e2d\u7684C\u8bed\u8a00\u4ee3\u7801\u8c03\u7528\u7684\u3002\u4ec5\u6b64\u800c\u5df2\u3002 \u6211\u6253\u7b97\u7528\u81ea\u5e95\u5411\u4e0a\u7684\u65b9\u6cd5\u8bb2\uff0c\u5c31\u4e3e\u4e00\u4e2a\u6700\u7b80\u5355\u7684\u5b9e\u4f8b\u5427\uff1a\u7528\u6237\u767b\u5f55\u3002 \u9996\u5148\uff0c\u6211\u4eec\u5148\u770b\u4e00\u4e2a\u7528C\u8bed\u8a00\u7f16\u5199\u7684\u9a8c\u8bc1\u7528\u6237\u4fe1\u606f\u7684\u51fd\u6570checkpasswd2\uff0c\u8fd9\u4e2a\u51fd\u6570\u5728libBBS\/pass.c\u4e2d\uff1a 71 int checkpasswd2(const char *passwd, const struct userec *user) 72 { 73 #ifdef CONV_PASS 74 if (user-&gt;passwd[0]) { 75 return checkpasswd(user-&gt;passwd, passwd); 76 } else 77 #endif 78 { 79 unsigned char md5passwd[MD5_DIGEST_LENGTH]; 80 81 igenpass(passwd, user-&gt;userid, md5passwd); 82 \/* 83 &hellip; <a href=\"https:\/\/marvelliu.space\/?p=305\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;kbs\u7cfb\u7edfphplib\u5f00\u53d1\u7b80\u4ecb&#8221;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[11],"tags":[],"class_list":["post-305","post","type-post","status-publish","format-standard","hentry","category-lilacbbs"],"_links":{"self":[{"href":"https:\/\/marvelliu.space\/index.php?rest_route=\/wp\/v2\/posts\/305","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/marvelliu.space\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/marvelliu.space\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/marvelliu.space\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/marvelliu.space\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=305"}],"version-history":[{"count":0,"href":"https:\/\/marvelliu.space\/index.php?rest_route=\/wp\/v2\/posts\/305\/revisions"}],"wp:attachment":[{"href":"https:\/\/marvelliu.space\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=305"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/marvelliu.space\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=305"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/marvelliu.space\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=305"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}