我知道有很多问题,但是我无法解决所有我想知道的问题。
我想做的是允许网页的用户上传带有表单的图像。我想确保此过程安全,或者至少要尽我所能。
我对安全性的内在知识并不了解太多,但是我知道不安全的网页可能产生的所有后果。而且我不能安静地认为我的网页是不安全的,或者因为没有足够的访问量而不会有人进入我的网页(我是现实主义者)。
至此,我知道所有有关安全性的检查都必须在服务器端而不是客户端(或同时在两者)中进行。
我知道文件可以被当作图像来欺骗并运行恶意代码,因此我搜索了避免这种情况的方法。这是在将映像存储在服务器上之前可以找到的检查内容:
来自$_FILES
:
$_FILES['file']['name']
:要检查我上传的文件是否具有名称。要知道该文件存在。$_FILES['file']['error']
:检查图像是否有错误。$_FILES['file']['size']
:检查图像尺寸是否大于0。$_FILES['file']['type']
:要检查文件类型是否为图像,但是不建议您这样做,因为PHP
不检查它。通用功能:
检查magic numbers
以确认图像类型。
exif_imagetype()
:检查图像的类型。
getimagesize()
:检查它是否返回0,这表示文件不是图像。
imagecreatefromstring()
:创建一个新图像并给出一个字符串。如果无法创建,则不是图像。
imagepng
:创建PNG
图像以删除所有元数据(使用imagecreatetruecolor()
和imagecopy()
)。
但是我的问题是我不知道我应该使用所有这些方法还是仅仅避免或添加其中的一些方法(因为其中某些方法似乎是多余的)。
我的问题是:
注意:我不是在搜索个人意见。我试图收集所有可能的信息,但是我不确定这是否可行或是否在谈论安全性条款。如果您可以举一些被遗忘的事的例子,那就太好了。
提前致谢!
要回答您的问题:
根据您的应用程序,任何安全上传的逻辑应如下所示:
用户登录了吗?(选修的)
// make sure user is logged in
if (!$user->loggedIn()) {
// redirect
}
用户是否具有权限?(选修的)
// make sure user has permission
if (!$user->isAllowed()) {
// redirect
}
表格提交了吗?
// make sure form was submitted
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
表格输入有效吗?
// validate CSRF token
// ...
// make sure there were no form errors
if ($_FILES['file']['error'] == UPLOAD_ERR_OK) {
// make sure the file size is good
if ($_FILES['file']['size'] <= MAX_FILE_UPLOAD) {
// make sure we have a valid image type
$type = exif_imagetype($_FILES['file']['tmp_name']);
if ($type !== false) {
// make sure we check the type against a whitelist
if (in_array(ltrim(image_type_to_extension($type), '.'), array('jpeg', 'jpg', 'png'))) {
即使经过验证,也永远不要信任用户输入
// give the file a unique name
$hash = hash_file('sha1', $_FILES['file']['tmp_name']);
$ext = image_type_to_extension($type);
$fname = $hash . $ext;
保存文件(或选择使用库重新创建该文件以去除元数据),但永远不要保存在可公开访问的目录中
$upload_path = '/path/to/private/folder';
move_uploaded_file($_FILES['file']['tmp_name'], "$upload_path/$fname");
上面的步骤是绝对安全的,而且超出了合理范围,当然,始终存在应用程序或服务器的其他部分可能容易受到攻击的风险。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句