佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 975|回复: 3

一些写需要上线Web Application 应注意的细节

[复制链接]
发表于 18-4-2015 11:56 PM | 显示全部楼层 |阅读模式
本帖最后由 musicalangel 于 13-5-2015 03:55 PM 编辑
PS:这篇我希望版主给我精华, 如果不满意文章内容或品质, 可以改到好

我从07左右开始接触PHP(详细时间我忘了),
到09年用PHP写毕业专题,
到11年做了一个小报告(2个课业用)
到12年末开始正式做起 PHP programmer

通常在在学习或做报告的过程中, 不会有教授或老师会教你写Web application 时需要注意什么细节,
且容我慢慢一一细述:

1) 注意安全, 安全至上:
听起来像是工地的标语, 但是写web application, 初心者跟老鸟最大的差异, 就是初学过程中为了求快
往往忘记了注意web application 的安全问题.

关于web application 的安全问题, 你可以参考这个网页:
十大 web application 的漏洞

这边我不一一详述, 但是我曾听别人说过, web application 最简单的安全守则为:
1) 永远不要相信任何使用者.
2) 尽快验证你的input , 尽迟过滤你的output

web application 会产生问题的原因是, 开发者会很天真的把输入的变数直接用于执行query 上面, 例如下面所示:
  1. $query="select id, user_name, user_type from users where user_account=`$_POST['account_field']` and user_password=`$_POST['password_field']`";

  2. $result=mysql_query($query);
复制代码

我相信以上的code 很熟吧? 这是一般在acadamy 在学写PHP时初学者常写的程式码,

如果你很乖有去翻刚才我Point 出来的十大漏洞, 其中符合A1, A3 的风险, 那写出来的东西三两下子就给人家high jack 了

A1: 就是在key in account 跟password 的时候, 在栏位里面输入一些怪怪的标点符号, 例如:
  1. ` or 1=1" ~~
复制代码

你的query 就会变成
  1. select id, user_name, user_type from users where user_account='' or 1=1
复制代码

后面的code 都会变成注解(新版的mysql已经修正这个问题, 这里只是拿一个比较老掉牙的东西来讲),
这样一来就会将整个users 里面的所有账号select出来,
一但不小心, 有心人就会以第一个帐号(通常是admin)登入, 网页就直接被highjack了.

具体要怎样处理?
1) validate your input
不能直接将 POST的资料跟query 穿接起来执行, 必须经过 "验证",例如在account的部分我限定使用者仅能输入 abcd 或 1234
使用正规语法跟preg_match来达到目的, 如下所示:
  1. if(preg_match('/[^a-z_\-0-9]/i', $_POST["account_field"]))
  2. {
  3.     exit("账号只能够接受abc 跟 123");
  4. }
复制代码

但是每每一直重复写preg_match跟正规语法很烦,
你可以将它函式化(function), 或者利用第三方framework所提供的验证函式库. 例如: codeigniter form validation, laravel validation

2) database escape
第二则是在insert into db 之前, 先对你的所有变数进行mysqli_real_escape_string(), 把一些奇怪的变数escape掉.

3) 过滤output
任何 echo 之前, 请用 htmlspecialchars(),
这样就能够避免掉一些有害的code, show 出来


2) 天下武功, 无坚不破, 为快不破(火云邪神)
这一部分就是讲 optimization 跟 performence issue, 我记得我直到毕业的那年, 我还没有很认真地去看过我的code 执行所需要的时间跟所消耗的记忆体.
直到我工作那年, 某个系统被人家嫌慢, 我在php 的头尾加入 microtime(), 并且最后echo 出两个相差的时间,
才发现人是很主观的
1秒>     可以接受
1~5秒   他XX, 我的奶奶小解都比你还快
10秒<   砸电脑

所以你要很小心你的程式写得好坏, optimize 的部分我会留到下次贴子在仔细讨论.

不管是国内外, 都是认定系统跑得快不一定会成功, 但是跑得慢注定会失败. 所以就算你完成你的code 过后, 能走, 没有bug, 但是间隔1年后还是要回来review你的作品.

3) 忽略开发环境跟上线伺服器的差异
光是linux 上面跟windows 的差异就够大了, 例如你的PHP code 里面执行
  1. exec("shutdown -r -n");
复制代码

这段在 windows 装了 WAMP上面执行会重开电脑, 但是在linux上面却不会.

类似的情况很多, 例如mysql 在 windows 上面, 你的table 名称可以无视大小写, 例如 Users / users 都行, 但是在Linux上面却有大小写差别
你的table 如果是 Users, 你下 query的时候使用 users就会发生找不到table.

也有因为PHP版本不同, 例如你在电脑上装了5.6, 伺服器上面却装着5.4, 写了5.6才推出的功能, 导致程式fail掉.

4) 心态的调整
如果你在学习写程式的过程中, 完成了一个作业, 教授要你改这个改那个, 你不耐烦决定不改, 这个脾气可能要稍微改一下.
原因有两个,
其一, 就是一般大型软体企业训练菜鸟的方式,大致上就是要你maintain code, 就是不断的在现有的code base 上面添加东西, 添加功能, 增快速度, 减少错误等.
而且有时候, 你接手的东西很有可能很脏很乱, 你看到头昏眼花还是需要解决它, 如果你有以上的问题, 对于现成的东西会感到厌烦, 那你还有些时间修正.
其二, 就是一般你自己在写功能的时候, 今年可能执行顺利, 但是来年到了发现到一些统计资讯算错了, 你必须到头来修正, 你唯一可以做的, 就是调试好心态心情,
从新看起自己/他人写的code, 无论code是写的好或不好.


下一篇会分享关于web development optimization的问题, 有兴趣的可以继续关注.

评分

参与人数 3人气 +15 收起 理由
gracelee5880 + 5 谢谢分享
k2levin + 5 谢谢分享
rcyaw2 + 5 我很赞同

查看全部评分

回复

使用道具 举报


ADVERTISEMENT

发表于 19-4-2015 11:49 AM | 显示全部楼层
楼主以上的2点说的很对丫!
帮挺!
希望楼主也对 "代码维护与更新" 和"开发成本与效率" 这方法也提供一些指导.
万分感激.
回复

使用道具 举报

发表于 19-4-2015 04:08 PM | 显示全部楼层
老大开课,一定要关注学习
回复

使用道具 举报

发表于 21-4-2015 12:25 PM | 显示全部楼层
谢谢楼主, 小弟还是新手正在学习中.
万分感激.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 14-8-2025 10:37 PM , Processed in 0.127418 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表