安全矩阵

 找回密码
 立即注册
搜索
查看: 4002|回复: 0

Web安全语言基础:ASP、PHP及JSP

[复制链接]

991

主题

1063

帖子

4315

积分

论坛元老

Rank: 8Rank: 8

积分
4315
发表于 2020-10-6 08:51:07 | 显示全部楼层 |阅读模式
Web安全语言基础:ASP、PHP及JSP




ASP、PHP及JSP都是网站后端脚本语言,它们都是动态交互式语言,都是在Web 2.0时代诞生的,这是网络空间向前发展的一个自然过程。本文介绍ASP、PHP及JSP等语言的相关基础,通过了解这些语言的相关基础,我们可以更深入地学习Web安全相关的特性及原理。

1、ASP

ASP是Microsoft开发的服务器脚本语言,可用来创建动态交互式网页并建立强大的Web应用程序。当服务器收到对ASP文件的请求时,它会处理包含在用于构建发送给浏览器的HTML文件中的服务器脚本代码。除服务器脚本代码外,ASP文件也可以包含文本、HTML与COM组件调用。ASP的内容是被<%和%>“包围”起来的,所以当看到<%与%>包围的内容,就知道它里面是用ASP编写的代码。

例1,向浏览器传送一段文本“Hello World!”。

<html>
<body>
<%
'ASP开始的符号<%
response.write("Hello World!")
'中间的就是用ASP编写的代码,一个response.write()函数,输出字符串:
"Hello World!"到客户端浏览器
%>
'ASP结束的符号%>
</body>
</html>

我们将该段代码保存为ASP文件,放在IIS服务器上,开启IIS服务器。然后,使用浏览器访问这个ASP文件,会看到在浏览器中输出了“Hello World!”。那么,这是怎么实现的呢?这里给大家解释一下其中的原理,当用户请求通过浏览器发送到服务器的时候,服务器中的ASP文件被ASP容器解析执行并处理用户发送过来的请求,再将处理请求的结果返回到用户的浏览器,于是便输出了“Hello World!”字符串。因此,只要大家知道了这个请求与响应的机制,就可以很好地理解服务器的ASP程序是怎么处理用户发送过来的请求了。接下来,再举一个例子。

例2,服务器ASP程序处理用户发送请求。

HTML文件之1.html,其代码如下。
<html>
<body>
<form action="1.asp" method="post">
您的姓名:<input type="text" name="fname" size="20" />
<input type="submit" value="提交" />
</form>
</body>
</html>
ASP文件之1.asp,其代码如下。
'ASP代码开始
<%
'定义变量fname
dim fname
'通过request.form集合将姓名字符串存入变量fname中
fname=request.form("fname")
'if语句开始先判断fname变量是否为空,如果不为空,执行下面的代码
If fname <> "" then
'输出您好!你的姓名
response.write("您好!" & fname & "!<br />")
'输出字符串:今天过得怎么样?
response.write("今天过得怎么样?")
'if语句结束
end if
'ASP代码结束
%>

我们将这两个文件放在IIS服务器的wwwroot(网站的根目录)文件夹下面,然后用浏览器访问1.html文件,输入您的姓名,这个姓名就传递给了1.asp文件进行处理。那么,ASP文件是怎么处理这个姓名的呢?参见代码的注释即可。只要了解了ASP数据处理的过程,就会觉得ASP其实也是很简单的。ASPX同理,其请求与处理的基本原理与ASP是一致的,只是二者之间的语法有些差异罢了。

2、PHP

我们继续来了解下PHP。PHP是一种创建动态交互性站点的强有力的服务器脚本语言,PHP是免费的,并且使用广泛。接下来,我们通过具体的例子来介绍PHP的基本语法。

例1,通过PHP的echo函数输出字符串。

<html>
<body>
<?php
echo "this is my first php script";
?>
</body>
</html>

我们将上述代码保存为index.php文件并放在Apache服务器上,开启Apache并通过浏览器访问,上述代码将通过PHP的echo函数在浏览器中输出“this is my first php script”。

例2,通过PHP的echo函数输出变量的值。

<html>
<body>
<?php
$x=5;
$y=6;
$z=$x+$y;echo $z;
?>
</body>
</html>

上述代码的执行效果是在浏览器中输出11。

例3,通过PHP的echo函数输出变量的值。

<html>
<body>
<?php
$x=5; //全局变量
function myTest() {
$y=10; //局部变量
echo "<p>在函数内部测试变量。</p>";
echo "变量x:$x";
echo "<br>";
echo "变量y:$y";
}
myTest();
echo "<p>在函数之外测试变量。</p>";
echo "变量x:$x";
echo "<br>";
echo "变量y:$y";
?>
</body>
</html>

上述代码的执行效果是在浏览器中输出如下结果。

在函数内部测试变量。

变量x:
变量y:10

在函数之外测试变量。

变量x:5
变量y:

我们来分析一下例3这段代码执行的原理。在分析这段代码之前,我们先来说说变量与作用域的一些概念,概念的叙述简而言之共5点:变量、局部变量、全局变量、变量的作用域及超级全局变量。变量来源于数学,在这里指计算机语言中能储存计算结果或者能表示值的抽象概念,变量可以通过变量名访问。局部变量只在本函数范围有效,在本函数以外是不能使用该类变量的;全局变量的有效范围是从定义变量的位置开始到本源文件结束。局部变量是程序运行到该函数时给该变量分配内存空间,函数结束则释放该内存空间;全局变量是程序运行时事先分配内存空间,当程序结束时释放内存空间。变量的作用域:全局变量指在函数外部的变量,在函数内部是访问不到的,但是在函数内部用全局变量标识后可以访问。超级全局变量无论在函数内部还是函数外部都是可见的,例如$_GET及$_POST等内嵌的超级全局变量。另外,条件语句与循环语句中的变量外部可见。

例4,通过PHP的print_r函数输出变量的值。

<?php
$a = 2;
function f()
{
global $a; $a = 3;
}
f();
print_r($a); //输出3
?>

例5,通过PHP的print_r函数输出变量的值。

<?php
if(3>2)
{
$v = 10;
}
print_r($v);//输出10
?>

现在我们分析例3这段代码的执行原理。首先,定义一个变量x,赋值为5,当然,这个变量x是全局变量;然后,定义一个函数myTest(),在函数体内。定义一个局部变量y,将y赋值为10,当然,这个y是局部变量。再通过echo 函数输出<p>在函数内部的测试变量:</p>,输出变量x的值,输出换行符,输出变量y的值;函数实现完成后,主程序开始调用myTest()函数:myTest();接下来,还是通过PHP的echo函数输出<p>在函数之外的测试变量:</p>,输出变量x的值,输出换行符,输出变量y的值;主程序运行结束。通过执行结果(在浏览器中输出的结果),我们也可以看到:主程序从myTest()函数开始运行,一直到主程序结束(顺序运行),当开始运行myTest()函数的时候,CPU指针跳转到该函数定义的地方:function myTest(),然后就是运行下面的一段代码。

$y=10; //局部变量
echo "<p>在函数内部测试变量。</p>";
echo "变量x:$x";
echo "<br>";
echo "变量y:$y";

所以,我们在浏览器中看到的效果如下。

输出:在函数内部测试变量。

//这里本来是想输出变量x的值,但是由于变量x是全局变量,所以这里不能输出,即在该函数中不能访问全局变量x

输出:变量x:
输出:换行符

//由于变量y是在该函数中定义的,即变量y是局部变量,所以可以访问

输出:变量y:10

接下来,主程序继续运行下面的一段代码。

echo "<p>在函数之外测试变量。</p>";
echo "变量x:$x";
echo "<br>";
echo "变量y:$y";

所以,我们在浏览器中看到的效果如下。

输出:在函数之外测试变量。

//由于变量x是全局变量,所以在主程序中可以访问

输出:变量x:5
输出:换行符

//由于变量y是函数myTest()中的局部变量,所以,在主程序中无法访问


输出:变量y:

总结:事实上,变量的访问还是一个关于作用域的问题。定义的变量如果在某个函数中,那么,它就只能在这个函数中使用(除非该变量被声明为全局类型);定义的变量如果是在主程序(主函数)中的,那么就只能在主程序中使用,不能在子程序(子函数)中使用。这个道理很简单,其实,可以这样想:代码或者程序,都是由一个一个的函数构成的,在哪个函数中定义的变量,那么,这个变量就只能在哪个函数中使用,不能在其他函数中使用。记住:每个程序都有一个主函数,在主函数中定义的变量,我们称为全局变量。

3、JSP

JSP类似于ASP或者PHP,它们三者都是服务器脚本语言。一般而言,ASP与IIS搭配使用,PHP与Apache搭配使用,JSP与Tomcat搭配使用。我们开启Tomcat,将JSP代码保存为JSP文件并将其放在Tomcat\Webapps\ROOT目录下,然后浏览器发送请求访问执行JSP文件。这个访问执行的数据处理过程是怎么实现的呢?解释一下其中的原理:当用户的请求数据通过浏览器发送到服务器的时候,服务器中的JSP文件被JSP引擎解析执行并处理用户发送过来的请求数据,再将处理请求的结果返回到用户的浏览器。JSP与ASP或者PHP的访问执行处理有异曲同工之妙。另外,JSP代码的安全防御也是一个很重要的问题,除了SQL注入防御,如跨站脚本漏洞、文件上传漏洞及代码执行漏洞等的防御,其原理也是一致的,都是在正则表达式中添加或者修改防御规则。当然,目前也有很多JSP开发框架,例如Struts、Spring、Hibernate及MyBatis等,然而其代码底层的安全也是基于上述基本规则实现的,万变不离其宗。安全的JSP开发框架,最终还是要落实到底层的每一行代码的安全实现上。


回复

使用道具 举报

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

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-28 07:37 , Processed in 0.012311 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

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