我有一个接受图像复制/粘贴的TinyMCE表单。当您完成评论后,按“发布”并提交表单,解析内容并显示在屏幕对话中。
我正在尝试使用preg_match_all从POSTed变量中提取base64编码数据。我的大多数模式都有效,但是这个模式导致Apache崩溃。
<img src="data:image/(png|PNG|gif|GIF|jpg|JPG|jpeg|JPEG);base64,([a-zA-Z0-9+/=])*
崩溃是沉默的,我从Apache / PHP获得的唯一提示是error.log文件中的一行:
[错误]孩子死于信号11
我已经将它缩小到preg_match_all中的这个模式,并且事实上我在第二个组之后有一个*,它包含一个类定义,旨在跟随base64字符到它们的引号终止。
这里有样本图像(文本文件,base64编码): https://cloud.highpoweredhelp.com/index.php/s/hnIaFmK9vTCOmcU
我唯一能想到的是“*”过于贪婪并且消耗太多内存。但是,有两个问题:
系统: Debian Wheezy 7.9上的Apache v2.2.22 PHP版本:5.6.16使用以下配置从源代码编译:
./configure --with-config-file-path=/etc/php5/apache2 \
--with-pear=/usr/share/php \
--with-bz2 \
--with-curl \
--with-gd \
--enable-calendar \
--enable-mbstring \
--enable-bcmath \
--enable-sockets \
--with-libxml-dir \
--with-mysqli \
--with-mysql \
--with-openssl \
--with-regex=php \
--with-readline \
--with-zlib \
--with-apxs2=/usr/bin/apxs2 \
--enable-soap \
--with-freetype-dir=/usr/include/freetype2/ \
--with-freetype \
--with-mcrypt=/usr/src/mcrypt-2.6.8 \
--with-jpeg-dir=/usr/lib/x86_64-linux-gnu/ \
--with-png-dir=/usr/lib/x86_64-linux-gnu/
答案 0 :(得分:2)
您真的打算([a-zA-Z0-9+/=]*)
而不是([a-zA-Z0-9+/=])*
后一种模式只能获得base64序列的最终字符,但似乎很快就会导致分段错误。我能够使用该模式使用相对较短的字符串来崩溃命令行应用程序:
#this segfaulted for me, a shorter string did succeed
$str='<img src="data:image/png;base64,'.str_repeat('0123456789',1000);
if (preg_match('{<img src="data:image/(png|PNG|gif|GIF|jpg|JPG|jpeg|JPEG);base64,([a-zA-Z0-9+/=])*}', $str, $match)){
print "matched";
}
([a-zA-Z0-9+/=]*)
模式将捕获每个角色,并且不会崩溃!