Debug 总结

本来只是把网站程序从一台虚拟空间转移到一台linux服务器,但是越搞越复杂,仅在此写上我的感悟。

我首先是单独安装apache 和mysql服务器然后再一一配置,但是这样做出现了一个问题,一些扩展你要在Linux平台再进行编译,相当麻烦,于是我选用了lampp组件,

好处是省的你一一编译了,但是出现了一下几个问题:

1.要配置开机自动启动(解决办法见上一篇日志)

2.MYSQL命令行好像无效,(./解决)

3.一些命令比较特别

这是安装服务器的问题

在安装程序时遇到了一下问题:
1.ZIP RAR解压需要安装其它软件,采用其它压缩方式要换非windows系统

2.还有就是权限问题 最好都设置为777 不然一些包含文件的语句会导致错误

3.不同平台的服务器环境略有差别,有的PHP程序开始简写是<? 而有的不支持,所以最好在编写程序时考虑到这一点一律用<?php

经验:

1.编写程序最好有说明文档,不能想到哪该到哪,一些常用组件要学会封装,避免沉余代码。

2.要考虑多平台的可移植性,多浏览器兼容性。

3.最好要有一键化安装程序,不能让安装过程一定要由专业人士来做,这是很重要的一点。

4.代码文件的命名,目录的命名要符合规范,我所安装的这个程序主页是default.php 这是很坑爹的,作为PHP程序,我第一次见有人把这设为索引文件,还有就是这个程序存在两个文件目录一个是js 一个是script 这也是很不规范的。

5.文件的包含我很赞同,但是把常用组件封装成类更好,然后类单独放在一个文件中,提高效率

 

密码为什么明文存放

 

很早就写过一篇blog,说到过,你的密码应当一次一密,至少某些密码泄露时不至于波及太广。结果这次CSDN不幸中枪。我不去讨论多少人急急忙忙修改密码,多少人数据泄露,单说说为什么很多时候密码是明文存放的。

就我有记忆以来,我写应用就从来没有明文存放过密码。最起先是md5方式存放。md5可以让你找到hash值,有的时候也会被用于穷举。但是无论如何,md5密码本身比明文安全很多。后来改成了challenge-response验证模式,也是用md5做的hash后进行c-r的。再后来,md5的碰撞冲突的论文出来,后面用的多数都是sha256了。从头到脚,我就没做过密码明文存放,并且,我认为这是正常程序员最起码的修养。(当然,明文存放的代码不是没有,不过那是调试模式) 但是现在我所知,很多系统的身份验证都是密码明文存放的,为什么?其实我不大理解。不过有时候问起,有些人和我说了几个我觉得不是搪塞的理由,现在抄录如下,告大家知。

1.明文密码没法应付检查。大家知道互联网审查,有时往往会一个电话过来,要XX用户的密码。如果你没法给出,上头就认为你不配合,事情各种难搞。作为审查机构的老板,当然没必要知道明文密码的危害。他们只知道,我要密码,为什么不行。所以,悲崔的程序员们就往往会得到一条死命令,保存明文密码。

2.压根不知道明文密码有什么问题。中国的互联网有太多的没基础的新人,从石头的缝隙中顽强的生长出来。这不是坏事,坏事的是这些人往往会在一些基础问题上出现奇怪的毛病。例如有些程序员,写程序很快,但是居然从来不知道密码明文存放会导致什么问题。更神奇的是,这些人中,有一家银行…

3.自信暴棚的混帐。有些人的自信总比别人强,而且强在莫名其妙的地方。例如:我的服务器肯定是没问题的,所以我的密码一定要明文存放。如果不,就是质疑我的技术。

实话说,这种人真是少数中的少数。

4.遗留系统。很多系统设计的时候因为某个其他理由,使用了明文密码。等后来这个理由不存在了,密码系统升级成了一个困难。因为密码系统太重要了,所以在没有太大利益的情况下,总是倾向于不修改系统。但是有什么足够利益来推动系统修改呢?用户安全问题在发现前不是一个问题——好比这次的CSDN,不是被暴出来的话就根本不会被当作一个问题。系统的管理者,每个人都没有足够的动力去修改系统。

5.世界的阴暗角落。有的时候,程序员/老板明文存放的理由,是为了方便盗窃用户其他网站资料。例如我所知的某钓鱼案例,你注册网站,就提供很多免费服务,网站看起来也很靠谱——除了后来突然爆出这家网站其实暗地中用你的生日/密码猜解信用卡/银行卡密码,大家才突然发现,这家网站其实根本没有在美国注册,而是一个听都没听说过的国家。

而且很多网站提供从其他网站导入之类的功能,更加的危险。以前经常爆出twitter密码被窃取,主要就是因为OAuth开放以前,twitter上的第三方应用需要提供原生密码,导致很多小应用的目的其实就是收集密码…

6.为了给用户提供方便。这个理由和上一个很类似,不过不是为了某些险恶的目的。而是客户经常要求——为什么我不能做XX事,为什么我不能blahblah。好吧,为了让你能,我们就必须保存明文密码。

明文密码的保存原因很多,不过结论都是一样的。在任何网站/服务上,你绝对不能使用同一个密码,零级密码除外。尤其请注意,不要在两家银行使用同样的银行卡密码/网银密码,原因不说。

从未来进化的角度说,密码的未来进化趋势是核心授权体系。就是你要向某个网站验证身份,只需要向身份验证商验证,剩下自动完成。现在的openid就是一种解决方案。密码都没了,还谈什么泄露呢?同时,实体交互和授权的精细划分也是一个趋势。某个网站访问别的网站的数据的时候,会形成一个访问令牌。这个令牌对需要访问的内容详细写明,并且需要用户授权。OAuth就是这个趋势的代表。另外一个趋势是利用某个足够安全的设备作为以上两者的终端载体。目前这个设备用的是手机,可是——手机不是一个足够安全的设备。也许这会是下一个XX门的隐患吧。

浅析PHP模板引擎之二

上篇文章我简要的介绍下模板引擎的运行机理,但是过于简单不太实用,下面我继续扩展这一问题,并使它成为轻量型引擎。

首先我们建立三个目录 ./templates ./templates_c    ./lib 这三个目录分别放模板文件、经过编译后生成的文件、引擎代码文件

下面放上运行原理图:

下面写上各个部分代码:

1.模板引擎template.class.php代码:

< ?php  class template{  private $template_c;  private $data=array();  public function __set($name,$value){  if(!array_key_exists($name,$this->data)){
$this->data[$name]=$value;
}else{
$this->data[$name]=$value;
}

}
public function display($templatename){
$this->template_c=file_get_contents('./templates/'.$templatename);
foreach($this->data as $name => $value){

$this->template_c=str_replace('{'.$name.'}',$value,$this->template_c);

}
echo $this->template_c;

}

}

模板test.tpl代码:

我的名字是 {name}
 手机号 {telephone}
 性别{sex}
 口头禅是{say}

index.php代码:

< ?php  Header('Content-type:text/html;charset=utf-8'); require_once  "./lib/template.class.php"; $template= new template; $template->name="lvxinwei";
$template->telephone=15151827622;
$template->sex="男";
$template->say="我勒个去";
$template->display('test.tpl');

显示效果:
我的名字是 harold
手机号 151518276xx
性别男
口头禅是我勒个去
在第三节,我会继续扩展该问题,使之能进行智能化的页面缓存;

浅析PHP模板引擎运行的机理

PHP有相当多的模板引擎,比较出名的也是笔者比较喜欢的有smarty引擎。

模板引擎的机理是分离了逻辑代码和外在的内容,提供了一种易于管理和使用的方法,用来将原本与HTML代码混杂在一起PHP代码逻辑分离。简单的讲,目的就是要使PHP程序员同前端人员分离,使程序员改变程序的逻辑内容不会影响到前端人员的页面设计,前端人员重新修改页面不会影响到程序的程序逻辑,这在多人合作的项目中显的尤为重要。

下面我通过编写的一个类简要的说明运行机理。

首先我说下大致的使用过程:

1.引入模板引擎,可以通过类中的–autoload()方法自动加载相应类。

2.给相应的要生成的动态内容赋值。例如在smarty中通过$smarty->assign(“name”,$value);给name赋予$value值,但是查询
name的值的过程交给程序员做。

3.调用方法生成动态内容。$smarty->display(“test.tpl”);

下面写上我写的一个缩小型模板引擎

class template {

private $vars=array();
public function setattributes($name,$value){
$this->vars[$name]=$value;

}
public function getHtml($html){
foreach($this->vars as $name=>$value){
$html=str_replace(‘{‘.$name.’}’,$value,$html);
}
return $html;

}
}
$template =new template;
$template->setattributes(“name”,”lvxinwei”);
echo $template->getHtml(“I am  {name} “);

可以看到我输入“ I am {name}” 输出“my lvxinwei”;

原理就是将变量值以key-value对储存起来。然后处理输入用键值替换键名。

当然这个引擎不是很实用但是说明了模板引擎运行机理。