增加这三行php代码的安全,性能和兼容性
本文按署名·非商业用途·保持一致授权作者:
,发表于2007年05月26日09时15分
今天在sitepoint上看到一篇文章,其中有一段是介绍如何改进以下的这行php代码。这段代码经常被他们用来测试应聘者。
<?
echo("<p>Search results for query: " .$_GET['query'] . ".</p>");
?>我觉得这段代码非常适合用来测试一个php开发人员是否合格。因为这段代码并没有要求太多记忆上的东西(例如函数的记忆),但是对安全,性能,兼容性上都做了考察。
大家也想想看如何改进代码。我在后面给出修改后的代码。
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
^
<?php
if (isset($_GET['query']))
{
echo '<p>Search results for query: ',
htmlspecialchars($_GET['query'], ENT_QUOTES), '.</p>';
}
?>改进的地方有 :
- 把php短标签(<?)换成了长标签(<?php),因为并非所有php环境都支持短标签
- 增加判断该全局变量是否存在,防止在某些环境下出现notice错误,而且在当前的例子里如果query无则没必要输出
- 把echo的”(“去掉,echo不是一个函数,没必要使用“(”
- 把字符串两边的双引号换成了单引号,提高了性能。因为双引号里的内容会被尝试进行变量和转义字符的解析。
- 对query这个get变量进行html过滤。防止输出html,这可能会带来包括xss在内的一些危险
- echo后面的字符串之间的间隔使用逗号而不是句号。因为句号之间的字符串会先被连接起来然后再输出,而,号只是按顺序输出。在这个例子里显然不需要先连接字符串。(这一点我平时倒没太注意)

2007-05-26 16:53:43
surf同志的技术水准已经向我又接近了一步,鉴定完毕:D
2007-05-27 14:33:47
有个bug!这里没有考虑到打开 magic_quotes_gpc 时的情况,事实上默认都是打开的。那么用户输入的某些符号会被篡改。
而且,如果输入为空,那么将什么都得不到,貌似没什么问题,实际上单输出一个 “Search results for query:” 已经是公认的国际标准了!聊胜于无啊!
还有,isset($_GET['xxx']) 也貌似没有什么问题,但如果这段代码在命令行下执行,根本就不会有 $_GET 变量,记得在PHP早一点的版本,会有一个 Notice。
果然,又向dash靠近了一步,鉴定完毕!