使用php调用oracle数据库的几篇参考文章

经过和ci框架自带oci8 driver的多次挣扎,果断放弃了自带类(但是项目中有个恶心的牺牲点,这里就不恶心大家了..以后有空了我会回来改的….).找到几篇php调用oracle存储过程的参考文章,并且根据这几篇文章中提到的提示,成功解决了项目中的问题,特此马克一下文章地址,方便以后学习整理.

 

1. oracle中文官网的这篇文章范例还是很详尽的,但是部分oci_方法已经在php5之后做了些许修改,因此建议再查找php的官方手册进行对比学习

http://www.oracle.com/technetwork/cn/articles/fuecks-sps-082839-zhs.html

 

2.Call Oracle (oci8) store procedure from Codeigniter 国外被墙blog里面的一篇讲解通过pdo_oci8去使用oracle存储过程的详细说明

http://manasbala.wordpress.com/2012/03/20/call-oracle-oci8-store-procedure-from-codeigniter/

 

3.php官方权威手册的oci8操作指南,不得不说,这块冷门资料官方的example还是依旧非常详细.

http://www.php.net/manual/en/ref.oci8.php

 

Read More

小记Centos6.2 U盘安装(UltraISO刻录)时偶遇的小问题

今天有童鞋在服务器CDROM坏掉之后,果断采用了U盘的方式安装centos. 

开了ultraISO把iso文件刻录到U盘之后. 插到服务器上轻车熟路地开始了引导. 进入install之后,内核加载完毕进行boot载入时出现如下错误:

panic ocucurred.

Warning: No root device "live:/dev/disk/by-label/Centos-6.2-x86_64-LiveCD" found.

之后发现是脑残的ultraiso在刻录文件之后写U盘的卷标时自动截断,把卷标变成了CentOS-6.2-从而造成此问题.

修改卷标为 Centos-6.2-x86_64-LiveCD 此问题解决.

Read More

PAMIE(winGuiAuto)中模拟点击浏览器alert弹窗的方法

     handle = winGuiAuto.findTopWindow(u'来自网页的消息')
     if handle: 
         try:
             control_list = winGuiAuto.dumpWindow(handle)
             print(control_list)

             if control_list[2][1] == u'验证码不正确!!':
                 #winGuiAuto.findControl(handle)
                 winGuiAuto.clickButton(winGuiAuto.findControl(handle, 'Button', u'确定'))

上面这段代码在win8之前都可以完美运行,但是经过在ie10(win8)上实际使用却出了问题,无法给窗体发送click消息.

追查winGuiAuto.py的源码,查找clickButton为:

def clickButton(hwnd):
    '''Simulates a single mouse click on a button

    Arguments:
    hwnd    Window handle of the required button.

    Usage example:  okButton = findControl(fontDialog,
                                           wantedClass="Button",
                                           wantedText="OK")
                    clickButton(okButton)
    '''
    _sendNotifyMessage(hwnd, win32con.BN_CLICKED)

 

到调用win32gui包发送message看上去一切都很顺理成章

def _sendNotifyMessage(hwnd, nofifyMessage):
    '''Send a notify message to a control.'''
    win32gui.SendMessage(win32gui.GetParent(hwnd),
                         win32con.WM_COMMAND,
                         _buildWinLong(nofifyMessage,
                                       win32api.GetWindowLong(hwnd,
                                                              win32con.GWL_ID)),
                         hwnd)

后来google了win32编程一些文章看了也没发现个所以然,迫于考试压力只好不甘心地先终止掉了.换了一种脑残方案曲线救国实现效果.如有知情人士知道为什么ie10(win8)不支持这里发送的BN_CLICKED事件,还望指教.

ps:初步估计是因为我用的winGuiAuto win32.con是外国佬非官方改造的for py3.3的修改版,里面肯定有bug,导致了这个模拟点击的不可用. 看来py3还有好长的路要走,现在还是老实地回到2时代吧 哈哈.

 

 

 

曲线救国方案:

实现弹出alert的确认(其实就是发送回车键)

    print(ie._docGetReadyState) #利用pamie检查area的方法实现页面加载完成后才触发后面的语句
    win32gui.PostMessage(winGuiAuto.findControl(handle), win32con.WM_KEYDOWN, win32con.VK_RETURN, 0) #给alert窗口发送回车确认事件
    win32gui.PostMessage(winGuiAuto.findControl(handle), win32con.WM_KEYUP, win32con.VK_RETURN, 0)

注:发送任何按键操作都要发DOWN和UP两个指令.这个会win编程的都懂原因的,不再赘述.

Read More

支持Python3.3的winGuiAuto.py源码下载,修复其中自带的bug

如果你在运用时候出现了类似下面的bug提示的话,这个是因为源码本身有个小bug,此处提供的下载包已解决此问题.

同时,已经完美支持python3以上版本使用

winGuiAuto.WinGuiAutoError: No control found for topHwnd=531944, wantedText=’Button’, wantedClass=None, selectionFunction=None

如有其它问题可以留言互动.

winGuiAuto.tar

Read More

python3开始不支持urllib.quote()

python3之后urllib.quote()这个转换字符串str类型为url编码的方法已经不能用了,

现在由 urllib.parse.quote(str)代替.

解码则用 urllib.parse.unquote(str)

 

因为urllib.parse.urlencode只能编码对象格式的数据,对于字符串类型数据需要编码就得使用quote了.

 

ps文件开头必须引入 import urllib.parse 这个包后才可以使用.

Read More

浅浅浅谈一点点最基础的php安全知识

1.永远不要相信来自用户的任何数据!
       不要相信使用你产品的用户都是各种小白,更何况,即使是小白都有可能在不经意间提交了不正常的数据导致此次甚至于整个系统的崩溃.严格处理数据的验证,严格控制数据流,是任何web后端语言都必须做到的事情.同时,很重要的一点别把系统的安全验证都交给前端工程师,正确的做法是前端和后台都要做相应的验证! 说到这里笔者不经意又想起来一号店的支付bug给笔者带来了无数次的方便,这个bug就和此类问题有关.
       所以说,虽然这一点是一个老生常谈的话题了,但是很多程序员在自己的程序中总能出现这类问题,所以这里又将他放在了第一点,重点给还未加入php 或 刚步入php学习的童鞋们一个提醒.

那么此问题到底有什么具体的措施可以防范的呢? 答案也很简单,为了确保安全性和健壮性,数据验证时应该主要从以下四点方面进行着手:
       (1) 关键数据是否存在。如删除数据id是否存在

       (2) 数据类型是否正确。如删除数据id是否是整数

       (3) 数据长度。如字段是char(10)类型则要strlen判断数据长度

       (4) 数据是否有危险字符

        在针对以上问题进行处理时,对于数据的可通过性,我们常考虑使用黑名单阻拦(Black-listed value forbidden)或白名单通过(White-listed value passed)两种方式进行处理.两者之间的区别是:通常在进行验证数据时,可能值的列表或范围小于无效值的列表或范围,其中许多值可能是未知值或意外值.
        其实对于上面说到的两种验证数据的常用方式,不过是几个判断或者几个分支语句的运用,这个几乎是没有任何技术门槛的问题,主要还是作为开发者的安全意识问题.这里就不累赘地举各种低端的没意思的代码实例了.
        然后,最后建议是安全数据过滤在开发时同步进行考虑,不要等业务逻辑都完成之后再单独考虑安全过滤等问题,此时再介入考虑可能会带来更多潜在的问题.虽然笔者只是90后,但是接触php的时间也比较早,初中的时候由asp转型到php后也做了不少大中小型的php应用接触了各种开发框架,经过尝试各种解决php数据安全验证的方式,笔者认为这种方式是最佳的了.

接下来再举几个关于数据安全方面的重点:


(1) 入库数据必须要进行严格的验证.
       所有$_POST/$_GET/$_REQUEST/$_SERVER等都不可以直接丢给类函数(当然,除了验证或过滤类),即使是使用框架,或框架内自带了对于post和get的自动过滤功能,也建议你把他关掉然后通过自己来处理每个post和get.因为框架内把每次的post和get都进行重复的过滤,在效率上本身就很有问题,只是提供给某些低端phper的一种方案不建议大家使用!

       其次,对于我后面说到的$_REQUEST/$_SERVER可能有很多童鞋会觉得奇怪,特别是对$_SERVER,有人会说,这个都是服务器的变量了为什么还有可能不安全呢? 我可以明确告诉你,这个变量里面也可以轻易伪造,具体方式不细说,可以自行google. 同样,还有其他$_开头的php内置变量数组里面取到的数据都有可能被篡改,大家务必小心!


(2) 前端验证之后后台同样要验证!
        select,checkbox,radio,button等等用户不能直接输入的地方传值的验证经常会被忽略,但实际上,这些地方也是最好动手脚的,伪造一个表单value,妥妥的.

(3)  表单元素的name和数据库字段名务必差异化
        比如表单上的name是 username ,那么数据库里面的字段名就不可取 username . 但实践中,绝大部分低端phper们都是取一样的值,这无疑是主动给别人暴库也没什么差别了. 隐患虽小,但是引爆点很大!!

 

 

2.防注入


(a) 简单的判断是否存在注入漏洞?


访问某网址 http://www.xxxx.com/test.php?id=1 是正常展示了某页面,sql语句可以猜测大致如此:

SELECT  *  FROM table WHERE id = 1 

接着访问 http://www.xxxxx.com/test.php?id=1’ sql语句可能是:

SELECT * FROM table WHERE id = 1’

然后访问页面出现异常错误信息或页面空白的话,说明了test.php 文件没有对id的值进行“  ’”(上单引号) 过滤或者id的intval()进行整形转换,当然,接着你还可以用软件进行穷举其他字符如“%”,“/*”等。

继续访问 http://www.xxxx.com/test.php?id=1 and 1=1  则sql语句可能是

SELECT  *  FROM table WHERE id = 1 and 1=1

运行正常且结果和 http://www.xxxx.com/test.php?id=1 结果一样,则说明test.php可能没有对空格“ ”、和“and”过滤,接下来访问 http://www.xxxx.com/win.php?id=1 and 1=2  则sql语句可能是

SELECT  *  FROM table WHERE id = 1 and 1=2

如果运行结果异常说明sql语句中“and 1=2”起作用,所以能3个条件都满足都则很确定的test.php存在注入漏洞。

 

(b)最基础的防注入方式

      最简单的方法是使用php自带的两个自动转义函数 addslashes 和 stripslashes ,(其实htmlspecailchars被有人错误地拿来使用在防止注入问题上了,实际上他是最基础的解决xss的函数.请勿搞混.)

      addslashes是可以给传入数据中遇到的特殊字符进行自动转义,加上"\".stripsplashes函数相反他是把转义后的数据再还原回来的反转义函数.

      然后在这里有一个需要注意的,就是需要判断是否服务器上开启了 magic_quotes_gpc 如果他是on状态则不能再重复进行addsplashes,否则就会加上两个"\"之后就把数据搞乱了. 建议使用之前通过get_magic_quotes_gpc()函数检查是否开启本功能.

 

 

3.php安全配置方面的一些小细节


(a) 关闭php.ini 文件中的 display_errors ; 在生产环境中保证即使php代码出现错误,也不会把错误信息返回给用户,这样就不会让他们获取到服务器上的一些信息.保证了一定程度上的安全.或者在php文件头部加上 error_reporting(0);
(b) 关闭默认php配置中的不好的功能
php.ini中,设置 magic_quotes_gpc = off;
设置 register_globals = off; 保证如果程序中有未被初始化的变量不会被篡改,否则会造成致命的安全问题!
(c) 严格配置文件夹和文件权限,能用644就不用755,能用755就不用777!

Read More

[在家园的知识分享]到底什么是互联网运营?

       今天参加了一次关于运营的分享会,不论是从活动话题的讨论点还是活动形式上看都展现了独到的风格,向听讲者传递了很多当下较为前端的互联网产品的运营理念和思路,并且从需求分析上做了详细的案例讲解. 看到了诸位童鞋对互联网知识对互联网产品的那份热情,现在便借此次分享会的提点,想向大家分享一些互联网运营大概念的基础知识,并会结合家园论坛的运营发展风格进行我们个性化的分析. 希望藉此抛砖引玉,从提供一些基础知识和技能的角度,激发大家对互联网的探索对互联网产品运营的探索,都来关注到如何研发、运营、推广我们自己的产品,共同打造一个具有杭电特色的具有价值的平台

说了这么多,到底什么是互联网产品运营?
在家园的很多发展时期,产品运营究竟是干什么的,这个概念也模糊不清,缺乏一个标准定义。有时候跟客服混淆在一起,有时候跟推广混淆在一起,有时候跟编辑混淆在一起。即便声称“运营很重要”的人,也未必能解释这一点。基本上运营工作就是个跟内容,跟用户打交道的大杂烩。
纵观整个互联网业内的运营人员,大部分被称作“论坛(社区)管理员”或者“活动策划”或“网络编辑(小编)”,小部分被称作“内容审核员”,听上去都不是高级岗位。但实际上,他却在整个互联网产品的发展过程中占据着最为重要的角色。如果说一个互联网产品是一家大超市,超市的货架的装配、内部的装修甚至是整个超市框架的设计搭建等等都可以归于是技术类人员的工作,那么运营人员就是计划怎么进货,怎么安排好所有货物的安放位置并且对今后超市所有的销售情况和业务调整具有唯一说话权的一群人,他们是距离超市的客户最近的一群人。

如果对运营工作做一个总结的话,那么他是······

1、BBS或者说是论坛(但实际上bbs是Bulletin Board System 电子公告板 的缩写),基本上是内容型的产品,受到“趋同扩散”法则的影响。因此必须得建立内容标准,什么样的内容是好的,被提倡的;什么样的内容是不好的,不受欢迎的。
建立标准有两个手段:
首先是审核,将不适当的内容和申请给剔除出去;
其次是推荐,利用加精、置顶、推荐位更新、专题制作等方式,让好的内容增加曝光率,在鼓励作者的同时也传播了内容价值观。

与传统编辑工作不同的是,运营人员追求的并非流量,而是内容价值观的普及,通过内容价值观来筛选用户群,再引导用户群 去自发维护适当的内容氛围。
如果没有运营工作,内容就会泥沙俱下,劣质的内容驱逐优质的用户,目标用户难以在这里找到归属感,广告垃圾泛滥,使产品失去控制。

番外:
也有人曾经问我,版主不就是干这事情的吗,为什么还需要专职的运营人员?
这问题解释起来比较复杂。首先,版主也是需要发掘和管理的,干这事儿的通常是专职运营人员。其次,只有在一个成熟的社区,版主才能获取足够的成就感,他的投入才是值得的。这其实就是一个先有鸡还是先有蛋的悖论问题了,但针对互联网产品运营,答案是,先由专职运营人员将社区推向成熟,创造一个更具价值的内容发布平台,自己拥有的足够多了才有能力去做分享,将平台价值分享给第三方的潜在可能的版主或者超级版主,再将管理职责逐步下放给版主和超级版主,他们会积极主动地共享更多的价值内容给我们的平台,从而平台价值得到丰盈,丰盈的平台价值又反哺平台用户进而又创造出更多潜在价值的用户或是版主,形成良好的循环体系。
除此之外,对于内容公共中心的主题和人群细分(比如开版),使阅读和讨论更有针对性,也是另一项技术含量非常高的内容建设任务。

2、运营人员应该掌握的用户维护的能力。
用户维护是平台技术建成之后,运营人怎么保证平台的所有用户能够持久地、依赖地、无私地为你的产品发展而奉献价值数据。直白的说,就是怎么样保证当前用户不流失的同时还能吸引更多的用户。“用户维护”的概念是来自于产品营销学中的一个内容,相信专业课有营销学内容的童鞋应该上课老师会有讲过?因为不是本专业的人,也没能有更多专业性的理解和分析了,就说一说我对在互联网产品行业的用户维护的一些观点。
用户维护对于我们现有的单一的论坛来说,简单的划分为老用户和新用户两块,这两块看似冲突却其实道理统一。
我们的新用户是每年杭电招生录取的所有本科、硕士新生,我们的老用户是所有大二、大三、大四以及所有毕业出去但帐户未注销的人。这批用户的复杂度足以让人感到头疼(其中的故事相信大三大四的童鞋会懂的。。),但实际上如果能抓住以下几块共同点出发,去做好用户工作,很多问题可就此避免。

一是建立和完善新生帮助内容,让新人三分钟速成学会使用常用功能;
二是发布内容更加友好的公告(新产品、功能发布;故障恢复;活动通知等等······);
三是解决用户的投诉和困难,尤其与高端精华用户保持密切联系,为他们提供更好的人工服务;
四是主动邀请有价值的用户前来尝试新产品;
五是某些强调等级权限的高级功能(譬如上传),要形成曲线形递增,不能造成高级用户功能权限过高出现浪费;初级用户权限过低无法正常使用(挫伤新用户积极性);
六是调节用户群的矛盾,裁决争议,调和氛围;
七是对某些新推出的产品或功能,用户维护就包括引导用户了解新品特性,让他们快速适应并融入其中,关注用户反馈并及时反馈给技术类部门进行解决。

相比起内容建设来说,用户维护的工作通常琐碎,很难作量化的评估,也就很容易被低估。但如果我们换一个宏大的说法:用户维护,即用户群与产品之间的情绪管理,即这款产品的公共关系管理,这其实更接近本质。以“管理员”虚拟角色直接面对用户的运营人员,在某种意义上代言了产品形象并与用户对话,他们面向高端用户或群体用户提供的客户服务,资源投入低而情感附加值高,能够非常有效地提高用户的忠诚度和产品品牌形象。

3、产品(论坛)活动的组织
这里将活动组织的头衔上升到产品活动组织而不单一性指向论坛活动组织,此中的更多含义和内容会在今后的过程中慢慢向各位解释和剖析,最先知道了解的应该是总监层的各位童鞋。
那么说到产品活动一般情况下有三种:
一种是内容导向型,引导用户产出符合要求的内容,借此传播产品的内容价值观。例如各种校内社团活动和各类思政宣传任务。
一种是社交群体导向型,通过带动用户直接或间接的关系互动来推动社区内各用户群的关系的扩展,活跃社交氛围。例如论坛内部的小社交圈的形成(比较可惜的是目前仅有小小游泳池一个案例)
一种是产品导向型,通过大众化的参与来普及产品特性,加强我们的固有品牌(红色家园or家园论坛),通过用户参与活动来让他们熟悉或使用某项功能产品。例如许愿板 阳光乐跑查询等拓展。

但是,不论哪一种活动,都需要方案策划,页面排版设计,组织实施。都需要专业的运营人员来操作。所谓“专业”,不是指他点子多,点子鬼,而是指他非常了解自己的产品,非常了解自己的用户,能结合产品特点和用户特点去策划组织活动,能控制好活动的氛围和节奏,最终为产品带来预计的促进效果。

4、最好的产品运营人员也一定是个不错的产品设计师。
可能不论技术PM怎么叫嚷着要“从用户需求出发”设计产品,也无法回避这么一个事实:只有接近用户的人才能了解用户。
那么,谁最接近用户?
答案显然是:产品运营人员。
只有成天跟用户打交道的他们,才最了解用户的感受。因此运营人员同时也承担了一部分,甚至是大部分的用户研究的职责。他们需要既理解用户的需求,又理解产品的结构,站在这样一个立场上,能够为新产品的策划带来非常大的帮助,提升产品设计上的可靠性。所以我们的运营人员也应更多更积极地参与到新产品的策划和设计当中,不是理所当然地认为产品的开发设计都只是技术类部门的工作,自己不能参与。反而你们才是产品需求设计中最有说话权利的人。

总结:此篇作为“领进门”系列的首篇内容,参考学习了互联网各位大牛的经验文章、家园各位前辈的分享和交流、家园现任各副站的体验,旨在帮助各位新同学尽早学习和熟悉到互联网行业内的相关基础知识和经验,引发大家更多对互联网的思考交流和学习。由于编排时间较短和个人知识系统的缺漏,难免会给本文带来不少影响,还望各位批评斧正,一起完善更多属于家园自己的互联网产品运营资料,共建未来即将启用的家园wiki平台。

Read More

一个chrome下的超级奇怪的服务器问题??和反向代理有关?

记录这个日志都不知道是放到server分类里面还是程序bug分类……..今天再调整服务器架构之后出现了这样一种异常的情况实在是百思不得其解

记录一下,某日有大神的时候可以请教一下…现在已经累到无力去抓包分析什么的了.都是浮云

 

 

服务器调整完架构之后,最前端实现nginx动静分离,将fastcgi和nginx分离,两台fastcgi在nginx后面

然后我自己的chrome测试下偶尔发现,停留在一个页面超过一定时间之后(放在那边一会儿不去操作这个页面),再点击这个页面上的链接,(比如在www.xxx.com点击了.www.xxx.com/article-11-11.html)绝对就打不开了,若干秒之后chrome报链接超时 118错误,但是在地址栏敲一下回车,马上页面就又能打开了.

观察服务器日志发现,此连接请求根本没有发送到服务器成功.

 

nginx里面是通过upstream配置的如下,肯定是没有问题的.

[php]

upstream xxx{

server 192.168.100.144:9000 weight=5;

server 192.168.101.144:9000

}

[/php]

通过直接将域名指向内网的这个服务器ip之后,故障依旧,排除dns方面的问题.

 

 

Read More

随手挖出来的google朗读API 可以朗读任何语言 直接返回就可以调用

http://translate.google.cn/translate_tts?ie=UTF-8&q=D&tl=en&total=1&idx=0&textlen=1&prev=input

 

以上是google翻译中内嵌的朗读功能在挖掘的时候挖出来的一点小东西留作以后备用

其中q=D是要朗读的内容. tl=朗读语音 是中文就是zh-cn以此类推,中间可以做任意替换,返回的MIME类型是audio/mepg

这里tl=en就代表是调用英文语音进行朗读

项目中要用就挖掘出来了,给大家做一个参考.觉得好的话留个言吧哈哈~

 

 

两个实例

google 说 hello word:

http://translate.google.cn/translate_tts?ie=UTF-8&q=hello%20world&tl=en&total=1&idx=0&textlen=11&prev=input

google说我勒个去还能这么用: 

http://translate.google.cn/translate_tts?ie=UTF-8&q=%E6%88%91%E5%8B%92%E4%B8%AA%E5%8E%BB%E8%BF%98%E8%83%BD%E8%BF%99%E4%B9%88%E7%94%A8&tl=zh-CN&total=1&idx=0&textlen=9&prev=input

Read More