我有一个PHP网站,人们可以在那里填写帮助票.它允许他们上传票证的屏幕截图.我允许上传gif,psd,bmp,jpg,png,tif.收到上载后,PHP脚本将忽略文件扩展名.它仅使用MIME信息标识文件类型,对于这些文件类型,它始终存储在文件的前12个字节中.
有人上传了几个GIF,当用浏览器查看时,浏览器说它无效,我的病毒扫描程序提醒我这是注射(或类似的东西).请参阅下面的包含这些GIF的zip文件.
我认为只检查标题信息是不够的.我听说图像可以完全有效,但也包含漏洞利用代码.
所以我有两个基本问题:
更新:大家,谢谢你的答复到目前为止.我试图在服务器上查找上传的GIF.如果我找到它们,我会更新这篇文章.
更新2:我为任何感兴趣的人找到了GIF.我把它们放在一个用密码"123"加密的zip文件中.它位于这里(小心这个主机网站上有多个"下载"按钮 - 其中一些是广告)http://www.filedropper.com/badgifs.名为5060.gif的版本被我的防病毒软件标记为特洛伊木马(TR/Graftor.Q.2).我应该注意这些文件是在我实现前12个字节的MIME检查之前上传的.所以现在,我对这些特殊的安全.但我仍然想知道如何检测隐藏在正确MIME类型后面的漏洞.
重要说明: 我只关心下载这些文件以查看它们的PC的风险. 这些文件对我的服务器没有风险.它们不会被执行.它们使用扩展名为".enc"的干净名称(十六进制散列输出)进行存储,然后使用fwrite过滤器将它们以加密状态保存到磁盘:
// Generate random key to encrypt this file.
$AsciiKey = '';
for($i = 0; $i < 20; $i++)
$AsciiKey .= chr(mt_rand(1, 255));
// The proper key size for the encryption mode we're using is 256-bits (32-bytes).
// That's what "mcrypt_get_key_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC)" says.
// So we'll hash our key using SHA-256 and pass TRUE to the 2nd …
Run Code Online (Sandbox Code Playgroud) 我正在寻找将PHP输入流的内容写入磁盘的最有效方法,而不使用授予PHP脚本的大量内存.例如,如果可以上载的最大文件大小为1 GB,但PHP只有32 MB内存.
define('MAX_FILE_LEN', 1073741824); // 1 GB in bytes
$hSource = fopen('php://input', 'r');
$hDest = fopen(UPLOADS_DIR.'/'.$MyTempName.'.tmp', 'w');
fwrite($hDest, fread($hSource, MAX_FILE_LEN));
fclose($hDest);
fclose($hSource);
Run Code Online (Sandbox Code Playgroud)
像上面的代码一样在fwrite中显示是否意味着整个文件将被加载到内存中?
做相反(将文件写入到输出流),PHP提供了一个函数调用fpassthru我认为不成立的PHP脚本的内存中的文件的内容.
我正在寻找类似但相反的东西(从输入流写入文件).感谢您提供任何帮助.
在使用seekg&tellg文件的场景中,我想知道幕后发生了什么?
// Open file and get file size
int myFileSize;
std::fstream myFile;
myFile.open(myFileName, std::ios::in|std::ios::binary);
if (myFile.is_open())
{
myFile.seekg(0, std::ios::end);
myFileSize = myFile.tellg();
myFile.seekg(0, std::ios::beg);
myFile.close();
}
Run Code Online (Sandbox Code Playgroud)
Q1: seekg是否真正遍历文件的全部内容,直到找到一些特殊的"EOF字符"?或者它是否使用文件系统提供的一些其他信息来"知道"文件末尾的位置?
Q2: seekg是一个寻求流的操作.这是否意味着文件的整个内容必须通过流?
请原谅我,如果我对这一切的运作方式只有基本的了解.
可能重复:
std :: endl在每个平台上完全代表什么?
我试图找出std :: endl是否返回\r\n
,, \n
或者\r
取决于平台,或者它是否始终坚持使用.
我遇到了一个特定的字符串(它不是完全可打印的,但你可以在下面看到)导致htmlspecialchars()返回一个零长度的字符串.有什么方法可以修复吗?
$Stmnt = 'SELECT subject_name FROM bans WHERE id = 2321';
$Fetch = $Conn->query($Stmnt);
if(!$Fetch)
die('Could not query DB');
while($Row = $Fetch->fetch_array(MYSQLI_ASSOC))
{
$RawName = $Row['subject_name'];
$RawLen = strlen($RawName);
echo('RAW NAME: ['.$RawName.']'.', LENGTH: ['.$RawLen.']'.'<br />');
for($i = 0; $i < $RawLen; $i++)
echo('CHAR '.$i.' = ['.$RawName[$i].'] (ORD: '.ord($RawName[$i]).')<br />');
$CleanName = htmlspecialchars($RawName, ENT_QUOTES, 'UTF-8');
$CleanLen = strlen($CleanName);
echo('CLEAN NAME: ['.$CleanName.']'.', LENGTH: ['.$CleanLen.']'.'<br />');
for($i = 0; $i < $CleanLen; $i++)
echo('CHAR '.$i.' = ['.$CleanName[$i].'] (ORD: '.ord($CleanName[$i]).')<br />');
}
$Fetch->close();
echo('DONE'); …
Run Code Online (Sandbox Code Playgroud) 我有兴趣使用交易来提高绩效.
这是我目前正在做的过程:
* ~~~BEGIN TRANSACTION~~~
* Instance a command object and set the command text.
* Prepare command text so parameters can be added.
* In a loop, I set the values of said parameters and execute the command.
* ~~~COMMIT~~~
Run Code Online (Sandbox Code Playgroud)
我这样做是因为,据我所知,当你准备一份声明时,你正在与SQLite引擎进行通信,所以也许在事务中包含它会以某种方式帮助??? (我只是猜测.)
.
问题: 我应该将其更改为以下过程吗?
* Instance a command object and set the command text.
* Prepare command text so parameters can be added.
* ~~~BEGIN TRANSACTION~~~
* In a loop, I set the values of said parameters and …
Run Code Online (Sandbox Code Playgroud) php ×3
c++ ×2
fstream ×1
gd ×1
inputstream ×1
security ×1
seekg ×1
sqlite ×1
std ×1
transactions ×1