小编Lak*_*key的帖子

是否阻止人们通过注射上传GIF?

我有一个PHP网站,人们可以在那里填写帮助票.它允许他们上传票证的屏幕截图.我允许上传gif,psd,bmp,jpg,png,tif.收到上载后,PHP脚本将忽略文件扩展名.它仅使用MIME信息标识文件类型,对于这些文件类型,它始终存储在文件的前12个字节中.

有人上传了几个GIF,当用浏览器查看时,浏览器说它无效,我的病毒扫描程序提醒我这是注射(或类似的东西).请参阅下面的包含这些GIF的zip文件.

我认为只检查标题信息是不够的.我听说图像可以完全有效,但也包含漏洞利用代码.

所以我有两个基本问题:

  1. 有谁知道他们是如何将坏东西注入GIF(同时仍然保持有效的GIF MIME类型)?如果我知道这一点,也许我可以在上传时检查它.
  2. 如何阻止某人上传此类文件?
    • 我在共享主机上,所以我无法安装服务器端病毒扫描程序.
    • 将信息提交到在线病毒扫描网站可能太慢了.
    • 有没有办法检查自己使用检查这些东西的PHP类?
    • 如果它无效,会使用GD失败调整图像大小吗?或者漏洞仍然会漏掉并进入已调整大小的图像?如果它失败了,那将是理想的,因为那时我可以使用调整大小作为一种技术来查看它们是否有效.

更新:大家,谢谢你的答复到目前为止.我试图在服务器上查找上传的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 security gd image-processing code-injection

18
推荐指数
1
解决办法
4514
查看次数

PHP使用fwrite和fread与输入流

我正在寻找将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脚本的内存中的文件的内容.

我正在寻找类似但相反的东西(输入流写入文件).感谢您提供任何帮助.

php inputstream

5
推荐指数
1
解决办法
6256
查看次数

seekg如何找到文件的结尾?

在使用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是一个寻求流的操作.这是否意味着文件的整个内容必须通过流?

请原谅我,如果我对这一切的运作方式只有基本的了解.

c++ fstream seekg

4
推荐指数
1
解决办法
4232
查看次数

std :: endl的值是否依赖于操作系统?

可能重复:
std :: endl在每个平台上完全代表什么?

我试图找出std :: endl是否返回\r\n,, \n或者\r取决于平台,或者它是否始终坚持使用.

c++ std

3
推荐指数
1
解决办法
594
查看次数

htmlspecialchars导致文本消失

我遇到了一个特定的字符串(它不是完全可打印的,但你可以在下面看到)导致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)

php html-sanitizing htmlspecialchars

2
推荐指数
1
解决办法
1466
查看次数

我们应该在SQLite事务内部还是外部绑定参数?

我有兴趣使用交易来提高绩效.

这是我目前正在做的过程:

* ~~~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)

sqlite transactions

2
推荐指数
1
解决办法
635
查看次数