Category Archives: dev

Chrome和IE9中的XSS防护(XSS filter)功能

刚才去虾米听歌时发现了一个XSS,测试时了解到了一个东西:Chrome和IE9中有了XSS防护(XSS filter)功能,而Firefox4中没有。 这个XSS页面是:http://www.xiami.com/song/play?ids=”></object><script>alert(/xss/)</script><!–/object_name/default/object_id/0 用不同浏览器访问这个页面后的情况是: Chrome会报错,XSS失败: Firefox4成功执行: IE9阻止了XSS,执行失败: google后知道了原因:Chrome有XSS防护功能,大致是如果一段脚本通过浏览器被发送给服务器,然后又原样返回,那么Chrome就认为是XSS,拒绝执行这段脚本;IE9也有类似机制,一旦检测到一段脚本可能是XSS就不执行;而悲剧的Firefox4却没有此类机制。 参考: 1. Refused to execute a JavaScript script. Source code of script found within request. 2. Cross-site scripting filter

发表在 dev, javascript, security | 发表评论

mysql中字串的区分大小写查询

mysql里字串的比较方式是不区分大小写的,这样会造成很多问题。测试如下: 新建一张表并加入两条仅仅大小写不一样的数据: mysql> create table test(x varchar(200)); mysql> insert into test values(‘heLLo’); mysql> insert into test values(‘hello’); mysql> select * from test; +——-+ | x | +——-+ | heLLo | | hello | +——-+ 2 rows in set (0.00 sec) … 繼續閱讀

发表在 db, dev, python | 发表评论

css写法中选择器的顺序问题

我们经常将多个css选择器合起来写,如: p,ul,ol,blockquote,input,select{font-size:12px;} 但如果其中一个选择器写的有问题,会发生什么问题呢?比如如下代码: <style> p,p:fake {color:green;} </style> <p>test</p> 浏览器打开后看到的文字是什么颜色?测试结果是:IE9会接受第一个p的样式,忽略第二个p的样式,文字是绿色;Firefox4和Chrome会因为p和p:fake写到了一起,而p:fake有问题,因而忽略掉了整行样式,文字还是默认的黑色。以下是Firefox控制台的警告信息: 这是最近发现的一个误区,是在写如下样式时发现的: input:-moz-placeholder, input::-webkit-input-placeholder {color: #999;} 以上代码在Chrome中,占位文字会是灰色,而Firefox中还是黑色,就是上述原因:Firefox遇到未知的“input::-webkit-input-placeholder”会让前面的”input:-moz-placeholder”也失效,占位文字返回默认的黑色;Chrome也忽略了整条样式,因为它的占位文字默认就是灰色,所以看起来很像这条样式被成功应用的样子。 总结就是,以后再写这样跨浏览器、hack方式的css样式时,需要把针对每种浏览器的写法分开,而不应该合起来写。

发表在 dev, web | 发表评论

浏览器渲染加速

这是一篇阅读笔记,原文是:http://code.google.com/intl/zh-CN/speed/page-speed/docs/rendering.html 1. 高效化css css引擎从右到左执行每个css rule(最右边的rule叫做key),直到找到最大匹配或到最左位置。所以css rule越明确,浏览器需要测试的node就越少;css rule越泛泛,浏览器需要测试的node就越多,越耗时 删除无用css css压缩(YUI) 避免用*作为key eg: body * {…} /* key是* */ body > * {} /* key是* */ css rule越明确越好,优先使用class或ID,而不是tag 删除冗余css rule eg: ul#nav {…} /* ul就是冗余的 */ a.outer-link {…} /* 当只有a使用.outer-link类时,a就是冗余的 */ body … 繼續閱讀

发表在 dev, note, reading, web | 发表评论

Google的SPDY协议

前阵子在翻Chrome源码时发现的。SPDY是google针对HTTP协议的缺陷设计的下一代web传输协议,看起来很有意思。以下内容总结自: http://www.chromium.org/spdy/spdy-whitepaper HTTP 的缺陷: 一个TCP连接只能传说一个HTTP请求,多个HTTP请求间可能会因为多个TCP连接而延迟500ms (浏览器方解决方法是对每个域名并发HTTP请求,08年以来平均的 HTTP请求/域名 从2上升到了6) 必须由客户端发起请求,即使服务端知道客户端浏览器接下来需要某某资源 请求和响应头部都没有压缩。(请求头200b ~ 2KB,平均700~800b) 冗余http头部字段。对同一个域名发起的所有http请求中,每个都包含冗余的http字段(User-Agent, Accept*) 数据压缩时可选项。应该是所有数据必须压缩传输! SPDY 的技术实现: 允许在一个TCP会话中并发传输多个HTTP请求 通过压缩http头,精简无用头部来减小带宽 定义一个易于实现、服务端高效的协议 为了安全性和兼容性,将SSL作为底层传输协议。长期看是很好的。 使服务端可以PUSH数据给客户端;服务端可以发SERVER HINT给客户端 测试效果:使用SPDY后,平均减少64%的页面载入时间

发表在 dev, note, reading, web | 发表评论

del a与del a[:]的区别

假设 a 是一个 python 数组,如 a=range(10),那么 del a 与 del a[:] 有什么区别? 看下面的测试: >>> a=range(10) >>> a [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> del a >>> a Traceback (most recent call last): File “<stdin>”, line 1, … 繼續閱讀

发表在 dev, python | 发表评论

Firefox里javascript的表达式闭包

先看段js代码,下面这个语句会报错吗? function (x) function (x) function(x) function(x) {} 实际情况是,在Firefox3+不会报错,而在Chrome、IE里会报错。这是Friefox3里新增的javascript表达式闭包,是闭包函数的简写法。上述代码相当于: function (x) { return function(x){ return function(x){ return function(x){} }; }; } 可见表达式闭包在写简单函数时会很方便。再看看,这种写法不就是python里的lambda函数吗? 简单写了一个模拟python里装饰器功能的东西: var test_func = function(a) { alert(a); }; var wrapper_func = function (x) function (y) { alert(‘before’); x(y); … 繼續閱讀

发表在 dev, javascript | 发表评论

urllib2的随机http代理handler

对于使用urllib2抓取网页的程序,如果使用代理,一般都使用urllib2.ProxyHandler这个handler。而这个handler必须在初始化时指定一个代理服务器(可以是http和https各一个),然后通过urllib2.build_opener和urllib2.install_opener安装到urllib2种,之后再去用urllib2.urlopen去抓页面。 这样做只能使用一个代理服务器,但如果我们要在不停地调用urllib2.urlopen时使用随机多个代理服务器呢?用urllib2.ProxyHandler的话就只能每次抓页面前重新初始化opener,这样做的性能是不能让人容忍的。 如果查阅下urllib2的代码,就会发现它每次抓网页时,是去调urllib2.ProxyHandler的http_open(https同理)方法为http头加了几个代理服务器字段。如果我们派生出一个类,覆盖掉urllib2.ProxyHandler的http_open方法,实现上改为每次随机取代理地址,不就ok了么? 下面是具体实现代码,测试通过: #!/usr/bin/env python # coding:utf-8 # yc@2012-2-23 import urllib2, random, base64 from urllib import unquote DEBUG = False class RandomProxyHandler(urllib2.ProxyHandler): ”’ 随机http代理handler ”’ def __init__(self, proxies=None): ”’ proxies为一个seq,每项为一个http代理,如:’proxy.example.com:3128′ 或 ‘http://joe:password@proxy.example.com’ ”’ self.proxies = [urllib2._parse_proxy(i) for i in … 繼續閱讀

发表在 dev, python | 1条评论

线程安全的python生成器: yield

在多线程编程中,大部分情况下我们都得使用资源锁,否则程序的行为会千奇百怪。比如多个线程公用一个socket连接而在使用时不加锁的话,发送和接收的数据包顺序有可能会被打乱。 写多线程的python程序,大多使用了threading模块的Lock、RLock或Condition类来作资源锁。使用共享资源时加锁,使用完毕后释放锁,当程序逻辑很复杂时,资源锁的控制也会变得越来越复杂,由此导致的bug也不断增多。 这里介绍一种不用锁机制去访问共享资源的方法,那就是使用python中的生成器,也就是使用了yield指令的函数。 按照锁机制中经典的生产者、消费者模型编写的生成器代码大致如下: #coding:utf-8 import threading, random, time def producer(): x = 0 while x < 60: x += 1 time.sleep(random.random()) yield x y = producer() def consumer(): while True: try: x = y.next() except: break print x for … 繼續閱讀

发表在 dev, python | 发表评论