月度归档:2013年01月

PHP框架upadd初始版本发布1.0.0

UPADD是我个人今年学习和总结发布的一个MVC框架,虽然目前不是很强大,可总是有一个过程,这个框架里面很多立名是我个人习惯,也许有英文拼错了,因为我英文不好,哈哈

下面来说说,这个框架的文件布局

Edit文件夹目录
显示层  html
输出层  Export
检查层  check
逻辑层  Logic
配置项  Config
Deploy.inc.php
Run.inc.php

框架名称 upadd
核心基类 Core
Form.class.php    这个类是组织和形成唯一路口index的类
Jump.class.php    这个类是专门做跳转的,不过里面的很多方法下的NULL,需要你自己思考去看咯,具体查看模板引擎类设置
Mysql.class.php   这个类专干数据库处理的  这个类是别人那里拿过来的,据说是2年的大型框架里面跑的类
PdoMysql.class.php  这个类是PDO的MYSQL类,已经在某个项目跑的很好啦
Request.class.php        这个家伙是HTTML统一请求的
Templates.class.php    这个类是模板引擎处理类
Tool.class.php        工具类,嘻嘻,自己看
Validate.class.php     这个类专门和check配合之间,具体自己想干啥,自己想吧
目前来说说缺少啥,分类,树形,上传,图片处理,路由模式,大致想到的是这些,打算在1.5的时候补上
扩展类库 library
test.lib.php   这里是希望自己开发的往里面仍的类,核心层就负责框架的交互使用,不想放太多和框架不相关的事

补充事项:如果你要创建一个操作层文件(也就是Export下),你必须要首字母大写比如说IndexE.php  最后面加的大写E是必须的

文件内创建的类必须要继承与E,比如说
class TestE extends E{
public function __construct(){
parent::__construct();
}
}

clss名称必须要和文件名称对应起来,如果有啥疑问就看Form.class.php,Run.inc.php,E.php,L.php这4个文件,主要靠这4个文件实现唯一路口和相关的交互问题

最后说句话:里面已经有一个实例了,如果你有PHP环境,直接放到目录下访问http://ip/index.php?up=test即可

没写过框架什么的说明,现在就暂时发布出来和大伙研究研究,改进下

 

框架下载地址:http://pan.baidu.com/share/link?shareid=261271&uk=2870623498

通过 HTTP 头进行 SQL 注入

在漏洞评估和渗透测试中,确定目标应用程序的输入向量是第一步。这篇文章解释了别人是如何通过HTTP头部对你的数据库进行SQL注入攻击的,以及讨论下选择哪种漏洞扫描器测试SQL注入。

作者:Yasser Aboukir, InfoSec Institute

在漏洞评估和渗透测试中,确定目标应用程序的输入向量是第一步。有时,当做web应用程序测试时,SQL注入漏洞的测试用例通 常局限于特殊的输入向量GET和POST变量。那么对于其他的HTTP头部参数呢?难道他们不是潜在的SQL注入攻击输入向量吗?我们如何测试这些 HTTP参数呢,以及使用什么样的漏洞扫描器查找出这些应用的漏洞呢?

web应用扫描器里输入参数的覆盖范围

通过对60个商业和开源的黑盒web应用程序漏洞扫描器的比较,发表了这样一篇文章:“扫描军团:扫描精度评估&功能比较”。这个主要用于测试商业和开源软件的urls漏洞的标准,已经被安全研究人员Shay Chen在2011年发布了。

对于测试web应用程序的扫描器支持输入参数覆盖的情况,我们已经总结在下面的图表中了。这些主要的输入是:

  • HTTP 查询字符参数(GET):输入参数通过URL发送
  • HTTP 正文参数(POST):输入参数通过HTTP正文发送
  • HTTP Cookie参数:输入参数通过HTTP cookie发送
  • HTTP Headers:HTTP提交应用程序使用的头

033012_1704_SQLInjectio1

这个图表中明显的显示出,有75%的web应用程序扫描器不能发现HTTP Headers参数的相关漏洞。此外,这些扫描器中的70%,也错误的检查了HTTP Cookies漏洞。这些比例完全说明了这些扫描器在扫描输入向量方面的能力,而不只是简单的解释。对GET和POST的评分是比较合理的,一些自动化测 试工具可能导致,在处理HTTP headers作为一个SQL注入输入向量时,出现不令人满意的结果。

033012_1704_SQLInjectio2

实际上,HTTP Headers和Cookie没有得到重视。因此,这两个向量应该在测试用例中被考虑到。还有,当我们使用的漏洞扫描器不支持这些特征时,我们应该考虑手工测试这些参数。

潜在的HTTP头SQL注入

HTTP头字段

HTTP头字段是超文本传输协议(HTTP)中请求和响应的部分信息,它们定义了HTTP传输的操作参数。

例如: 请求的 HTTP

GET / HTTP/1.1
Connection: Keep-Alive
Keep-Alive: 300
Accept:*/*
Host: host
Accept-Language: en-us
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US;
rv:1.9.2.16) Gecko/20110319 Firefox/3.6.16 ( .NET CLR 3.5.30729; .NET4.0E)
Cookie: guest_id=v1%3A1328019064; pid=v1%3A1328839311134

当我们把会话标识保存在数据库时,首先应该把HTTP Cookies作为首要潜在的HTTP变量进行测试。在后面我们将会看到一个使用Cookie进行SQL注入的实例。也有其他和应用相关的HTTP头信息。

X-Forwarded-For

X-Forwarded-For是HTTP头的一个字段。它被认为是客户端通过HTTP代理或者负载均衡器连接到web服务端获取源ip地址的一个标准。

我们来看一个基于表单提交漏洞的例子。

$req = mysql_query("SELECT user,password FROM admins WHERE user='".sanitize($_POST['user'])."' AND password='".md5($_POST['password'])."' AND ip_adr='".ip_adr()."'");

sanitize() 方法控制着登录变量的正确性。

function sanitize($param){ if (is_numeric($param)) { return $param; } else { return mysql_real_escape_string($param); } }

让我们检查下变量ip,它通过ip_addr()方法来得到输出的值。

function ip_adr() { if
(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ip_adr = $_SERVER['HTTP_X_FORWARDED_FOR']; } else { $ip_adr = $_SERVER["REMOTE_ADDR"]; } if (preg_match("#^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}#",$ip_addr)) { return $ip_adr; } else { return $_SERVER["REMOTE_ADDR"]; } }

显然,ip地址通过HTTP头X_FORWARDED_FOR 得到返回值。之后,通过preg_match方法来验证是否至少存在一个合法的ip地址。事实上,在使用SQL查询前HTTP_X_FORWARDED_FOR 环境变量没有充分的过滤,这也就导致了在SQL查询时,可以通过这个字段注入任意SQL代码。

这个头字段可以像下面这样简单地修改:

GET /index.php HTTP/1.1
Host: [host]
X_FORWARDED_FOR :127.0.0.1' or 1=1#

这样的修改将会导致绕过安全认证。

User-agent

用户代理(user agent)是记录软件程序的客户端信息的HTTP头字段,他可以用来统计目标和违规协议。在HTTP头中应该包含它,这个字段的第一个空格前面是软件的产品名称,后面有一个可选的斜杠和版本号。

并不是所有的应用程序都会被获取到user-agent信息,但是有些应用程序利用它存储一些信息(如:购物车)。在这种情况下,我们就有必要研究下user-agent头存在的问题了。

HTTP查询实例:

GET /index.php HTTP/1.1
Host: [host]
User-Agent: aaa' or 1/*

Referer

Referer是另外一个当应用程序没有过滤存储到数据库时,容易发生SQL注入的HTTP头。它是一个允许客户端指定的可选头部字段,通过它我们可以获 取到提交请求URI的服务器情况。它允许服务器产生一系列的回退链接文档,像感兴趣的内容,日志等。它也允许跟踪那些坏链接以便维护。

例如:

GET /index.php HTTP/1.1
Host: [host]
User-Agent: aaa' or 1/*
Referer: http://www.yaboukir.com

 

攻击者目的?

众所周知,注入漏洞位列OWASP十大web应用安全风险之首。攻击者越来越多的寻找你的数据库读写权限,无论这个注入点是向量输入类型,GET,POST,Cookie或者其他的HTTP头;对于攻击者重要的是,找到至少一个能够让他们深入利用的注入点.

手动测试Cookie漏洞

在这部分,我们将介绍下检查HTTP Cookie变量的几种方法。

使用浏览器插件

Cookie Manager+ 允许查看,编辑和创建新的cookies,它也提供显示cookies的一些额外信息,支持同时修改多个cookies,而且我们可以备份/恢复这些cookies。

安装之后,在工具菜单中选择Cookies Manager+,选择一个和目标应用有关的Cookie 变量。

033012_1704_SQLInjectio3

我们来编辑下language_id这个变量,为了判断是否存在SQL注入漏洞,我们在字段后面添加个“'”。
language_id内容如下:

033012_1704_SQLInjectio4

然后刷新页面,或者点击这个应用程序内部的其他链接,提交编辑后的HTTP cookie请求,返回结果出现一个SQL错误:

033012_1704_SQLInjectio5

这个数据库错误提醒我们存在一个易产生SQL注入的漏洞。

Cookies Manager+ 优势是他非常易用,我们可以直接对cookie操作并且保存之前修改的cookie。

下面我们将尝试使用另一个Firefox插件,来检测目标的列数。

Tamper Data:

Tamper Data 是火狐下的一个非常强大的插件,它可以显示和修改HTTP/HTTPS头,以及POST参数。

安装之后,在工具栏菜单选择Tamper Data,点击按钮Start Tamper开始修改HTTP请求。

当目标应用程序发送任何请求时,Tamper Data都会弹出一个对话框询问我们是否想要干预当前HTTP请求。

033012_1704_SQLInjectio6

点击Tamper后,将弹出一个Tamper详细窗口:

033012_1704_SQLInjectio7

我们按上图显示的那样:添加order by 4到HTTP cookie变量。从应用程序返回的响应是正常的。

033012_1704_SQLInjectio8

我们继续增加: order by 5. 这次注入的响应如下:

033012_1704_SQLInjectio9

所以,我们能够推断出列数为4。

现在,为了在更多查询里注入,我们尝试找出受影响的列。因此,我们需要把下面的查询添加到HTTP cookie变量language_id里:

-1+UNION+ALL+SELECT+1,2,3,4

这个手段可能需要利用到一些高级的SQL注入技术。

使用自动化渗透测试扫描工具

以Sqlmap为例

Sqlmap 是一个流行的开源的自动化渗透测试工具。这个程序可以测试和利用SQL注入缺陷,并且可以接管数据库服务。

Sqlmap 支持HTTP cookie功能,所以它可以通过两种方式使用:

  • 当web应用程序需要时,基于cookies的安全验证。
  • 头值中SQL注入的检测和利用。

Sqlmap默认测试所有的GET参数和POST参数。当-level参数值设置为2或者更大时,它将测试HTTP Cookie 头值。当这个值设置为3或者更大时,测试也包含HTTP User_Agent和HTTP Referer头值。你也可以将你想用sqlmap测试的参数,用逗号分隔开进行测试,这样就会绕过对-level的依赖。

Tested HTTP parameter Level in sqlmap
GET 1 (Default)
POST 1 (Default)
HTTP Cookie 2 ?
HTTP User-Agent 3 ?
HTTP Referer 3 ?

例如,测试GET参数id和HTTP User-agent,只需提供-p id,user-agent参数。

下面这个例子演示了DVWA (Damn Vulnerable Web Application)的HTTP cookie中名为security的测试。

./sqlmap.py -u 'http://127.0.0.1/vulnerabilities/sqli/?id=1&Submit=Submit#'
--cookie='PHPSESSID=0e4jfbrgd8190ig3uba7rvsip1; security=low'
--string='First name' --dbs --level 3 -p PHPSESSID

-string标志比较注入时有效页面和无效页面。另一方面,-dbs标示用来枚举数据库管理系统。最后,-p标示用来表示强制测试PHPSESSID变量。

033012_1704_SQLInjectio10

测试SQL注入的工具:通过精度选择还是向量覆盖率选择?

为了回答这个问题,我们使用了sectoolmarket.com网站提供的标准测试结果,我们先假设候选的扫描程序的测试精度和向量覆盖率有相同的重要 性。我们将GET。POST,HTTP Cookie和HTTP Headers作为应该被支持的输入向量。当所有的参数都被支持时,这个扫描器的覆盖范围的比率为100%(4/4)。

我们建议使用下面的算术方程式,也就是说对于漏洞扫描器的得分求一个平均值。

然后从得到的检测准确率的百分比中,我们列出前14名的扫描器:

Rank Vulnerability Scanner Vendor Detection Rate Input Vector Coverage Average Score
1 Arachni Tasos Laskos 100.00% 100% 100.00%
2 Sqlmap sqlmap developers 97.06% 100% 98,53%
3 IBM AppScan IBM Security Sys Division 93.38% 100% 96,69%
4 Acunetix WVS Acunetix 89.71% 100% 94,85%
5 NTOSpider NT OBJECTives 85.29% 100% 92,64%
6 Nessus Tenable Network Security 82.35% 100% 91,17%
7 WebInspect HP Apps Security Center 75.74% 100% 87,87%
8 Burp Suite Pro PortSwigger 72.06% 100% 86,03%
9 Cenzic Pro Cenzic 63.24% 100% 81,62%
10 SkipFish Michal Zalewski – Google 50.74% 100% 75,37%
11 Wapiti OWASP 100.00% 50% 75.00%
12 Netsparker Mavituna Security 98.00% 50% 74.00%
13 Paros Pro MileSCAN Technologies 93.38% 50% 71,69%
14 ZAP OWASP 77,21% 50% 63,60%

我们可以通过对扫描器的扫描漏洞的精度和向量覆盖率取到的平均值,做出下面一个图表。

033012_1704_SQLInjectio13

接下来做啥?

对于开发者

开发者应当把cookies和其他保存的HTTP头像表单输入一样对待,能通过常规的验证。

对于测试者

HTTP头的操作请求信息(尤其是REFERE和USER-AGENT)对于确认应用程序是否存在SQL注入漏洞或者其他缺陷(XSS)是非常重要的,最 好的方法是在使用应用程序时定义和描述好每一种操作情况。这些数据可能被存储,提取和处理,像cookie,HTTP-headers(像 HTTP_USER_AGENT),form-variables(显示和隐藏),Ajax- ,JQusery-,XML-requests.

Yasser Aboukir 是INFOSEC机构的一个安全研究员. InfoSec Institute 是个提供CEH 认证和CCNA training训练的机构.

参考文献

[1] Penetration Testing with Improved Input Vector Identification, William G.J. Halfond, Shauvik Roy Choudhary, and Alessandro Orso College of Computing Georgia Institute of Technology

[2] Security Tools Benchmarking – A blog dedicated to aiding pen-testers in choosing tools that make a difference. By Shay-Chen http://sectooladdict.blogspot.com/2011/08/commercial-web-application-scanner.html

[3] https://en.wikipedia.org/wiki/X-Forwarded-For

[4] http://www.techbrunch.fr/securite/blind-sql-injection-header-http/

[5] http://www.w3.org/Protocols/HTTP/HTRQ_Headers.html#user-agent

[6] http://www.w3.org/Protocols/HTTP/HTRQ_Headers.html#z14

[7] https://addons.mozilla.org/en-US/firefox/addon/cookies-manager-plus/

[8] https://addons.mozilla.org/en-US/firefox/addon/tamper-data/

[9] http://sqlmap.sourceforge.net/doc/README.html

[10] http://msdn.microsoft.com/en-us/library/ms161953.aspx

来源:http://www.oschina.net/translate/sql-injection-through-http-headers   翻译参与者:@缪斯的情人

CSS兼容性技巧整理--从IE6-IE9 火狐谷歌浏览器兼容

CSS兼容性技巧整理--从IE6-IE9 火狐谷歌浏览器兼容

本文收集整理了IE7,6与Fireofx的CSS兼容性处理技巧,供大家参考。

CSS兼容常用技巧

请尽量用xhtml格式写代码,而且DOCTYPE影响 CSS 处理,作为W3C标准,一定要加DOCTYPE声明。

1.div的垂直居中问题

vertical-align:middle; 将行距增加到和整个DIV一样高 line-height:200px; 然后插入文字,就垂直居中了。缺点是要控制内容不要换行

2. margin加倍的问题

设置为float的div在ie下设置的margin会加倍。这是一个ie6都存在的bug。解决方案是在这个div里面加上display:inline;

例如:

<#div id=”imfloat”>
相应的css为
#imfloat{
float:left;
margin:5px;
display:inline;}

3.浮动ie产生的双倍距离

#box{ float:left; width:100px; margin:0 0 0 100px; //这种情况之下IE会产生200px的距离 display:inline; //使浮动忽略}

这里细说一下block与inline两个元素:block元素的特点是,总是在新行上开始,高度,宽度,行高,边距都可以控制(块元素);Inline元素的特点是,和其他元素在同一行上,不可控制(内嵌元素);

#box{ display:block; //可以为内嵌元素模拟为块元素 display:inline; //实现同一行排列的效果 diplay:table;

4 IE与CSS宽度和CSS高度的问题div css技巧

IE不认得min-这个定义,但实际上它把正常的width和height当作有min的情况来使。这样问题就大了,如果只用宽度和高度,正常的浏览器里这两个值就不会变,如果只用min-width和min-height的话,IE下面根本等于没有设置宽度和高度。

比如要设置背景图片,这个宽度是比较重要的。要解决这个问题,可以这样:

#box{ width: 80px; height: 35px;}html>body #box{ width: auto; height: auto; min-width: 80px; min-height: 35px;}

5.页面的最小宽度

min-width是个非常方便的CSS命令,它可以指定元素最小也不能小于某个宽度,这样就能保证排版一直正确。但IE不认得这个,而它实际上把 width当做最小宽度来使。为了让这一命令在IE上也能用,可以把一个<div> 放到<body> 标签下,然后为div指定一个类,然后CSS这样设计:

#container{ min-width: 600px; width:expression_r(document.body.clientWidth < 600? "600px": "auto" );}

第一个min-width是正常的;css制作但第2行的width使用了Javascript,这只有IE才认得,这也会让你的HTML文档不太正规。它实际上通过Javascript的判断来实现最小宽度。

6.DIV浮动IE文本产生3象素的bug

左边对象浮动,右边采用外补丁的左边距来定位,右边对象内的文本会离左边有3px的间距.

#box{ float:left; width:800px;}
#left{ float:left; width:50%;}
#right{ width:50%;}
*html #left{ margin-right:-3px; //这句是关键}
<div id="box">
<div id="left"></div>
<div id="right"></div>
</div>

7.IE捉迷藏的问题

当div应用复杂的时候每个栏中又有一些链接,DIV等这个时候容易发生捉迷藏的问题。

有些内容显示不出来,当鼠标选择这个区域是发现内容确实在页面。解决办法:对#layout使用line-height属性或者给#layout使用固定高和宽。页面结构尽量简单。

8.float的div闭合;清除浮动;自适应高度

①例如:<#div id=”floatA” ><#div id=”floatB” ><#div id=”NOTfloatC” >这里的NOTfloatC并不希望继续平移,而是希望往下排。(其中floatA、floatB的属性已经设置为float:left;)

这段代码在IE中毫无问题,问题出在FF。原因是NOTfloatC并非float标签,必须将float标签闭合。在 <#div class=”floatB”> <#div class=”NOTfloatC”>之间加上 <#div class=”clear”>这个div一定要注意位置,而且必须与两个具有float属性的div同级,之间不能存在嵌套关系,否则会产生异常。并且将clear这种样式定义为为如下即可: .clear{ clear:both;}

②作为外部 wrapper 的 div 不要定死高度,div css制作为了让高度能自动适应,要在wrapper里面加上overflow:hidden; 当包含float的box的时候,高度自动适应在IE下无效,这时候应该触发IE的layout私有属性(万恶的IE啊!)用zoom:1;可以做到,这样就达到了兼容。
例如某一个wrapper如下定义:

.colwrapper{ overflow:hidden; zoom:1; margin:5px auto;}

③对于排版,我们用得最多的css描述可能就是float:left.有的时候我们需要在n栏的float div后面做一个统一的背景,譬如:

<div id=”page”>
<div id=”left”></div>
<div id=”center”></div>
<div id=”right”></div>
</div>

比如我们要将page的背景设置成蓝色,以达到所有三栏的背景颜色是蓝色的目的,但是我们会发现随着left center right的向下拉长,而page居然保存高度不变,问题来了css 制作,原因在于page不是float属性,而我们的page由于要居中,不能设置成 float,所以我们应该这样解决

<div id=”page”>
<div id=”bg” style=”float:left;width:100%”>
<div id=”left”></div>
<div id=”center”></div>
<div id=”right”></div>
</div>
</div>

再嵌入一个float left而宽度是100%的DIV解决之道。

④万能float 闭合(非常重要!)

关于 clear CSS float 的原理可参见 [How To Clear Floats Without Structural Markup],将以下代码加入Global CSS 中,给需要闭合的div加上 class="clearfix" 即可,屡试不爽.

.clearfix:after { content:"."; display:block; height:0; clear:both; visibility:hidden; }
.clearfix { display:inline-block; }

.clearfix {display:block;}

或者这样设置:.hackbox{ display:table; //将对象作为块元素级的表格显示}

9.高度不能自适应

高度不能自适应是当内层对象的高度发生变化时外层高度不能自动进行调节,特别是当内层对象使用margin 或paddign 时。

例:

#box {background-color:#eee; }
#box p {margin-top: 20px;margin-bottom: 20px; text-align:center; }
<div id="box">
<p>p对象中的内容</p>
</div>

解决技巧:在P对象上下各加2个空的div对象CSS代码:.1{height:0px;overflow:hidden;}或者为DIV加上border属性。

10 .div+css之IE6下为什么图片下有空隙产生

解决这个BUG的技巧也有很多,可以是改变html的排版,或者设置img 为display:block 或者设置vertical-align 属性为vertical-align:top

bottom  middle  text-bottom 都可以解决.

11.如何对齐文本与文本输入框

加上 vertical-align:middle;

<style type="text/css">
<!--
input {
width:200px;
height:30px;
border:1px solid red;
vertical-align:middle;
}
-->
</style>

12.web标准中定义id与class区别吗

(1).web标准中是不容许重复ID的,比如 div id="aa" 不容许重复2次,而CSS class定义的是类,理论上可以无限重复, 这样需要多次引用的定义便可以使用他.

(2).属性的优先级问题

CSS ID的优先级要高于class,看上面的例子

(3).方便JS等客户端脚本,如果在页面中要对某个对象进行脚本操作,那么可以给他定义一个ID,否则只能利用遍历页面元素加上指定特定属性来找到它,这是相对浪费时间资源,远远不如一个ID来得简单。

13. LI中内容超过长度后以省略号显示的技巧

此技巧适用与IE与OP浏览器

<style type="text/css">
<!--
li {
width:200px;
white-space:nowrap;
text-overflow:ellipsis;
-o-text-overflow:ellipsis;
overflow: hidden;
}

-->
</style>

14.为什么web标准中IE无法设置滚动条颜色了

解决办法是将body换成html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<style type="text/css">
<!--
html {
scrollbar-face-color:#f6f6f6;
scrollbar-highlight-color:#fff;
scrollbar-shadow-color:#eeeeee;
scrollbar-3dlight-color:#eeeeee;
scrollbar-arrow-color:#000;
scrollbar-track-color:#fff;
scrollbar-darkshadow-color:#fff;
}
-->
</style>

15.为什么无法定义1px左右高度的容器

IE6下这个问题是因为默认的行高造成的,解决的技巧也有很多,例如:
overflow:hidden   zoom:0.08   line-height:1px

16.怎么样才能让层显示在FLASH之上呢

解决的办法是给FLASH设置透明

<param name="wmode" value="transparent" />

17.怎样使一个层垂直居中于浏览器中

这里我们使用百分比绝对定位,与外补丁负值的技巧,负值的大小为其自身宽度高度除以二

<style type="text/css">
<!--
div {
position:absolute;
top:50%;
lef:50%;
margin:-100px 0 0 -100px;
width:200px;
height:200px;
border:1px solid red;
}
-->
</style>

Firefox与IE的CSS兼容CSS HACK技巧

1. Div居中问题

div设置 margin-left, margin-right 为 auto 时已经居中,IE 不行,IE需要设定body居中,首先在父级元素定义text-algin: center;这个的意思就是在父级元素内的内容居中。

2.CSS 链接(a标签)的边框与背景

a链接加边框和背景色,需设置 display: block, 同时设置 float: left 保证不换行。参照 menubar, 给 a 和 menubar 设置高度是为了避免底边显示错位, 若不设 height, 可以在 menubar 中插入一个空格。

3.超链接访问过后hover样式就不出现的问题

被点击访问过的超链接样式不在具有hover和active了,很多人应该都遇到过这个问题,解决技巧是改变CSS属性的排列顺序: L-V-H-A

Code:

<style type="text/css">
<!--
a:link {}
a:visited {}
a:hover {}
a:active {}
-->
</style>

4. 游标手指cursor

cursor: pointer 可以同时在 IE FF 中显示游标手指状, hand 仅 IE 可以

5.UL的padding与margin

ul标签在FF中默认是有padding值的,而在IE中只有margin默认有值,所以先定义 ul{margin:0;padding:0;}就能解决大部分问题

6. FORM标签

这个标签在IE中,将会自动margin一些边距,而在FF中margin则是0,因此,如果想显示一致,所以最好在css中指定margin和 padding,针对上面两个问题,我的css中一般首先都使用这样的样式ul,form{margin:0;padding:0;}给定义死了,所以后面就不会为这个头疼了.

7. BOX模型解释不一致问题

在FF和IE中的BOX模型解释不一致导致相差2px解决技巧:div{margin:30px!important;margin:28px;} 注意这两个margin的顺序一定不能写反, important这个属性IE不能识别,但别的浏览器可以识别。所以在IE下其实解释成这样:

div{maring:30px;margin:28px}重复定义的话按照最后一个来执行,所以不可以只写margin:xx px!important;#box{ width:600px; //for ie6.0- w\idth:500px; //for ff+ie6.0}
#box{ width:600px!important //for ff width:600px; //for ff+ie6.0 width :500px; //for ie6.0-}

8.属性选择器(这个不能算是兼容,是隐藏css的一个bug)

p[id]{}div[id]{}

这个对于IE6.0和IE6.0以下的版本都隐藏,FF和OPera作用.属性选择器和子选择器还是有区别的,子选择器的范围从形式来说缩小了,属性选择器的范围比较大,如p[id]中,所有p标签中有id的都是同样式的.

9.最狠的手段 - !important

如果实在没有办法解决一些细节问题,可以用这个技巧.FF对于”!important”会自动优先解析,然而IE则会忽略.如下

.tabd1{
background:url(/res/images/up/tab1.gif) no-repeat 0px 0px !important;
background:url(/res/images/up/tab1.gif) no-repeat 1px 0px; }

值得注意的是,一定要将xxxx !important 这句放置在另一句之上。

10.IE,FF的默认值问题

或许你一直在抱怨为什么要专门为IE和FF写不同的CSS,为什么IE这样让人头疼,然后一边写css,一边咒骂那个可恶的M$ IE.其实对于css的标准支持方面,IE并没有我们想象的那么可恶,关键在于IE和FF的默认值不一样而已,掌握了这个技巧,你会发现写出兼容FF和 IE的css并不是那么困难,或许对于简单的css,你完全可以不用”!important”这个东西了。

我们都知道,浏览器在显示网页的时候,都会根据网页的css样式表来决定如何显示,但是我们在样式表中未必会将所有的元素都进行了具体的描述,当然也没有必要那么做,所以对于那些没有描述的属性,浏览器将采用内置默认的方式来进行显示,譬如文字,如果你没有在css中指定颜色,那么浏览器将采用黑色或者系统颜色来显示,div或者其他元素的背景,如果在css中没有被指定,浏览器则将其设置为白色或者透明,等等其他未定义的样式均如此。所以有很多东西出现 FF和IE显示不一样的根本原因在于它们的默认显示不一样,而这个默认样式该如何显示我知道在w3中有没有对应的标准来进行规定,因此对于这点也就别去怪罪IE了。

11.为什么FF下文本无法撑开容器的高度

标准浏览器中固定高度值的容器是不会象IE6里那样被撑开的,那我又想固定高度,又想能被撑开需要怎样设置呢?办法就是去掉height设置min- height:200px; 这里为了照顾不认识min-height的IE6 可以这样定义:

{
height:auto!important;
height:200px;
min-height:200px;
}

12.FireFox下如何使连续长字段自动换行

众所周知IE中直接使用 word-wrap:break-word 就可以了, FF中我们使用JS插入
的技巧来解决

<style type="text/css">
<!--
div {
width:300px;
word-wrap:break-word;
border:1px solid red;
}
-->
</style>

<div id="ff">aaaaaaaaaaaaaaaaaaaaaaaaaaaa</div>

<scrīpt type="text/javascrīpt">

function toBreakWord(el, intLen){
var ōbj=document.getElementByIdx_x_xx_x_x(el);
var strContent=obj.innerHTML;
var strTemp="";
while(strContent.length>intLen){
strTemp+=strContent.substr(0,intLen)+"
";
strContent=strContent.substr(intLen,strContent.length);
}
strTemp+="
"+strContent;
obj.innerHTML=strTemp;
}
if(document.getElementByIdx_x_xx_x_x && !document.all) toBreakWord("ff", 37);

</scrīpt>

13.为什么IE6下容器的宽度和FF解释不同?

问题的差别在于容器的整体宽度有没有将边框(border)的宽度算在其内,这里IE6解释为200PX ,而FF则解释为220PX,那究竟是怎么导致的问题呢?大家把容器顶部的xml去掉就会发现原来问题出在这,顶部的申明触发了IE的qurks mode。

<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<style type="text/css">
<!--
div {
cursor:pointer;
width:200px;
height:200px;
border:10px solid red
}
-->
</style>
<div ōnclick="alert(this.offsetWidth)">让FireFox与IE兼容</div>

IE7.0对CSS的支持又有新问题,解决如下。

第一种,CSS HACK

Bpx;
_height:20px;

注意顺序。

下面这样也属于div CSS HACK,不过没有上面这样简洁。

#example { color: #333; }
* html #example { color: #666; }
*+html #example { color: #999; }

第二种,是使用IE专用的条件CSS注释

<!--其他浏览器 -->
<link rel="stylesheet" type="text/css" href="css.css" />

<!--[if IE 7]>
<!-- 适合于IE7 -->
<link rel="stylesheet" type="text/css" href="ie7.css" />
<![endif]-->

<!--[if lte IE 6]>
<!-- 适合于IE6及一下 -->
<link rel="stylesheet" type="text/css" href="ie.css" />
<![endif]-->

第三种,css filter的办法,以下是从国外网站翻译过来的。

新建一个css样式如下:

#item {
width: 200px;
height: 200px;
background: red;
}

新建一个div,并使用前面定义的css的样式:

<div id="item">some text here</div>

在body表现这里加入lang属性,中文为zh:

<body lang="en">

现在对div元素再定义一个样式:

*:lang(en) #item{
background:green !important;
}

 

来源:http://www.lvtao.net/html/2212.html

2013年优秀jQuery插件连载(一期)

2013年优秀jQuery插件连载(一期)
在 2012年,W3cplus每个月都为大家整理和推荐了一些优秀的jQuery插件。这些插件涉及到各方面的Web应用,资深的Javascript工程 师可能不消这些插件,但对于Javascript不是很熟悉的同学,这些插件对我们平时的工作还是有很大的帮助。那么在2013年我们依旧会搜集和整理一 些优秀的jQuery插件,希望这些插件能帮助大家解决工作中所遇到的效果。

今天为大家推荐的是2013年的第一期,在这期里面十个jQuery插件涵盖了响应式的网格布局插件、图片放大插件、表单元素中自定义select 插件,google 地图插件、文件拖放上传插件、tooltip提示插件、3D旋转菜单等等。这些插件的官网都提供了详细的API和相关代码下载,也提供了一些案例展示,可 以说稍懂一点前端的同学按照他们提供的API就会使用这些插件。

1、Makisu : jQuery CSS 3D Dropdown Menu concept

Makisu : jQuery CSS 3D Dropdown Menu concept

Makisu是一个jQuery和css3制作3D下拉菜单的插件,目前仅在chrome下能正常运行。

2、jQuery.Shapeshift

jQuery.Shapeshift

一款轻量级的网格系统插件,可以制作濗布流效果,同时具有拖动、Responsive和touch功能。

3、Rainbow

Rainbow

Rainbow是一个让你代码高亮显示的插件。

4、gmaps

gmaps

gmaps用来制作google地图的一个插件。

5、jQuery jkit

jQuery jkit

jQuery jkit是一个依赖于jQuery库的插件,里面包含了Web常用交互效果。

6、dropzone.js

dropzone.js

dropzone.js是一个js脚笨库,实用文件的拖拽上传文件,而且还可以预览上传后的文件。

7、Image Picker

Image Picker

Image Picker是一个简单的jQuery插件,它将一个选择元素变成一个更加友好的用户图形界面。

8、Elevate Zoom

Elevate Zoom

Elevate Zoom是一款图片放大的jQuery插件。

9、Opentip

Opentip

Opentip是一款强大的tooltip插件,支持所有现代浏览器以及IE7+浏览器。

10、Selectik

Selectik

Selectik是一款自定义表单的select样式的jQuery插件。

如需转载,烦请注明出处:http://www.w3cplus.com/source/best-jquery-plus-2013-part1.html

Facebook 网站架构

我收集到一些文章和视频, 可以带你窥探 Facebook 的架构. Facebook 承载了几十亿的用户, 它的架构(包括思想和实现)是非常值得参考的. 当然, 你要小心不要照搬 Facebook 的每一字一句, 因为任何思想和实现都是有自己的应用场景的.

转自:http://www.ideawu.net/blog/archives/635.html

centos6.2下配置apache多个虚拟主机

NameVirtualHost 42.121.123.229:80

#根目录
<VirtualHost 42.121.123.229:80>
ServerAdmin code@zmq.cc
DocumentRoot 你的目录/hoem/www
ServerName upadd.cn
ErrorLog logs/upadd.cn-error_log
CustomLog logs/upadd.cn-access_log common
</VirtualHost>

#多域名和目录设置
<VirtualHost 42.121.123.229:80>
ServerAdmin code@zmq.cc
DocumentRoot 你的目录/hoem/www
ServerName test.upadd.cn
ErrorLog logs/test.upadd.cn-error_log
CustomLog logs/test.upadd.cn-access_log common
</VirtualHost>

<VirtualHost 42.121.123.229:80>
ServerAdmin code@zmq.cc
DocumentRoot 你的目录/hoem/www
ServerName sql.upadd.cn
ErrorLog logs/sql.upadd.cn-error_log
CustomLog logs/sql.upadd.cn-access_log common
</VirtualHost>

重起 /etc/init.d/iptables restart

CentOS 6.3安装设置vsftpd及多用户登录

Centos 6.3 通过yum来安装vsftpd,主要是编译安装老是出错,特别麻烦,以后有空的话再研究研究。

1.通过yum来安装vsftpd

[root@localhost ~]# yum -y install vsftpd

加-y是因为出现提示默认直接按Y。这里yum安装的vsftpd版本应该是2.2.2的。

[root@localhost ~]# service vsftpd status  //查看状态,默认是关闭的        [root@localhost ~]# service vsftpd start    //开启vsftpd服务

2.设置为开机启动

[root@localhost ~]# chkconfig vsftpd on        

[root@localhost ~]# netstat -tl            //可以查看ftp端口是否在侦听了!

3.进行相关配置,配置修改在/etc/vsftpd/vsftpd.conf里面;

[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf

用vim对代码着色更容易修改。比vi要清楚。自己按照需求进行设置,请看下面的vsftpd.conf的相关配置说明。

4.设置vsftp的帐号。

普通的添加帐号的话,可以用该帐号登录服务器,使用nologin禁止FTP帐户登录服务器。

只需要执行命令:

[root@localhost ~]# useradd -d /usr/local/apache/htdocs -s /sbin/nologin 用户名 

添加上帐号指定好ftp帐号的根目录。例如下面的代码,创建ftp帐号ftpuser在网站的根目录htdocs下。

[root@localhost ~]# useradd -d /usr/local/apache/htdocs -s /sbin/nologin ftpuser

帐号设置好了,但是还没有给帐号加上密码。使用passwd给帐号设置密码。

[root@localhost ~]# passwd ftpuser        New password:        //输入密码        Retype new password:        //再次输入密码

输入好了就可以通过帐号密码来访问vsftpd了。

vsftpd.conf的相关配置说明:(下面这段摘抄自网络。)

1) 匿名服务器的连接

Anonymous_enable=yes (允许匿名登陆)

Dirmessage_enable=yes (切换目录时,显示目录下.message的内容)

Local_umask=022 (FTP上本地的文件权限,默认是077)

Connect_form_port_20=yes (启用FTP数据端口的数据连接)*

Xferlog_enable=yes (激活上传和下载的日志)

Xferlog_std_format=yes (使用标准的日志格式)

Ftpd_banner=XXXXX (欢迎信息)

Pam_service_name=vsftpd (验证方式)*

Listen=yes (独立的VSFTPD服务器)*

功能:只能连接FTP服务器,不能上传和下载

注:其中所有和日志欢迎信息相关连的都是可选项,打了星号的无论什么帐户都要添加,是属于FTP的基本选项

2)开启匿名FTP服务器上传权限(看看即可,一般不开启匿名上传权限)

Anon_upload_enable=yes (开放上传权限)

Anon_mkdir_write_enable=yes (可创建目录的同时可以在此目录中上传文件) 

Write_enable=yes (开放本地用户写的权限)

Anon_other_write_enable=yes (匿名帐号可以有删除的权限)

3)开启匿名服务器下载的权限

在配置文件中添加如下信息即可:

Anon_world_readable_only=no

注:要注意文件夹的属性,匿名帐户是其它(other)用户要开启它的读写执行的权限

(R)读,下载 (W)写,上传 (X)执行。如果不开FTP的目录都进不去

4)普通用户FTP服务器的连接

Local_enble=yes (本地帐户能够登陆)

Write_enable=no (本地帐户登陆后无权删除和修改文件)

功能:可以用本地帐户登陆vsftpd服务器,有下载上传的权限

注:在禁止匿名登陆的信息后匿名服务器照样可以登陆但不可以上传下载

5) 用户登陆限制进其它的目录,只能进它的主目录

设置所有的本地用户都执行chroot

Chroot_local_user=yes (本地所有帐户都只能在自家目录)

设置指定用户执行chroot

Chroot_list_enable=yes (文件中的名单可以调用) 

Chroot_list_file=/任意指定的路径/vsftpd.chroot_list

注意:vsftpd.chroot_list 是没有创建的需要自己添加,要想控制帐号就直接在文件中加帐号即可

6) 限制本地用户访问FTP

Userlist_enable=yes (用userlist来限制用户访问)

Userlist_deny=no (名单中的人不允许访问)

Userlist_file=/指定文件存放的路径/ (文件放置的路径)

注:开启userlist_enable=yes匿名帐号不能登陆

7)安全选项

Idle_session_timeout=600(秒) (用户会话空闲后10分钟)

Data_connection_timeout=120(秒) (将数据连接空闲2分钟断)

Accept_timeout=60(秒) (将客户端空闲1分钟后断)

Connect_timeout=60(秒) (中断1分钟后又重新连接)

Local_max_rate=50000(bite) (本地用户传输率50K)

Anon_max_rate=30000(bite) (匿名用户传输率30K)

Pasv_min_port=50000 (将客户端的数据连接端口改在

Pasv_max_port=60000 50000—60000之间)

Max_clients=200 (FTP的最大连接数)

Max_per_ip=4 (每IP的最大连接数) 

Listen_port=5555 (从5555端口进行数据连接)

8) 查看谁登陆了FTP,并杀死它的进程

ps –xf |grep ftp

kill 进程号

CentOS vsftpd多用户配置

1、安装vsftp,本文采用yum安装:

Yum  install  vsftpd

2、安装后运行:

service vsftpd restart

Shutting down vsftpd: OK ]

Starting vsftpdforvsftpd: OK ]

3、新增加系统用户:

#useradd -d /home/www.haojifang.cn -s /sbin/nologin haojifang.cn //增加新用户不让在本机登陆

#chown –R haojifang.cn /home/www.haojifang.cn //更改新增目录的权限,只允许haojifang.cn访问此目录;

#chmod 777 -R /home/www.haojifang.cn

passwd haojifang.cn //为用户设置密码;

Changing passwordforuser haojifang.cn.

New UNIX password:

BAD PASSWORD: it does not contain enough DIFFERENT characters

RetypenewUNIX password:

passwd: all authentication tokens updated successfully.

5、修改vsftpd.conf 禁止匿名帐号登陆及允许自建帐号登陆:

vi /etc/vsftpd/vsftpd.conf

anonymous_enable=NO

local_enable=YES

write_enable=YES

local_umask=022

dirmessage_enable=YES

xferlog_enable=YES

connect_from_port_20=YES

xferlog_std_format=YES

chroot_list_enable=YES

chroot_list_file=/etc/vsftpd/chroot_list

listen=YES

pam_service_name=vsftpd

userlist_enable=YES

tcp_wrappers=YES

4、修改/etc/vsftpd/chroot_list 添加haojifang.cn 帐号允许该帐号登陆FTP服务器
5、在linux Shell 命令模式下

#setsebool ftpd_disable_trans // 关闭掉Selinux ftp服务的保护;

#vi /etc/selinux/config

SELINUX=disabled//将此处设置为Disable

SELINUXTYPE= type of policy in use. Possible values are:

targeted – Only targeted network daemons are protected.

strict – Full SELinux protection.

SELINUXTYPE=targeted

重启服务

service vsftpd restart

Shutting down vsftpd: OK ]

Starting vsftpdforvsftpd: OK ]

 

转自:http://blog.sina.com.cn/s/blog_6aa178410101dvlj.html

phpmyadmin初始化配置短句密码以及未开启高级功能的解决方法

一、在登录phpmyadmin管理数据库,会出现“配置文件现在需要一个短语密码”的警告,这个也不必太理会

解决方法:
打开目录phpmyadmin/libraries中的config.default.php文件
查找下面这行:$cfg['blowfish_secret'],按下面方法修改:

1
$cfg['blowfish_secret'] = '这里就是需要的短语密码';  /* 短语密码请随意填写 */
另外修改phpmyadmin/根目录下的config.sample.inc.php文件语句和上面相同

原因:会出现这个问题,就是因为这段:$cfg['Servers'][$i]['auth_type'] = ‘cookie'

这里有四个值可供填写:cookie http HTTP config

config方式即输入phpmyadmin的访问网址即可直接进入,无需输入用户名和密码,是不安全的,不推荐使用。
cookie,http或HTTP时,登录phpmyadmin需要数据用户名和密码进行验证,
具体如下:PHP安装模式为Apache,可以使用http和cookie;PHP安装模式为CGI,可以使用cookie
通常这个值设置为cookie即可。
二、phpMyAdmin 高级功能未全部设置,部分功能不可用。

原因请先看官方的详细说明:

若要使用一些高级功能 (如: 书签、注释、SQL 查询历史、结构追踪、生成 PDF 、内容转换等),你需要创建一些特殊的数据表。这些表可以放在你自己的数据库里,也可以在一个多用户的服务器上创建一个独立的数据库 (这个数据库将通过其对应的帐号访问,所以不应该给其他用户访问这个数据库的权限)。

Please look at your ./examples/ directory, where you should find a file called create_tables.sql. (If you are using a Windows server, pay special attention to FAQ 1.23).

If you already had this infrastructure and upgraded to MySQL 4.1.2 or newer, please use ./examples/upgrade_tables_mysql_4_1_2+.sql and then create new tables by importing ./examples/create_tables.sql.

你可以使用 phpMyAdmin 来创建这些数据表。但请注意,你可能需要特殊 (管理员) 权限来创建数据库和数据表,而且可能还需要根据实际所使用的数据修改这个脚本中数据库的名字。

After having imported the ./examples/create_tables.sql file, you should specify the table names in your ./config.inc.php file. The directives used for that can be found in the Configuration section. You will also need to have a controluser with the proper rights to those tables (see section Using authentication modes below).

说明这些功能是不必须的,可以不理会,一定要做按下面步骤来,已经为你翻译了
解决方法:
1、在mysql中创建名为phpmyadmin的数据库。
2、将phpmyadmin安装目录下的examples/create_tables.sql导入这个数据库。
3、修改libraries中的config.default.php文件,内容如下(查找关键词并修改):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$cfg['Servers'][$i]['controluser'] = 'username';  /* 数据库用户名 */
$cfg['Servers'][$i]['controlpass'] = 'password';  /* 数据库密码 */
$cfg['Servers'][$i]['pmadb'] = 'phpmyadmin';
$cfg['Servers'][$i]['bookmarktable'] = 'pma_bookmark';
$cfg['Servers'][$i]['relation'] = 'pma_relation';
$cfg['Servers'][$i]['table_info'] = 'pma_table_info';
$cfg['Servers'][$i]['table_coords'] = 'pma_table_coords';
$cfg['Servers'][$i]['pdf_pages'] = 'pma_pdf_pages';
$cfg['Servers'][$i]['column_info'] = 'pma_column_info';
$cfg['Servers'][$i]['history'] = 'pma_history';
$cfg['Servers'][$i]['designer_coords'] = 'pma_designer_coords';
$cfg['Servers'][$i]['recent'] = 'pma_recent';
$cfg['Servers'][$i]['table_uiprefs'] = 'pma_table_uiprefs';
$cfg['Servers'][$i]['tracking'] = 'pma_tracking';
$cfg['Servers'][$i]['userconfig'] = 'pma_userconfig';

保存上传到服务器,重新登录phpMyAdmin,搞定收工。

win7下安装svn服务器端及客户端详细步骤

1.下载服务器端Setup-Subversion-1.6.16.msi,由于我是32位的系统所以选择Windows列表下的Win32Svn (32-bit client, server and bindings, MSI and ZIPs; maintained by David Darj)
2.安装服务器端,安装路径可以自己改,我的安装路径是F:/Software/Subversion
3.下载客户端TortoiseSVN-1.6.15.21042-win32-svn-1.6.16.msi,并下载对应版本的语言包LanguagePack_1.6.15.21042-win32-zh_CN.msi

 

4.安装客户端,安装路径也可以自己改,我的安装路径是F:/Software/TortoiseSVN
5.安装版本控制库,路径自己定,我的做法是在D盘上新建一个svn文件夹,双击打开它,然后在里面点击右键,[TotoiseSVN]->[Create Repository here]进行创建,版本库模式指定为默认的即可。Repository创建完毕后会在目录下生成若干个文件和文件夹,conf目录是用来设置管理的目录;db目录就是所有版本控制的数据文件;hooks目录放置hook脚本文件的目录;locks用来放置Subversion文件库锁定数据的目录, 用来追踪存取文件库的客户端;format文件是一个文本文件,里面只放了一个整数,表示当前文件库配置的版本号。
(本步骤也可以用命令行来完成:svnadmin create F:/svn/repository)
6.设置版本控制库权限,打开/conf/目录,打开svnserve.conf找到一下两句:
# [general]
# password-db = passwd
去之每行开头的#,其中第二行是指定身份验证的文件名,即passwd文件
同样打开passwd文件,将
# [users]
# harry = harryssecret
# sally = sallyssecret
将# [users]开头#字符去掉,这是设置用户,一行一个,存储格式为“用户名 = 密码”,如可插入一行:wang=123,即为系统添加一个用户名为wang,密码为123的用户
7.启动服务器端并将svn设为系统服务,由于win7的安全权限问题,安装系统服务时会出现“[sc] openSCManager 失败 5 拒绝 ”错误。
解决方案:
win+R 输入cmd  在输入以下

sc create svnser binPath= "F:/Software/Subversion/bin/svnserve.exe --service --root D:/svn"

回车;(注:“=”前不得有空格,后必须有空格。 svnser为自定义的服务名称)

不提示错误即为成功。

 

8、启动后在计算机->管理->服务和应用程序->服务->找到svnser,右键属性找到启动类型改为自动,这样每次开机它都会自动运行了)
9.访问svn,在桌面上点右键[TotoiseSVN]->[Repo-browser]在地址栏里输入svn://localhost/,这样就可以访问svn了,到这里也就完成了本地svn服务器端和客户端的安装。