www.findicons.com

垂直搜索的网站,专注做icon的搜索,虽然现在量不是很大(28w,据说),但至少对我来说还是很有用的,比如写PPT时想找个图标,Google Image出来的结果要找到满意的实在太难了,而至少www.findicons.com出来的结果比较靠谱点,虽然经常会搜不到;-(

看起来它应该不是像Google Image那样通过爬虫找图片附近的关键字来确定图片的归属的,当然我猜应该也不是根据图片内容自动AI出来的,莫非是人肉?还是草根?这个要想足够scale还是有难度的啊。

希望这个网站能做得更强大,这样对于偶们这些莫啥艺术细胞的TX们做作业就好办多了~~~

本文网址:http://zoufeiblog.appspot.com/2010/05/5/FindIcons.html

Posted in Uncategorized

Fiddler:Web Debuging Proxy

 

Technorati 标签: ,

 

发现一个不错的软件:Fiddler

What is Fiddler?

Fiddler is a Web Debugging Proxy which logs all HTTP(S) traffic between your computer and the Internet. Fiddler allows you to inspect allHTTP(S) traffic, set breakpoints, and "fiddle" with incoming or outgoing data. Fiddler includes a powerful event-based scripting subsystem, and can be extended using any .NET language.

Fiddler is freeware and can debug traffic from virtually any application, including Internet Explorer, Mozilla Firefox, Opera, and thousands more.

简单说,Fiddler就是HTTP proxy,通过把browser的proxy指向Fiddler,Fiddler可以对HTTP/HTTPS traffic进行monitor/debug/hack HTTP request和response。

首先最让我心动的是它可以很完美的做man-in-the-middle的HTTPS inspect,关键还是free的哦,虽然HttpWatch之流也能很好地做这种工作,但掏钱买这种tool对于我来说还不是一个option~~~

有了这个,最直接的用途是做协议分析啦,比如要去看看Google wave/gmail等HTTPS的应用协议和交互过程~~~

其次,除了常规的查看HTTP(s) request/response细节、修改request/response等功能外,Fiddler有意思的地方还在于:它是一个可扩展的框架:

  • 首先它支持script扩展,可以通过JScript.NET定义customized rule,比如我们可以把所有具有特殊header的HTTP request自动dump到文件中
  • 复杂一点你可以写个CSharp的dll,然后在Fiddler的script里调用CSharp的API(事实上所有的.NET的dll都是可以的),参见Extending FiddlerScript using .NET
  • 再复杂一点,彻底抛弃script了,你可以完整地用CSharp(或其他.NET)写个Fiddler Extension,通过实现一些接口IFiddlerExtension、IAutoTamper、IHandleExecAction…来扩展Fiddler的功能

OK,你除了能够扩展Fiddler外,还可以直接把Fiddler的功能集成到你自己的Application(Fiddler称之为FiddlerCore),想想通过给自己的代码加上简短的几条代码就能具备HTTP(s) interpret功能,还是很酷的~~~(不过还没想好要它干吗~~~)

另外一些有意思的话题是,可以用Fiddler做UI automation test(没深入看,似乎通过ExecAction);可以把Fiddler配置成Reverse Proxy…总之Fiddler提供了一个Proxy的框架,可以在这个基础上做些security auditing/intrusion detection的原型开发还是很方便的。

有兴趣的TX可以看看已有的一些Fiddler扩展,其中很有名的Watcher(Passive Security Auditor)x5s(Automated XSS Security Testing Assistant)对于想研究web security的都可以看看。

本文网址:http://zoufeiblog.appspot.com/2010/05/5/Fiddler.html

encoding的问题

 

最近解决了一个问题:Web UI会接受用户输入的用户名和密码,通过AJAX把用户名/密码传递到backend,Java Servlet把利用用户名和密码调用一个shell script来check用户名/密码是否正确。这里遇到几个和encoding相关的问题,而这些都会导致如果username/password中存在特殊字符时无法正确地调用。

1. Javascript Encoding

首先,我们通过AJAX把username/password POST到backend,HTTP Post的参数和值的传递形式为:

param1=value1&param2=value2…

如果username/password中存在&或=,结果就是servlet无法正确地parse出param/value

解决方法是使用Javascript对value进行encoding,候选函数有:

  • escape
  • encodeURI
  • encodeURIComponent

而用来做POST value encoding最合适的选择是encodeURIComponet,因为:

  • escape不会编码字符:@×/+,而字符+会被服务器解析为空格
  • encodeURI不会编码字符:~!@#$&*()=:/,;?+',字符&和=显然会导致parse出错
  • encodeURIComponent不会编码字符: ~!*()',就是它了,HTTP Post的转义全部可以搞定~~~

2. Shell Encoidng

OK,现在AJAX已经可以把param/value传递到backend,Java Servlet会把这个参数传递给shell执行:

./myscript.sh 'username' 'password'

问题同上,如果username/password里有特殊字符怎么办?

首先,我们知道在shell里有些特殊字符是有特别含义的,比如&表示后台运行,$表示变量替换,\表示转行…

如果这些字符没有被引号包括起来('/”),那它的含义就是这里描述的了,比如我们了echo $PWD

为了能在参数中包含空格,可以通过双引号括起来,比如cd “/My Document”,问题来了,如果参数中有双引号,怎么办?可以通过\"进行转义,比如echo “Hello \”Zou Fei\””

可是如果在双引号中包含$\&!等特殊字符怎么办?所以我们希望的是shell不要帮我们做这种字符扩展,方式是通过单引号来括起来,在shell里单引号中间的字符是不会被shell解释的,比如echo ‘$PWD’会直接输出$PWD,而不是当前路径。

似乎已经完美了,可还有问题,如果参数里也含有单引号怎么办?转义呗,可是可是,在单引号中间的\'或者'’都不会被shell做转义啊(试一下echo ‘\'’)

man一下bash,可以找到一个很强悍的quoting:

http://www.gnu.org/software/bash/manual/bashref.html#ANSI_002dC-Quoting

3.1.2.4 ANSI-C Quoting

Words of the form $'string' are treated specially. The word expands to string, with backslash-escaped characters replaced as specified by the ANSI C standard. Backslash escape sequences, if present, are decoded as follows:

就是说对于$'param’这种形式的字符串,shell会使用ANSI C的方式进行escaping,比如\\表示\,\n表示回车,那我们就可以\'来表示'咯,所以echo $’\'’会输出单引号,而echo $’$PWD’也不会输出当前路径~~~

O了,下面把它变成代码,用它可以适用于你希望把任意字符作为参数传递给shell,同时不希望shell进行shell interpret:

// need to delete[] the returned char*
char * shell_escape(const char* str)
{
	// shell support the format $'string' for QUOTING (refer MAN page)
	// and the string can be ANSI c style escaping
	int len = strlen(str) * 2 + 3;
	char * new_str = new char[len];
	memset(new_str, 0, len);
	// add "$'" for begin
	strncpy(new_str, "$'", 2);
	int j = 0;
	for (int i = 0; i < strlen(str); i ++)
	{
		if (str[i] == '\\')
		{
			new_str[j++] = '\\';
			new_str[j++] = '\\';
		}
		else if (str[i] == '\'')
		{
			new_str[j++] = '\\';
			new_str[j++] = '\'';
		}
		else
		{
			new_str[j++] = str[i];
		}
	}
	// add "'" for end
	new_str[j] = '\'';
	return new_str;
}

它做的事情很简单,就是把\替换成\\,把'替换成\',然后在首尾加上$'…’,当然要用这个函数得记得delete[]返回值咯~~~

顺带说一句,这个方法还可以解决大多数的shell injection问题。

 

当然,这里只是考虑了encoding的问题,而事实上这种方案本身还有其他一系列问题,比如把password直接用来system是会导致password leak的(只要monitor process就可以了)

本文网址:http://zoufeiblog.appspot.com/2010/05/5/Encoding.html