Author Archives: wkii

NGINX多层转发或使用CDN之后如何获取用户真实IP

##1.背景知识 1.1. 前提知识点: 关键词:ngx_http_realip_module,HAProxy,反向代理,出口IP 还有nginx中的几个变量: remote_addr 代表客户端的IP,但它的值不是由客户端提供的,而是服务端根据客户端的ip指定的,当你的浏览器访问某个网站时,假设中间没有任何代理,那么网站的web服务器(Nginx,Apache等)就会把remote_addr设为你的机器IP,如果你用了某个代理,那么你的浏览器会先访问这个代理,然后再由这个代理转发到网站,这样web服务器就会把remote_addr设为这台代理机器的IP,除非代理将你的IP附在请求header中一起转交给web服务器。 X-Forwarded-For(简称XFF) X-Forwarded-For 是一个 HTTP 扩展头部。HTTP/1.1(RFC 2616)协议并没有对它的定义,它最开始是由 Squid 这个缓存代理软件引入,用来表示 HTTP 请求端真实 IP。如今它已经成为事实上的标准,被各大 HTTP 代理、负载均衡等转发服务广泛使用,并被写入 RFC 7239(Forwarded HTTP Extension)标准之中。 XFF的格式为: X-Forwarded-For: client, proxy1, proxy2 XFF 的内容由「英文逗号 + 空格」隔开的多个部分组成,最开始的是离服务端最远的设备 IP,然后是每一级代理设备的 IP。(注意:如果未经严格处理,可以被伪造) 如果一个 HTTP 请求到达服务器之前,经过了三个代理 Proxy1、Proxy2、Proxy3,IP 分别为 … Continue reading

Posted in Web Server | Tagged , , , | Leave a comment

composer安装包时报any version for your minimum-stability (stable)

今天要装一个包endroid/qrcode,可是死活装不上。 composer require 安装的时候一直报 [InvalidArgumentException] Could not find package endroid/qrcode at any version for your minimum-stability (stable). Check the pac kage spelling or your minimum-stability 然后新composer init一个空项目就能装上了。然后开始分析我的现有项目的composer.json文件。 最后发现是之前使用了国内的composer镜像,加上了一个配置 { “repositories”: [ { “packagist”: false }, { “type”: “composer”, “url”: “http://packagist.phpcomposer.com” … Continue reading

Posted in PHP & MYSQL | Tagged | Leave a comment

禁用chrome firefox 的 WebRTC功能防止真实IP泄漏

无论是使用VPN还是其它代理方式,很多时候我们不希望暴露自己的真实IP,且一直以来我们认为VPN是安全的,所有流量都会走VPN。 但最近暴露出一个WebRTC特性,会暴露我们的真实IP。适用浏览器:chrome,firefox. safari则没有问题。 只需要一段js代码就可以获取我们的真实IP。一旦被想时时监控别人的人知道并使用此方法钓鱼,便可直接获得原始IP。这简直太恐怖了。 看来以后如果重装系统,第一件事儿把cnnic证书删除后,第二件事儿就是禁用WebRTC. 有一个插件可以方便的禁用WebRTC, 插件下载 Firefox可在浏览器上输入:about:config。之后搜索:media.peerconnection.enabled。找到它后双击,将其改成 false 即可。 原理可以参考一下这里:https://github.com/diafygi/webrtc-ips 或者直接把下面这段代码放在chrome的console里运行一下,就知道自己的真实IP了。 //get the IP addresses associated with an account function getIPs(callback){ var ip_dups = {}; //compatibility for firefox and chrome var RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection; var … Continue reading

Posted in 互联网络 | 2 Comments

无聊的长城

我TM一个技术博客你没事儿老封我干吗啊。防民之口到这个地步。。。 如果你是一个东德边防士兵,发现有人逃往西德,你可能因职责必须要开枪,但如果你有良心,那就将枪口抬高一寸。

Posted in 互联网络 | 4 Comments

python学习笔记之字符串

字符串格式化: format = “hello %s, %s enough for ya?” values = (‘world’,’hot’) print format % values 结果:hello world, hot enough for ya? 注:如果不是在命令行执行,把print后面的用括号括起来 与php类似但函数或方法名不一样的地方: php explode=> python split php trim => python strip php implode => python join

Posted in python | 1 Comment

python学习笔记之字典

字典是最与php的数组相似的序列结构。python的列表只能是以索引数字开头并且顺序递增的序列。字典则可以是以字母为key的序列。 元组一般用圆括号来表示,如(1,2,3) 列表一般用方括号来表示,如[1,2,3] 而字典(dict)则用大括号来表示,如{‘a’:1,’b’:2,’c’:3} 与php不同,php的key,value是用key=>value来表示,python而是用冒号“:”来分隔。 字典可以使用大括号书写键和值或使用dict函数来创建。 dict函数可以指定两个元组或列表来对应创建字典。如: items = [(‘name’,’gumby’),(‘age’,’42’)] d = dict(items) 与列表的区别: k in d(d为字典),查找的是键,而非value,表达式 v in l(l为列表)则用来查找值,而不是索引。 一些字典方法: clear 清除字典。“原地操作”,不会返回值,类似于列表的sort方法 copy方法返回一个相同键值对儿的新字典。浅复制。因为值本身就是相同的,而不是副本。 在副本中替换值的时候,原始字典不受影响。但是如果修改了某个值,原始字典也会改变。避免这个问题的一种方法就是使用深度复制(deep copy)。 from copy import deepcopy deepcopy(d) d.fromkes方法使用给定的值创建新字典。每个键默认对应的是None get方法获取一个不存在的键时,不会报错,会返回None has_key方法相法于表达式k in d items方法将所有的字母项以列表的方式返回。这些列表中的每一项都来自于(键,值)。但是项在返回时没有特殊的顺序。 iteritmes的方法大致相同,但是会返回一个迭代器对象而不是列表。在很多情况下iteritems效率更高。迭代器,相当于decode json之后的对象,而非数组、 keys方法将字典中的键以列表的形式返回。而iterkeys则返回针对键的迭代器。 … Continue reading

Posted in python | Leave a comment

python学习笔记之列表和元组

列表和元组的主要区别在于,列表可以修改,而元组不可以修改。也就是说,如果要根据要求来添加元素,那么列表可能会更好用。序列不能修改的时候,使用元组更合适。 序列 索引:索引就是php数组的键值。从0开始。 分片:php的slice,如果number[3:9] 注意,截取的值是从第4个索引开始。 步长:分片的每次操作的步进长度。不可以是0,要以是负数,即从后往前数。 序列相加:使用+号进行序列的连接操作 两种相同类型的序列才能相加。 用一个数字x乘以一个序列会生成一个新的序列,原来的序列会被重复x次。 None是一个python的内建值,它的确切含义是“什么也没有”,有的语言用null。 成员资格:使用in可以检查一个字符串是否存在一个列表或字符串中。 len可以检查列表或字符串的长度。php使用str_len和count来检查。 list函数,根据字符串来创建列表。如list(‘hello’) 注意:不能为列表一个位置不存在的元素进行赋值 append方法用于在列表末尾追加新的对象。 count方法统计某个元素在列表中出现的次数,如x.count(1) extend方法可以在列表的末尾追加另一个序列中的多个值。 index方法从列表中找出某个值第一个匹配项的索引位置。 insert方法用于将对象插入到列表中。 pop方法从列表中移除数据,默认是最后一个。 remove方法用于移除列表中某个值的第一个匹配项。pop是操作key,remove是操作value reverse将列表中的元素反向存放。 sort方法排序列表中的元素。 sort方法排序后并不会返回列表。所以要得到一个排序的列表要先将x赋值给y,再对y排序。 sort高级排序提供两个参数,第一个参数是必须指定一个函数在排序过程中使用,第二个是正序倒序的bool值 元组 元组与列表一样,也是一种序列。唯一不同的是元组不能修改。 元组大部分时候是通过圆括号括起来的。如(1,2,3),序列则是通过方括号括起来的。 如果要实现只包括一个值的元组,也必须加一个逗号,如(23,) tuple函数:以一个序列做为参数并把它转换为元组。 元组的分片还是元组。就像列表的分片还是列表一样。

Posted in python | Leave a comment

Php Aes加密类

今天写了一个php的AES加密类。适用于Yii的扩展。 如果不用在Yii框架中,把代码中Yii::app()->params[‘encryptKey’] 换成你对应的默认key就可以了。 代码见github: https://github.com/wkii/utils/blob/master/Yii/extensions/PhpAes.php  

Posted in PHP & MYSQL | Tagged | Leave a comment

php生成excel列名,超过26列大于Z的方法

这是phpExcel类中的方法。今天查到了,记录一下备忘。 public static function stringFromColumnIndex($pColumnIndex = 0) { // Using a lookup cache adds a slight memory overhead, but boosts speed // caching using a static within the method is faster than a class static, // though it’s additional memory … Continue reading

Posted in PHP & MYSQL | Tagged , | 2 Comments

Yii deleteByAttributs 用法,慎用Dao的delete

Yii框架一定要慎用Dao的delete,一不小心它生不成条件的话,就变成了整表删除。 可以用ActiveRecord的deleteByAttributes或deleteAll方法相对不容易写错。 deleteByAttributes用法如下: MyClass::model()->deleteAllByAttributes(array( ‘phone_number’=>$phoneNumber, )); 或者第一个参数为空,使用第二个条件参数 MyClass::model()->deleteAllByAttributes(array(),’`phone_number` = :phone_number’,array( ‘:phone_number’=>$phoneNumber, )); 或者使用deleteAll(): MyClass::model()->deleteAll(‘`phone_number` = :phone_number’,array( ‘:phone_number’=>$phoneNumber, )); 再来一个带in条件的 $condition = new CDbCriteria(); $condition->addCondition(‘status=:status’); $condition->params = array(‘:status’=>1); $condition->addInCondition(‘user_id’,array(100111,100221,100221)); User::model()->deleteAll($condition); Dao带in条件的示例 Yii::app()->db->createCommand() ->delete(‘mw_user’, array(‘and’, ‘user_id=:user_id’, array(‘in’, ‘position_id’, array(1,2,3))),array(‘:user_id’=>121111)); 但是请慎用DAO的delete,当你的条件写错一点,它将无法生成where条件,同时sql语句中也没有了where,但还不一定报错,结果就成了没有where的delete,结果会是整表被删除了。

Posted in PHP & MYSQL | Tagged | Leave a comment