2.非传统方式的设计:AJAX有一点点不同于传统设计方式,因为这样的应用程序是半客户端半服务端的。在Max的例子里,他是唯一的开发者,所以他为服务端和客户端都能够进行编码。在同一时间使用两种不同的语言(特别是在早期阶段)进行开发将会产生一些初级的编码错误,因为他要在两端来回跳跃,对一端来讲非常好,但可能在另一端不能够胜任。即使Max有一个大的开发团队,安全编码责任也可能在服务端和客户端开发小组之间代码移交的时候发生问题。
3.太多的脚本语言:Max凭借他自己的聪明才智决定建立世界上最优秀的旅行登记工具。你从输入你现在的位置(通过邮政编码、电话区号或者GPS等等)开始登记,这时候一个AJAX请求就会被立即发送来确定你确切的位置。从那时候开始,屏幕上就会填入你所有可以利用的旅行方式,这一切甚至都是在你决定你想要去什么地方、你打算什么时候动身和你打算和谁一同去之前就完成的。
这个屏幕上的单元格和控件都充满了AJAX驱动,服务器端和客户端的脚本可能需要超过20个不同的服务器调用。你可以想像一个很小的个体服务器程序,比如findairportsbylocation.aspx 或者 determinemaxbaggageallowancebyairline.php.
显而易见,如果没有Max的仔细计划(比如创建多功能的“重载”JavaScript函数和服务器脚本),每一次设计他都需要创建超过40个独立的部分。更多的编程意味着会产生更多的错误和bug,意味着需要更多的时间去编写、管理、测试和更新代码。不仅如此,因为在客户端的JavaScript代码中应用了大量的这种脚本,他们在正式的程序测试中也容易变得很健忘。
4.确定小部分的AJAX不会引起危害:这个站点是一个计划出行的站点,但是Max考虑的是它将立刻为你提供一个显示精确位置的卫星视图,并且把你所要到达目的地的天气情况也提供给你。AJAX最大的诱惑之一看起来好像是直到最后一刻它还在进行其它的操作,就像一个讲解员在那里解说一样,为了AJAX使用了AJAX。当Max开始尝试他的新想法时,他会逐渐尝试增加更多新的功能,完全忽视测试的需要。
5.不安全的通讯:每一个AJAX调用可能只回传很少数量的数据给客户端,但那些数据是私有的、保密的。Max可以编写一个便利的工具来对你的信用卡号码进行数字校验,但是如果使用纯文本代替over SSL进行发送数据会怎样呢?这是一个显而易见的问题,但是当有许多例行程序需要考虑,特别是屏幕上其它99%的数据不是真正的机密数据时,很容易就会忽视掉SSL的。
6.服务器端访问控制:使用JavaScript程序来触发AJAX经常会掩饰一些显而易见的编码错误,服务器端访问控制就是一个例子。假设Max想参考你上次游览的一个详细目的地来为你提供你中意的旅馆,他可能会是像下面这样:
showprevioushotels.aspx?userid=12345&destination=UK
这当然是非常好的,但是如果一个恶意用户把URL改成了如下所示该怎么办呢:
showprevioushotels.aspx?userid=12346&destination=%
他们会得到其他人最喜爱的旅馆吗?(注意:%在SQL语句中是通配符)。无疑,这是一个没有什么危害的例子,但是Max应该使用session、cookie或者其它符号形式来确保数据能并且只能发送到正确的用户那里。它们可能仅仅是数据的一小部分,但它们可能就是最重要的一小部分。
7.服务器端验证:实际上这里有两个问题。第一,AJAX控制经常被用来在用户最后提交到服务器之前的输入验证。这麻痹了Max,使Max有一种虚假的安全感,原因是他建立了称作alloweddestinations.php的函数,根据用户的ID来决定他们能够到达的正确目的地。
因为这是一个服务器端的检查,当这个页面最后被提交的时候他不必再次为在服务器上做检查而烦恼,这里我们假定不会有恶意的用户暗中破坏从alloweddestinations.php的响应或者破坏对服务器最后的请求。