在PHP中接受用户输入图像URL时的安全性问题

时间:2017-03-17 18:40:40

标签: php codeigniter curl

我想允许用户上传图片的网址(有点像在此网站上的标记)。唯一的区别是我要将这些存储在我的数据库中。我想确保没有任何恶意可以做到。

环顾四周之后,我看到了>>> import csv >>> >>> sourcepath = "/Users/me/python_case_statement.csv" >>> destpath = "/Users/me/python_case_statement_flat.csv" >>> >>> with open(sourcepath, "rb") as source, open(destpath, "wb") as dest: ... reader = csv.reader(source, delimiter = ',', quotechar='"') ... writer = csv.writer(dest, delimiter = ',', quotechar='"') ... headers = reader.next() ... writer.writerow(headers) ... for rownum, row in enumerate(reader): ... 'uid' = 'uid' ... if 'var01' == 1: ... 'var01_new' == 1 ... else: ... 'var01_new' == 0 ... row.append(result) ... writer.writerow(row) ... File "<stdin>", line 7 SyntaxError: can't assign to literal >>> 检查content_type的建议显然cURL实际下载了整个图像,这不仅具有安全隐患(显然 - 我真的不是专家)但因此会很慢。

到目前为止,我的代码看起来像这样:

getimagesize()

但是,我不完全确定这是否是正确的方法。我也看过很多关于 $curl = curl_init(); curl_setopt($curl, CURLOPT_URL,$url); // don't download content curl_setopt($curl, CURLOPT_NOBODY, 1); curl_setopt($curl, CURLOPT_FAILONERROR, 1); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)'); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); if(curl_exec($curl)===FALSE) { curl_close($curl); return false; } $contentType = curl_getinfo($curl, CURLINFO_CONTENT_TYPE); //get content type curl_close( $curl ); if (strpos($contentType, 'image')){ // valid image } 网址的信息,但不完全确定这会带来什么。

有关保护我的网络应用程序的这一部分并准备存储的任何帮助都将受到高度赞赏。

快速地说,我希望对YouTube链接做同样的事情,所以如果你有任何建议,我会很感激 - 尽管我还没有开始研究它。

此致 麦克

2 个答案:

答案 0 :(得分:1)

如果您要允许用户通过URL上传文件,请首先下载文件(使用cURL或您喜欢的任何其他工具)。不要再提出检查内容类型的初始请求 - 最重要的是文件的内容,而不是原始服务器所服务的标头。

下载完图像后,请对本地文件执行进一步检查。确保它是一种合适的格式,并且不会太大,然后将其转换为您的首选格式。

其他说明:

  • 不要使用虚假的User-Agent。使用准确的代表网站负责请求的网站,例如: "MySite/1.0 http://example.com/"。 (其他网站管理员会为此感谢您!)

  • 在请求之前对域进行DNS查找是个好主意,以保护您的服务器免受DNS rebinding attacks的攻击。在发出HTTP请求之前,请确保生成的IP不指向您的专用网络或localhost。

答案 1 :(得分:0)

您还可以转义特殊字符以及不使用下面的函数

&#13;
&#13;
<?php
  $url = htmlspecialchars(addslashes($_POST["inputName"]));
?>
&#13;
&#13;
&#13;

这将添加飞溅并转动&amp;标记为html实体https://www.w3schools.com/html/html_entities.asp,因此您可能需要在从数据库中读取数据时撤消此过程。