Jan 20

一个简单的url rewrite规则 不指定

felix021 @ 2010-1-20 00:35 [IT » 网络] 评论(0) , 引用(0) , 阅读(2762) | Via 本站原创
折腾了好久才弄出来,sigh,不熟这东西
引用
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} /(index\.php)?
RewriteRule ^.*$ - [L]

RewriteCond %{HTTP_HOST} 19880711\.com
RewriteRule ^(.*)$ http://www.felix021.com/$1 [QSA,L]
Jan 7

apache, mod_cgi 不指定

felix021 @ 2010-1-7 20:40 [IT » 网络] 评论(1) , 引用(0) , 阅读(4949) | Via 本站原创
编译apache的时候默认应该是有mod_cgi的,如果不确定,可以加上--enable_cgi。

在httpd.conf里面增加(或修改,因为可能已经有这个东西了):
引用
ScriptAlias /cgi-bin/ /某路径/cgi-bin/
如果你修改了“某路径”,那么后面对应的Directory一节也应该对应修改
引用
<Directory "/某路径/cgi-bin">                                                  
    AllowOverride None
    Options FollowSymLinks #如果不放心,这里还可以加上一个ExecCgi选项。
    Order allow,deny
    Allow from all
</Directory>

下面是一个简单的C编写的cgi程序,gcc -o printall simple_cgi.c,把printall放在cgi-bin目录下面。然后访问:http://localhost/cgi-bin/printall,可以看到输出。特别注意一下,cgi不仅要打HTTP实体,还要打HTTP头信息。如果你实在懒得写,在实体前面加上一个回车就行了:) 否则你会看到apache的error_log里输出诸如"malformed header from script. Bad header="这样的错误信息。
#include <stdio.h>
#include <stdlib.h>

extern char ** environ;

int main ()
{
    int i;
    puts("Content-Type: text/plain\n\n");
    for (i = 0; environ[i] != NULL; i++) {
        printf ("%s\n", environ[i]);
    }

    if (strncmp("POST", getenv("REQUEST_METHOD"), 4) == 0) {
        char buf[1025];
        while (1) {
            fgets(buf, 1024, stdin);
            printf( "%s", buf);
            if (feof(stdin)) {
                break;
            }
        }
    }
    return 0;
}

特别点出一下,GET请求的query_string是在environ["QUERY_STRING"]里面,而POST请求的输入,是从stdin中读取。
Nov 22

CSRF和bo-blog2.1.1 不指定

felix021 @ 2009-11-22 02:24 [IT » 网络] 评论(0) , 引用(0) , 阅读(3064) | Via 本站原创
在EB的Hi群里大家聊到了CSRF攻击的问题。

关于CSRF攻击,网上资料很多,简单说几句:现在很多网站对提交的请求不检查来源,攻击者可以简单地构造一个页面,页面包含一个大小为0x0的iframe,内含一个修改管理员密码或者创建新特权用户或为现有用户提升权限的表单,当页面载入的时候由javascript控制该表单post到abc.com的某个页面。然后攻击者将此url发送给abc.com的管理员,引诱其点击,如果管理员此时已经登录,就会在管理员不知情的情况下获得权限。具体的原理,如果不很了解,建议先学习一下HTTP协议,重点是GET/POST,Cookie/Sessoin,Referer。解决的办法比如限制referer,或者增加页面校验码等。

看了一下这个Bo-blog(2.1.0),居然没有这个检查。。。囧。想起2.1.1,这个版本推出挺久了,因为2.1.0有些BUG折磨了我挺久(最近解决了一个,下载的问题,还有一个是rss在google reader总是少一篇),于是就去下了新版本在本地搭起来。看了一下,发现没有什么大的改动,对CSRF的攻击也完全不设防。而且由于现在这个版本我自己改了好多地方,比如根据IP直接显示地址,以及评论留言的邮件通知等,如果升级了还得重新改,太麻烦,所以完全没有升级的动力。到Bo-blog的bbs去提了个BUG报告。Bo-Blog的更新实在太少。。

@1:00 p.s. 已经修改,增加了检查POST时的Referer,GET就不检查了,这个。。真不能检查。。验证码就先不做了,每个页面都要去加,真不爽。这时候觉得bo-blog统一入口的原则真好,改动只有一个地方,加了几行就OK~
Oct 20
写了一段代码实现在页面上直接统计成绩的功能。
打开Firefox(注意,不支持IE6,原因是IE6的浏览器URL只支持到435个字符的js代码,IE8支持到2083,但是懒得测试了)
登录 http://202.114.74.198 OR http://202.114.74.199
点击:成绩与重修查询 -> 多科查询
或者直接打开 http://202.114.74.199/stu/query_score.jsp
然后将下列代码全部copy到页面的地址栏,回车,看到结果。

p.s. 默认情况下是先讲成绩分别以“先课程类型升序 再成绩降序”排序。可自行修改。
压缩版:
javascript:var trs=new Array();trs=getData();sorttrs(10,1);sorttrs(9,0);display(trs);function sorttrs(col,di){var i,j,t;for(i=0;i<trs.length-1;++i){for(j=1;j<trs.length-i-1;++j){if(di==0){if(trs[j][col] > trs[j+1][col]){t=trs[j];trs[j]=trs[j+1];trs[j+1]=t;}}else{if(trs[j][col]<trs[j+1][col]){t=trs[j];trs[j]=trs[j+1];trs[j+1]=t;}}}}}function display(){var gb=0,gx=0,zb=0,zx=0;var gbx=0,gxx=0,zbx=0,zxx=0;for(var i=1;i<trs.length;++i){var a=trs[i][8]*trs[i][10];var b=new Number(trs[i][8]);switch(trs[i][9]){case '公共必修':gb+=a;gbx+=b;break;case '公共选修':gx+=a;gxx+=b;break;case '专业必修':zb+=a;zbx+=b;break;case '专业选修':zx+=a;zxx+=b;break;}}document.writeln("公共必修: "+gb+"/"+gbx+"="+(gb/gbx)+"<br/>");document.writeln("公共选修: "+gx+"/"+gxx+"="+(gx/gxx)+"<br/>");document.writeln("专业必修: "+zb+"/"+zbx+"="+(zb/zbx)+"<br/>");document.writeln("专业选修: "+zx+"/"+zxx+"="+(zx/zxx)+"<br/>");document.writeln("总学分: "+(gbx+gxx+zbx+zxx));document.writeln("<table border=\"1\">");for(var i=0;i<trs.length;++i){document.writeln("<tr>");for(var j=0;j<trs[i].length;++j){var td=trs[i][j];if(i==0){td='<b>'+td+'</b>';}document.writeln("<td>"+td+"</td>");}document.writeln("</tr>");}}function getData(){function countTDChilds(tr){var trc=tr.childNodes;var count=0;for(var i=0;i<trc.length;++i){if(trc[i].tagName=="TD")count++;}return count;}function getTDChilds(tr){var trc=tr.childNodes;var tds=new Array();for(var i=0;i<trc.length;++i){if(trc[i].tagName=="TD")tds.push(trc[i].innerHTML);}return tds;}var isIE=document.all?true:false;var frames=document.getElementsByTagName("iframe");var doc=null;for(var i=0;i<frames.length;++i){if(frames[i].name=="mainIFR"){if(isIE){doc=frames[i].document;}else{doc=frames[i].contentWindow.document;}break;}}if(doc==null)doc=document;var tbl=doc.getElementsByTagName("table")[0];var tb=null;for(var i=0;i<tbl.childNodes.length;++i){var tb=tbl.childNodes[i];if(tb.tagName=='tbody')break;}var trs=new Array();for(var i=0;i<tb.childNodes.length;++i){var obj=tb.childNodes[i];if(obj.tagName=='TR'){if(countTDChilds(obj)==11){trs.push(getTDChilds(obj));}}}return trs;}

非压缩版:
javascript:

var trs = new Array();

trs = getData();
sorttrs(10, 1); /* 成绩,降序 0升序,1降序 */
sorttrs(9, 0); /* 课程类型,升序 */
display();

function sorttrs(col, di){
    var i, j, t;
    for(i = 0; i < trs.length - 1; ++i){
        for(j = 1; j < trs.length - i - 1; ++j){
            if(di == 0){
                if(trs[j][col] > trs[j+1][col]) {
                    t = trs[j];
                    trs[j] = trs[j+1];
                    trs[j+1] = t;
                }
            } else {
                if(trs[j][col] < trs[j+1][col]) {
                    t = trs[j];
                    trs[j] = trs[j+1];
                    trs[j+1] = t;
                }
            }
        }
    }
}
function display(){
    var gb = 0, gx = 0, zb = 0, zx = 0; /*g=公共 z=专业 b=必修 z=选修*/
    var gbx = 0, gxx = 0, zbx = 0, zxx = 0; /*公共必修学分*/
    for(var i = 1; i < trs.length; ++i){
        var a = trs[i][8] * trs[i][10];
        var b = new Number(trs[i][8]);
        switch(trs[i][9]) {
            case '公共必修': gb += a; gbx += b; break;
            case '公共选修': gx += a; gxx += b; break;
            case '专业必修': zb += a; zbx += b; break;
            case '专业选修': zx += a; zxx += b; break;
        }
    }
    document.writeln("<html>\n<head>\n  <title>成绩<\/title>\n<\/head>\n<body>");
    document.writeln("公共必修: " + gb + " / " + gbx + " = " + (gb/gbx) + "<br/>");
    document.writeln("公共选修: " + gx + " / " + gxx + " = " + (gx/gxx) + "<br/>");
    document.writeln("专业必修: " + zb + " / " + zbx + " = " + (zb/zbx) + "<br/>");
    document.writeln("专业选修: " + zx + " / " + zxx + " = " + (zx/zxx) + "<br/>");
    document.writeln("总学分: " + (gbx + gxx + zbx + zxx));
    document.writeln("<table border=\"1\">");
    for(var i = 0; i < trs.length; ++i){
        document.writeln("  <tr>");
        for(var j = 0; j < trs[i].length; ++j){
            var td = trs[i][j];
            if(i == 0){
                td = '<b>' + td + '</b>';
            }
            document.writeln("    <td>" + td + "</td>");
        }
        document.writeln("  </tr>");
    }
    document.writeln('</body>\n</html>');
}

function getData(){
    function countTDChilds(tr){
        var trc = tr.childNodes;
        var count = 0;
        for(var i = 0; i < trc.length; ++i) {
            if(trc[i].tagName == "TD") count++;
        }
        return count;
    }
    function getTDChilds(tr){
        var trc = tr.childNodes;
        var tds = new Array();
        for(var i = 0; i < trc.length; ++i){
            if(trc[i].tagName == "TD") tds.push(trc[i].innerHTML);
        }
        return tds;
    }
    var isIE = document.all?true:false;
    var frames = document.getElementsByTagName("iframe");
    var doc = null;
    for(var i = 0; i < frames.length; ++i){
        if (frames[i].name == "mainIFR"){
            if(isIE){
                doc=frames[i].document;
            }else{
                doc = frames[i].contentWindow.document;
            }
            break;
        }
    }
    if(doc == null) doc = document;
    var tbl = doc.getElementsByTagName("table")[0];
    var tb = null;
    for(var i = 0; i < tbl.childNodes.length; ++i){
        var tb = tbl.childNodes[i];
        if(tb.tagName == 'tbody') break;
    }
    var trs = new Array();
    for(var i = 0; i < tb.childNodes.length; ++i){
        var obj = tb.childNodes[i];
        if(obj.tagName == 'TR'){
            if(countTDChilds(obj) == 11){
                trs.push(getTDChilds(obj));
            }
        }
    }
    return trs;
}
Oct 18

收藏一段javascriot 不指定

felix021 @ 2009-10-18 13:20 [IT » 网络] 评论(1) , 引用(0) , 阅读(3811) | Via 本站原创
// modified from http://acm.scs.bupt.cn/hefei/hefei.js

String.prototype.trim= function(){  
    // 用正则表达式将前后空格  
    // 用空字符串替代。  
    return this.replace(/(^\s*)|(\s*$)/g, "");  
}

/**
* enables highlight  rows in data tables
*/
function table_Init(container) {
    // for every table row ...
try{
    var rows = container.rows;
    for ( var i = 0; i < rows.length; i++ ) {
        for (var j = 0 ; j < rows[i].cells.length ; ++j) {
            rows[i].cells[j].className = 'nowrap';
            if (j > 3) {
                
                try {
                    var text = rows[i].cells[j].innerHTML;
                    
                    var AC = new RegExp("^\\d+/\\d+$");
                    var TRY = new RegExp("^\\d+/--$");
                    var NOTTRY = new RegExp("^0/--$");
                    if (NOTTRY.test(text)){
                        //rows[i].cells[j].className += ' notry';
                    }
                    else if (TRY.test(text)){
                        rows[i].cells[j].className += ' try';
                    }
                    else if (AC.test(text)){
                        rows[i].cells[j].className += ' ac';
                    }
                }
                catch (err) {
                }
            }
        }
                
        
        // ... with the class 'odd' or 'even' ...
        if (i % 2 == 1) {
            rows[i].className = 'odd';
        }
        else {
            rows[i].className = 'even';
        }

        // ... add event listeners ...
        // ... to highlight the row on mouseover ...
        //if ( navigator.appName == 'Microsoft Internet Explorer' ) {
        // but only for IE, other browsers are handled by :hover in css
        rows[i].onmouseover = function() {
            this.className += ' hover';
        }
        rows[i].onmouseout = function() {
            this.className = this.className.replace( ' hover', '' );
        }
       // }
    }
}
catch (err){
    alert(err.description);
}
}
Jun 2

myftp跨平台版 不指定

felix021 @ 2009-6-2 16:52 [IT » 网络] 评论(0) , 引用(0) , 阅读(3323) | Via 本站原创
之前写了一篇 myftp: 一个linux下简单的ftp客户端实现
里面详细介绍了ftp协议的基本工作过程。

为了明天晚上的Windows下的程序,于是把它移植到了Win32下面。
然后异常庆幸我当时做了多么明智的封装啊,只要稍稍改几行就可以在windows下面编译了 :D

这个压缩包在Windows和Linux下面都可以直接make编译了哈^_^
不过这次的修改只是增加跨平台编译,没有修正myftp的BUG,仅供参考 :D

下载文件 (已下载 742 次)
May 25

用gcc/g++编译winsock程序 不指定

felix021 @ 2009-5-25 02:12 [IT » 网络] 评论(5) , 引用(0) , 阅读(8040) | Via 本站原创
开始学习winsock(应付网络程序设计的大作业)
在网上搜"winsock 入门",然后都是一堆很ooxx的东西,反正你看了就是不知道怎么写程序就是了。

试着写下一些代码,却发现出现一堆类似
引用
undefined reference to `socket@12'
undefined reference to `htons@4'
这样的错误。

Google了一下,众说纷纭啊,有说extern "C"的,有说少lib路径的
最后在CSDN的论坛上发现有个人遇到这个问题,贴了个程序,后面别人给的建议有效了:
#include<iostream>
#include<windows.h>
#include<winsock.h>
using namespace std;

int main()   {
    WSADATA wsaData;
    WSAStartup(MAKEWORD(1,1),&wsaData);
    cout<<"hello"<<endl;
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    sockaddr_in host;
    int port = htons(8080);
}

编译:
C:\code\> g++ a.cpp -lwsock32
加上libwsock32的库即可。。。汗。
May 16

免费给Felix发短信 不指定

felix021 @ 2009-5-16 16:51 [IT » 网络] 评论(4) , 引用(0) , 阅读(4719) | Via 本站原创
把手头另外一个移动的号码开通了fetion
然后加上昨天发现的那个php的fetion处理了一下
现在大家可以在线免费给我发短信拉!

想自己架设一个?下载这个东西去玩儿吧:
下载文件 (已下载 843 次)
分页: 6/26 第一页 上页 1 2 3 4 5 6 7 8 9 10 下页 最后页 [ 显示模式: 摘要 | 列表 ]