10个步骤让你的PHP网站变得更加安全

Posted by 撒得一地 on 2015年12月7日 in PHP笔记

你害怕把你的PHP网站放在互联网上,因为怕网站不安全吗?但很多网站都在那。当我们阅读到许多关于黑客攻击站点和用户数据被泄露等故事时,我们很容易惊慌。

可是每个网站都可能受到攻击,无论你怎样的去防护你的网站。但在你的代码中添加最重要的安全措施可以大大降低网站被攻击的风险性。

要做到这并不是非常难,以下是10个重要的技巧来使你的PHP代码更加安全:

1.验证数字输入

大多数教程都讨论到验证用户输入的重要性。我更喜欢根据用户特定的输入类型来进一步做验证。当你知道什么样的输入是你需要的,那么就非常容易使你的代码不会受到恶意的输入攻击(SQL注入,跨脚本站点攻击等)。

PHP网站经常需要通过URL参数来进行值传递。比如在URL中传递用户ID或者商品ID的值时并不会有任何的错误,前提是你必须确保那些ID真的是数字类型的值:

$id = intval($_GET['id']);

这样的转换真的是必要的,如果用户通过SQL注入或者传入类似其它值时,在URL中这些值会被转换为0。或者,如果你更喜欢输出一个错误提示:

if(!is_numeric($_GET['id'])) die("ID parameter must be numeric");

我更喜欢第一种方法,因为第二种方法帮助攻击者知道你对ID进行了验证,他们可能立马尝试使用其它方法来进行攻击。

2.验证文本输入

文本输入有一点点比较难验证,因为你很难知道什么样的输入是被需要的。最简单和最经常使用的方法就是在你将文本数据插入到数据库前,对其进行转义。你可以使用mysql_real_escape_string或类似的函数进行转义。然而如果你知道什么样的文本数据是你需要的,那么使用 filter_var()来进行过滤会更好一点。比如你可以用下面这种方法验证用户的输入是否是正确的邮件格式:

$email = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL);

上面严格的限制了用户输入是否是你需要的。

3.验证html输入

有时候你想让用户输入格式化后的html代码,例如你在输入框中可以使用某种文本编辑器。显然,在这种情况下,你可以避免SQL注入的唯一方法是对输入进行转义,比如用mysql_real_escape_string之类的函数。你不应该删除特殊字符,因为它们是部分HTML待格式化代码。然而,有两个肯定的事是:你不希望用户输入脚本标签和你不想他们嵌入内联的frames元素。在你网站显示时,这两者非常不安全,所以你一定要确保这样内容不会通过:

10个步骤让你的PHP网站变得更加安全

4.防止XSS注入

如果你想要详细的了解关于跨站点脚本攻击的知识,并且想成为防御它们的专家,那么建议你去学习下这篇文章 :http://www.veracode.com/security/xss。关于XSS有一种简单且常用的解决方法:

echo htmlspecialchars($_POST['input']);

当你需要用户输入的内容输出到屏幕上时,可以这么做。除非你想让用户输入带格式化的html文本时,那么你可以参考上面 验证html 输入那个小点。

5.不提示MYSQL错误

这一点很简单。注意不要这样做:

mysql_query($sql) or die(mysql_error());

你肯定不想给任何人显示SQL错误,更何况,在代码中直接使用mysql_query()是很笨的一种方法。你必须使用改进的mysqli,而且需要使用数据库封装进行查询操作。数据库封装应该将错误记录到日志里面,而不是直接在屏幕上输出。

6.不运行外部数据库连接

另一个简单的建议。许多程序员都喜欢在web根目录之外隐藏文件和数据库连接细节。这是不方便的,因为它使得移动你的站点变得更加困难。

从外部主机(不是本地)中断开数据库连接是非常简单的。这个方法使得即使某人下载了你的配置文件,他们也没办法做任何事情。

还有,别忘了你的数据库连接文件应该加上.php后缀,而不要傻傻的用db-connect.inc.类似这样的名字进行命名。因为如果这样命名,别人可以从浏览器查看或者下载你的这个配置文件。

7.建立垃圾邮件保护机制

垃圾邮件本身通常不被认为是一个安全问题。但其实它是。当大量垃圾评论产生大量的邮件提醒或者大量数据库查询时,你的站点应将其记录下来。所以要注意以下内容:
a)网站实现验证码
b)用垃圾邮件提醒功能来验证用户输入,在评论中检查垃圾内容或者URL链接等。
c)阻止用户异常的操作行为。这个很容易用session机制来实现,比如如果你看到某个用户在一分钟内提交了10个评论。那么很有可能是用机器在刷评论,而非真实的用户。

8.检查上传文件的资源类型

当让用户上传文件时,要确保上传文件的格式类型是在允许范围之内的。例如,你肯定不想用户上传PHP文件来作为他们的头像。通常通过检查上传文件的后缀就足够了,因为即使PHP文件被重命名为.png后缀,当用浏览器来访问它的时候文件也不会被运行。所以你可以简单这样操作:

$allowed_file_types = array("png", "jpg", "gif");

$parts = explode(".", $_FILES['uploaded_file']['name'];

$extension = array_pop($parts);

$extension = strtolower($extension);

if(!in_array($extension, $allowed_file_types)) die("Error!");

如果你想进一步检查文件类型是否满足条件,那么你应该使用PHP的FileInfo类来进行检查。

9.检查当前数据的拥有者

在你的网站中允许注册用户查看他们个人数据是非常重要的一件事情。举个简单例子,在社区站点中每个用户都会有自己的一个标签。通常当输出标签时你会做类似的操作:

SELECT * FROM  bookmarks WHERE user_id=$user_id

当然,$user_id是一个数字。大多数开发人员对此都会非常清楚,否则用户就不能得到正确的标签。但在删除标签时,许多开发人员可能会犯这样的低级错误:

DELETE FROM bookmarks WHERE id=$_GET[id]

上面是一个巨大错误(假设在查询前$_GET[‘id’]已经被验证是一个整型)。因为上面的查询可以删除任何其他人的书签只要他们知道ID。或者他们可以随机选择ID来删除标签。你应该总是确保用户只操作他们自己的数据:

DELETE FROM bookmarks WHERE id=$_GET[id] AND user_id=$user_id

10.用Deny from all 保护文件

这没涉及到PHP,因为你可以在任何站点中使用它。比如,如果你正在运行一个会员网站,并且让用户付费才可以下载图片,那么你应该确保所有图片都经过PHP脚本处理才能进行下载而不是直接提供一个下载链接。否则,每个人都可以访问文件,只要他们知道文件在哪。不仅你不应该暴露真实的文件路径,而且你也应该使它完全无法从浏览器上访问到。一个简单的方法是通过创建.htaccess文件,在文件中加入下面内容:

<Limit GET POST PUT>

order deny,allow

deny from all

</Limit>

实现了以上十个步骤,你的网站将会更加安全。

英文地址:http://www.tutorialized.com/tutorial/The-Top-10-Steps-To-Make-Your-PHP-Site-Secure/82120

转载请注明本文地址:http://coderschool.cn/1231.html 

标签:,

上一篇:

下一篇:

相关推荐

网站地图|XML地图

Copyright © 2015-2024 技术拉近你我! All rights reserved.
闽ICP备15015576号-1 版权所有©psz.