restriction d'extension de fichier
- seularts
- Graduate


- Inscription: Jan 02, 2007
- Messages: 147
- Loc: Romania
- Status: Offline
Voici une question dub. Si ce code est censé restreindre les fichiers autres que jpg, png et gif, pourquoi est-il le faire? Il s'agit d'une application navigateur de fichiers. L'image doit être l'une des 3 extensions de fichier acceptés.
Je ne vois vraiment pas l'erreur.
Code: [ Select ]
$ext - is the var that reads the file extensions, such as exe and so on.
if (($ext == "jpg" || "gif" || "png") && ($_FILES["uploaded_file"]["type"] == "image/jpeg" || "image/gif" || "image/png") && ($_FILES["uploaded_file"]["size"] < 1000000)){
echo 'something';
}else(
echo 'none';
)
if (($ext == "jpg" || "gif" || "png") && ($_FILES["uploaded_file"]["type"] == "image/jpeg" || "image/gif" || "image/png") && ($_FILES["uploaded_file"]["size"] < 1000000)){
echo 'something';
}else(
echo 'none';
)
- $ext - is the var that reads the file extensions, such as exe and so on.
- if (($ext == "jpg" || "gif" || "png") && ($_FILES["uploaded_file"]["type"] == "image/jpeg" || "image/gif" || "image/png") && ($_FILES["uploaded_file"]["size"] < 1000000)){
- echo 'something';
- }else(
- echo 'none';
- )
Je ne vois vraiment pas l'erreur.
- Anonymous
- Bot


- Inscription: 25 Feb 2008
- Messages: ?
- Loc: Ozzuland
- Status: Online
Août 11th, 2010, 12:55 pm
- joebert
- Sledgehammer


- Inscription: Fév 10, 2004
- Messages: 13455
- Loc: Florida
- Status: Offline
Im juste aller à oublier tout ce que je sais à propos de PHP, et essayer de comprendre ce qui continue en recherchant chaque partie dans les sources de PHP.
Pour commencer, poste $. J'ai besoin de savoir où sa provenance. Il ya plusieurs façons de l'extension peut être déchiffré en utilisant PHP. Theres pathinfo ("filename", PATHINFO_EXTENSION) . Je ne sais pas comment cela détermine si l'extension. Est-il suffit de rechercher une extension sur le nom du fichier, ne l'ouvrez le fichier et regardez le contenu afin de déterminer quel type de fichier il s'agit?
Depuis Im sur un système Windows à l'heure actuelle, mauvais usage findstr pour trouver la déclaration de fonction dans le poste / / répertoire de mon exemplaire du PHP 5.3.3 source.
ce qui m'amène à "standard / string.c" ligne 1459 à trouver la déclaration.
qui, de l'apparence de celui-ci, détermine l'extension, par le suivi en arrière dans le nom du fichier à la recherche d'un point.
Cela signifie que sa possible d'usurper l'extension déterminée par pathinfo en modifiant le nom du fichier avant de télécharger le fichier.
Maintenant, puisque c'est de travailler avec des images ont été, il ya une autre façon de déterminer ce qui peut être $ poste. C'est en utilisant le getimagesize fonction et passer la mine retour constant à la image_type_to_extension () fonction.
Encore une fois, findstr aide pour traquer la déclaration de fonction, commencez par mauvais découvrir comment cette constante mime est déterminé.
Je trouve ma façon de "standard / image.c" ligne de 1294, ce qui me donne cette déclaration.
Jusqu'ici tout va bien, je vois une mention des fonctions de flux dans cette déclaration, il semble être l'ouverture du fichier et en regardant le contenu. Cela ne signifie pas nécessairement le type MIME est déterminée par le contenu mais, mieux poursuivre son enquête.
Cette partie ressemble à un bon endroit pour commencer puisque plus tard dans la déclaration de la variable itype est utilisé pour générer les valeurs de retour des éléments mime.
Depuis cela semble être une fonction thats par rapport à la "image.c fichier" Im déjà, Ill voir si je peux trouver la déclaration il ya par CTRL + F avant d'aller au findstr.
Yep, même dossier, quelques lignes sur la ligne 1219.
Cela semble prometteur. Je vois octets à partir du contenu des fichiers en cours de lecture et par rapport aux signatures connues type d'image.
Il n'a toujours pas de valider le contenu du fichier complet, c'est à dire assez rusé que quelqu'un peut être capable de glisser quelque chose de passé trouble, mais il vaut mieux que de compter sur un nom de fichier facilement modifiables bien.
Bien que <Edit> fonctions du gestionnaire d'image comme «php_handle_png" ne lire la suite dans les fichiers, ils n'ont toujours pas de valider plus loin que l'en-tête du fichier. Cela signifie simplement que, plutôt que précéder de quelques bits pour une signature image, un en-tête ensemble du dossier doit être préfixé au lieu </ Edit>
Je ne vois pas d'autres méthodes spécialement conçus pour déterminer une extension de fichier qui peut être étudié. Alors, je dois chiffre poste $ soit être déterminé en examinant les caractères des dernières années d'un nom de fichier, ou en regardant les premiers octets du fichier.
Maintenant Im se demander, comment est-$ _FILES ["id"] ["type"] a déterminé?
Im ne sais pas par où commencer la recherche de cet élément d'information mais, alors commencez à mal avec la PHP page de manuel pour le téléchargement de fichiers qui me donne ce petit morceau d'information.
Thats un grand drapeau rouge là. "Si le navigateur a fourni cette information", PHP suppose l'entité le chargement du fichier est de dire la vérité sur le fichier. Il peut être falsifiée.
Donc, à ce stade, l'indice ["size]" est à peu près sans importance. Les deux autres éléments peuvent être falsifiés.
Supposons que vous êtes permettant upload d'image, et que quelqu'un trouve où ces ajouts sont stockés et que theyre directement accessible depuis un navigateur.
A en juger par les déclarations de fonctions, et en supposant que les deux pathinfo et getimagesize sont utilisés pour vérifier l'extension, quelqu'un pourrait précéder la signature binaire d'un JPG / GIF / PNG à un script PHP, le nom de l'aide d'un jpg / gif / png extension, et télécharger un script PHP de leur propre conception de l'image dans le dossier upload.
Ce seul fait n'est pas trop mauvais. Un des paramètres par défaut sont généralement les serveurs ne va pas être configuré pour autoriser les fichiers avec les extensions image à traiter comme des scripts PHP, autant que je sache.
Toutefois, si quelque chose de theres, par exemple un générateur d'images aléatoires, dans l'annuaire et le serveur est configuré pour traiter les extensions des fichiers image comme PHP, un attaquant pourrait, connaissant le répertoire et donc le chemin vers le fichier image, d'exécuter ce fichier.
En tout état de cause, pour être sûr, il serait préférable de déterminer le type de fichier à l'aide getimagesize, puis en utilisant la valeur de retour de celui de décider qui fonctionnent sur l'image pour essayer de créer une ressource image à partir de, par exemple imagecreatefrompng et en supposant une ressource d'image valide retourné par cette fonction * imagecreate, puis confiance en elle que la fonction de l'image a à lire et à analyser le contenu du fichier complet afin de retourner un ressource d'image valide.
Il faudra un lot plus de mémoire par l'image de téléchargement, mais il sera plus sûr.
Cela est bien sûr en supposant qu'il n'ya pas de défaut dans l'un des formats de fichiers image ou les bibliothèques que le serveur utilise pour les lire. Mais thats tout un sujet complètement différent.
Pour commencer, poste $. J'ai besoin de savoir où sa provenance. Il ya plusieurs façons de l'extension peut être déchiffré en utilisant PHP. Theres pathinfo ("filename", PATHINFO_EXTENSION) . Je ne sais pas comment cela détermine si l'extension. Est-il suffit de rechercher une extension sur le nom du fichier, ne l'ouvrez le fichier et regardez le contenu afin de déterminer quel type de fichier il s'agit?
Depuis Im sur un système Windows à l'heure actuelle, mauvais usage findstr pour trouver la déclaration de fonction dans le poste / / répertoire de mon exemplaire du PHP 5.3.3 source.
Code: [ Select ]
findstr /s /i /n /c:"pathinfo" *.c
ce qui m'amène à "standard / string.c" ligne 1459 à trouver la déclaration.
C Code: [ Select ]
PHP_FUNCTION(pathinfo)
{
zval *tmp;
char *path, *ret = NULL;
int path_len, have_basename;
size_t ret_len;
long opt = PHP_PATHINFO_ALL;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &path, &path_len, &opt) == FAILURE) {
return;
}
have_basename = ((opt & PHP_PATHINFO_BASENAME) == PHP_PATHINFO_BASENAME);
MAKE_STD_ZVAL(tmp);
array_init(tmp);
if ((opt & PHP_PATHINFO_DIRNAME) == PHP_PATHINFO_DIRNAME) {
ret = estrndup(path, path_len);
php_dirname(ret, path_len);
if (*ret) {
add_assoc_string(tmp, "dirname", ret, 1);
}
efree(ret);
ret = NULL;
}
if (have_basename) {
php_basename(path, path_len, NULL, 0, &ret, &ret_len TSRMLS_CC);
add_assoc_stringl(tmp, "basename", ret, ret_len, 0);
}
if ((opt & PHP_PATHINFO_EXTENSION) == PHP_PATHINFO_EXTENSION) {
char *p;
int idx;
if (!have_basename) {
php_basename(path, path_len, NULL, 0, &ret, &ret_len TSRMLS_CC);
}
p = zend_memrchr(ret, '.', ret_len);
if (p) {
idx = p - ret;
add_assoc_stringl(tmp, "extension", ret + idx + 1, ret_len - idx - 1, 1);
}
}
if ((opt & PHP_PATHINFO_FILENAME) == PHP_PATHINFO_FILENAME) {
char *p;
int idx;
/* Have we alrady looked up the basename? */
if (!have_basename && !ret) {
php_basename(path, path_len, NULL, 0, &ret, &ret_len TSRMLS_CC);
}
p = zend_memrchr(ret, '.', ret_len);
idx = p ? (p - ret) : ret_len;
add_assoc_stringl(tmp, "filename", ret, idx, 1);
}
if (!have_basename && ret) {
efree(ret);
}
if (opt == PHP_PATHINFO_ALL) {
RETURN_ZVAL(tmp, 0, 1);
} else {
zval **element;
if (zend_hash_get_current_data(Z_ARRVAL_P(tmp), (void **) &element) == SUCCESS) {
RETVAL_ZVAL(*element, 1, 0);
} else {
ZVAL_EMPTY_STRING(return_value);
}
}
zval_ptr_dtor(&tmp);
}
{
zval *tmp;
char *path, *ret = NULL;
int path_len, have_basename;
size_t ret_len;
long opt = PHP_PATHINFO_ALL;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &path, &path_len, &opt) == FAILURE) {
return;
}
have_basename = ((opt & PHP_PATHINFO_BASENAME) == PHP_PATHINFO_BASENAME);
MAKE_STD_ZVAL(tmp);
array_init(tmp);
if ((opt & PHP_PATHINFO_DIRNAME) == PHP_PATHINFO_DIRNAME) {
ret = estrndup(path, path_len);
php_dirname(ret, path_len);
if (*ret) {
add_assoc_string(tmp, "dirname", ret, 1);
}
efree(ret);
ret = NULL;
}
if (have_basename) {
php_basename(path, path_len, NULL, 0, &ret, &ret_len TSRMLS_CC);
add_assoc_stringl(tmp, "basename", ret, ret_len, 0);
}
if ((opt & PHP_PATHINFO_EXTENSION) == PHP_PATHINFO_EXTENSION) {
char *p;
int idx;
if (!have_basename) {
php_basename(path, path_len, NULL, 0, &ret, &ret_len TSRMLS_CC);
}
p = zend_memrchr(ret, '.', ret_len);
if (p) {
idx = p - ret;
add_assoc_stringl(tmp, "extension", ret + idx + 1, ret_len - idx - 1, 1);
}
}
if ((opt & PHP_PATHINFO_FILENAME) == PHP_PATHINFO_FILENAME) {
char *p;
int idx;
/* Have we alrady looked up the basename? */
if (!have_basename && !ret) {
php_basename(path, path_len, NULL, 0, &ret, &ret_len TSRMLS_CC);
}
p = zend_memrchr(ret, '.', ret_len);
idx = p ? (p - ret) : ret_len;
add_assoc_stringl(tmp, "filename", ret, idx, 1);
}
if (!have_basename && ret) {
efree(ret);
}
if (opt == PHP_PATHINFO_ALL) {
RETURN_ZVAL(tmp, 0, 1);
} else {
zval **element;
if (zend_hash_get_current_data(Z_ARRVAL_P(tmp), (void **) &element) == SUCCESS) {
RETVAL_ZVAL(*element, 1, 0);
} else {
ZVAL_EMPTY_STRING(return_value);
}
}
zval_ptr_dtor(&tmp);
}
- PHP_FUNCTION(pathinfo)
- {
- zval *tmp;
- char *path, *ret = NULL;
- int path_len, have_basename;
- size_t ret_len;
- long opt = PHP_PATHINFO_ALL;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &path, &path_len, &opt) == FAILURE) {
- return;
- }
- have_basename = ((opt & PHP_PATHINFO_BASENAME) == PHP_PATHINFO_BASENAME);
- MAKE_STD_ZVAL(tmp);
- array_init(tmp);
- if ((opt & PHP_PATHINFO_DIRNAME) == PHP_PATHINFO_DIRNAME) {
- ret = estrndup(path, path_len);
- php_dirname(ret, path_len);
- if (*ret) {
- add_assoc_string(tmp, "dirname", ret, 1);
- }
- efree(ret);
- ret = NULL;
- }
- if (have_basename) {
- php_basename(path, path_len, NULL, 0, &ret, &ret_len TSRMLS_CC);
- add_assoc_stringl(tmp, "basename", ret, ret_len, 0);
- }
- if ((opt & PHP_PATHINFO_EXTENSION) == PHP_PATHINFO_EXTENSION) {
- char *p;
- int idx;
- if (!have_basename) {
- php_basename(path, path_len, NULL, 0, &ret, &ret_len TSRMLS_CC);
- }
- p = zend_memrchr(ret, '.', ret_len);
- if (p) {
- idx = p - ret;
- add_assoc_stringl(tmp, "extension", ret + idx + 1, ret_len - idx - 1, 1);
- }
- }
- if ((opt & PHP_PATHINFO_FILENAME) == PHP_PATHINFO_FILENAME) {
- char *p;
- int idx;
- /* Have we alrady looked up the basename? */
- if (!have_basename && !ret) {
- php_basename(path, path_len, NULL, 0, &ret, &ret_len TSRMLS_CC);
- }
- p = zend_memrchr(ret, '.', ret_len);
- idx = p ? (p - ret) : ret_len;
- add_assoc_stringl(tmp, "filename", ret, idx, 1);
- }
- if (!have_basename && ret) {
- efree(ret);
- }
- if (opt == PHP_PATHINFO_ALL) {
- RETURN_ZVAL(tmp, 0, 1);
- } else {
- zval **element;
- if (zend_hash_get_current_data(Z_ARRVAL_P(tmp), (void **) &element) == SUCCESS) {
- RETVAL_ZVAL(*element, 1, 0);
- } else {
- ZVAL_EMPTY_STRING(return_value);
- }
- }
- zval_ptr_dtor(&tmp);
- }
qui, de l'apparence de celui-ci, détermine l'extension, par le suivi en arrière dans le nom du fichier à la recherche d'un point.
Cela signifie que sa possible d'usurper l'extension déterminée par pathinfo en modifiant le nom du fichier avant de télécharger le fichier.
Maintenant, puisque c'est de travailler avec des images ont été, il ya une autre façon de déterminer ce qui peut être $ poste. C'est en utilisant le getimagesize fonction et passer la mine retour constant à la image_type_to_extension () fonction.
Encore une fois, findstr aide pour traquer la déclaration de fonction, commencez par mauvais découvrir comment cette constante mime est déterminé.
Code: [ Select ]
findstr /s /i /n /c:getimagesize" *.c
Je trouve ma façon de "standard / image.c" ligne de 1294, ce qui me donne cette déclaration.
C Code: [ Select ]
PHP_FUNCTION(getimagesize)
{
zval **info = NULL;
char *arg1, *temp;
int arg1_len, itype = 0, argc = ZEND_NUM_ARGS();
struct gfxinfo *result = NULL;
php_stream * stream = NULL;
if (zend_parse_parameters(argc TSRMLS_CC, "s|Z", &arg1, &arg1_len, &info) == FAILURE) {
return;
}
if (argc == 2) {
zval_dtor(*info);
array_init(*info);
}
stream = php_stream_open_wrapper(arg1, "rb", STREAM_MUST_SEEK|REPORT_ERRORS|IGNORE_PATH|ENFORCE_SAFE_MODE, NULL);
if (!stream) {
RETURN_FALSE;
}
itype = php_getimagetype(stream, NULL TSRMLS_CC);
switch( itype) {
case IMAGE_FILETYPE_GIF:
result = php_handle_gif(stream TSRMLS_CC);
break;
case IMAGE_FILETYPE_JPEG:
if (info) {
result = php_handle_jpeg(stream, *info TSRMLS_CC);
} else {
result = php_handle_jpeg(stream, NULL TSRMLS_CC);
}
break;
case IMAGE_FILETYPE_PNG:
result = php_handle_png(stream TSRMLS_CC);
break;
case IMAGE_FILETYPE_SWF:
result = php_handle_swf(stream TSRMLS_CC);
break;
case IMAGE_FILETYPE_SWC:
#if HAVE_ZLIB && !defined(COMPILE_DL_ZLIB)
result = php_handle_swc(stream TSRMLS_CC);
#else
php_error_docref(NULL TSRMLS_CC, E_NOTICE, "The image is a compressed SWF file, but you do not have a static version of the zlib extension enabled");
#endif
break;
case IMAGE_FILETYPE_PSD:
result = php_handle_psd(stream TSRMLS_CC);
break;
case IMAGE_FILETYPE_BMP:
result = php_handle_bmp(stream TSRMLS_CC);
break;
case IMAGE_FILETYPE_TIFF_II:
result = php_handle_tiff(stream, NULL, 0 TSRMLS_CC);
break;
case IMAGE_FILETYPE_TIFF_MM:
result = php_handle_tiff(stream, NULL, 1 TSRMLS_CC);
break;
case IMAGE_FILETYPE_JPC:
result = php_handle_jpc(stream TSRMLS_CC);
break;
case IMAGE_FILETYPE_JP2:
result = php_handle_jp2(stream TSRMLS_CC);
break;
case IMAGE_FILETYPE_IFF:
result = php_handle_iff(stream TSRMLS_CC);
break;
case IMAGE_FILETYPE_WBMP:
result = php_handle_wbmp(stream TSRMLS_CC);
break;
case IMAGE_FILETYPE_XBM:
result = php_handle_xbm(stream TSRMLS_CC);
break;
case IMAGE_FILETYPE_ICO:
result = php_handle_ico(stream TSRMLS_CC);
break;
default:
case IMAGE_FILETYPE_UNKNOWN:
break;
}
php_stream_close(stream);
if (result) {
array_init(return_value);
add_index_long(return_value, 0, result->width);
add_index_long(return_value, 1, result->height);
add_index_long(return_value, 2, itype);
spprintf(&temp, 0, "width=\"%d\" height=\"%d\"", result->width, result->height);
add_index_string(return_value, 3, temp, 0);
if (result->bits != 0) {
add_assoc_long(return_value, "bits", result->bits);
}
if (result->channels != 0) {
add_assoc_long(return_value, "channels", result->channels);
}
add_assoc_string(return_value, "mime", (char*)php_image_type_to_mime_type(itype), 1);
efree(result);
} else {
RETURN_FALSE;
}
}
{
zval **info = NULL;
char *arg1, *temp;
int arg1_len, itype = 0, argc = ZEND_NUM_ARGS();
struct gfxinfo *result = NULL;
php_stream * stream = NULL;
if (zend_parse_parameters(argc TSRMLS_CC, "s|Z", &arg1, &arg1_len, &info) == FAILURE) {
return;
}
if (argc == 2) {
zval_dtor(*info);
array_init(*info);
}
stream = php_stream_open_wrapper(arg1, "rb", STREAM_MUST_SEEK|REPORT_ERRORS|IGNORE_PATH|ENFORCE_SAFE_MODE, NULL);
if (!stream) {
RETURN_FALSE;
}
itype = php_getimagetype(stream, NULL TSRMLS_CC);
switch( itype) {
case IMAGE_FILETYPE_GIF:
result = php_handle_gif(stream TSRMLS_CC);
break;
case IMAGE_FILETYPE_JPEG:
if (info) {
result = php_handle_jpeg(stream, *info TSRMLS_CC);
} else {
result = php_handle_jpeg(stream, NULL TSRMLS_CC);
}
break;
case IMAGE_FILETYPE_PNG:
result = php_handle_png(stream TSRMLS_CC);
break;
case IMAGE_FILETYPE_SWF:
result = php_handle_swf(stream TSRMLS_CC);
break;
case IMAGE_FILETYPE_SWC:
#if HAVE_ZLIB && !defined(COMPILE_DL_ZLIB)
result = php_handle_swc(stream TSRMLS_CC);
#else
php_error_docref(NULL TSRMLS_CC, E_NOTICE, "The image is a compressed SWF file, but you do not have a static version of the zlib extension enabled");
#endif
break;
case IMAGE_FILETYPE_PSD:
result = php_handle_psd(stream TSRMLS_CC);
break;
case IMAGE_FILETYPE_BMP:
result = php_handle_bmp(stream TSRMLS_CC);
break;
case IMAGE_FILETYPE_TIFF_II:
result = php_handle_tiff(stream, NULL, 0 TSRMLS_CC);
break;
case IMAGE_FILETYPE_TIFF_MM:
result = php_handle_tiff(stream, NULL, 1 TSRMLS_CC);
break;
case IMAGE_FILETYPE_JPC:
result = php_handle_jpc(stream TSRMLS_CC);
break;
case IMAGE_FILETYPE_JP2:
result = php_handle_jp2(stream TSRMLS_CC);
break;
case IMAGE_FILETYPE_IFF:
result = php_handle_iff(stream TSRMLS_CC);
break;
case IMAGE_FILETYPE_WBMP:
result = php_handle_wbmp(stream TSRMLS_CC);
break;
case IMAGE_FILETYPE_XBM:
result = php_handle_xbm(stream TSRMLS_CC);
break;
case IMAGE_FILETYPE_ICO:
result = php_handle_ico(stream TSRMLS_CC);
break;
default:
case IMAGE_FILETYPE_UNKNOWN:
break;
}
php_stream_close(stream);
if (result) {
array_init(return_value);
add_index_long(return_value, 0, result->width);
add_index_long(return_value, 1, result->height);
add_index_long(return_value, 2, itype);
spprintf(&temp, 0, "width=\"%d\" height=\"%d\"", result->width, result->height);
add_index_string(return_value, 3, temp, 0);
if (result->bits != 0) {
add_assoc_long(return_value, "bits", result->bits);
}
if (result->channels != 0) {
add_assoc_long(return_value, "channels", result->channels);
}
add_assoc_string(return_value, "mime", (char*)php_image_type_to_mime_type(itype), 1);
efree(result);
} else {
RETURN_FALSE;
}
}
- PHP_FUNCTION(getimagesize)
- {
- zval **info = NULL;
- char *arg1, *temp;
- int arg1_len, itype = 0, argc = ZEND_NUM_ARGS();
- struct gfxinfo *result = NULL;
- php_stream * stream = NULL;
- if (zend_parse_parameters(argc TSRMLS_CC, "s|Z", &arg1, &arg1_len, &info) == FAILURE) {
- return;
- }
- if (argc == 2) {
- zval_dtor(*info);
- array_init(*info);
- }
- stream = php_stream_open_wrapper(arg1, "rb", STREAM_MUST_SEEK|REPORT_ERRORS|IGNORE_PATH|ENFORCE_SAFE_MODE, NULL);
- if (!stream) {
- RETURN_FALSE;
- }
- itype = php_getimagetype(stream, NULL TSRMLS_CC);
- switch( itype) {
- case IMAGE_FILETYPE_GIF:
- result = php_handle_gif(stream TSRMLS_CC);
- break;
- case IMAGE_FILETYPE_JPEG:
- if (info) {
- result = php_handle_jpeg(stream, *info TSRMLS_CC);
- } else {
- result = php_handle_jpeg(stream, NULL TSRMLS_CC);
- }
- break;
- case IMAGE_FILETYPE_PNG:
- result = php_handle_png(stream TSRMLS_CC);
- break;
- case IMAGE_FILETYPE_SWF:
- result = php_handle_swf(stream TSRMLS_CC);
- break;
- case IMAGE_FILETYPE_SWC:
- #if HAVE_ZLIB && !defined(COMPILE_DL_ZLIB)
- result = php_handle_swc(stream TSRMLS_CC);
- #else
- php_error_docref(NULL TSRMLS_CC, E_NOTICE, "The image is a compressed SWF file, but you do not have a static version of the zlib extension enabled");
- #endif
- break;
- case IMAGE_FILETYPE_PSD:
- result = php_handle_psd(stream TSRMLS_CC);
- break;
- case IMAGE_FILETYPE_BMP:
- result = php_handle_bmp(stream TSRMLS_CC);
- break;
- case IMAGE_FILETYPE_TIFF_II:
- result = php_handle_tiff(stream, NULL, 0 TSRMLS_CC);
- break;
- case IMAGE_FILETYPE_TIFF_MM:
- result = php_handle_tiff(stream, NULL, 1 TSRMLS_CC);
- break;
- case IMAGE_FILETYPE_JPC:
- result = php_handle_jpc(stream TSRMLS_CC);
- break;
- case IMAGE_FILETYPE_JP2:
- result = php_handle_jp2(stream TSRMLS_CC);
- break;
- case IMAGE_FILETYPE_IFF:
- result = php_handle_iff(stream TSRMLS_CC);
- break;
- case IMAGE_FILETYPE_WBMP:
- result = php_handle_wbmp(stream TSRMLS_CC);
- break;
- case IMAGE_FILETYPE_XBM:
- result = php_handle_xbm(stream TSRMLS_CC);
- break;
- case IMAGE_FILETYPE_ICO:
- result = php_handle_ico(stream TSRMLS_CC);
- break;
- default:
- case IMAGE_FILETYPE_UNKNOWN:
- break;
- }
- php_stream_close(stream);
- if (result) {
- array_init(return_value);
- add_index_long(return_value, 0, result->width);
- add_index_long(return_value, 1, result->height);
- add_index_long(return_value, 2, itype);
- spprintf(&temp, 0, "width=\"%d\" height=\"%d\"", result->width, result->height);
- add_index_string(return_value, 3, temp, 0);
- if (result->bits != 0) {
- add_assoc_long(return_value, "bits", result->bits);
- }
- if (result->channels != 0) {
- add_assoc_long(return_value, "channels", result->channels);
- }
- add_assoc_string(return_value, "mime", (char*)php_image_type_to_mime_type(itype), 1);
- efree(result);
- } else {
- RETURN_FALSE;
- }
- }
Jusqu'ici tout va bien, je vois une mention des fonctions de flux dans cette déclaration, il semble être l'ouverture du fichier et en regardant le contenu. Cela ne signifie pas nécessairement le type MIME est déterminée par le contenu mais, mieux poursuivre son enquête.
Cette partie ressemble à un bon endroit pour commencer puisque plus tard dans la déclaration de la variable itype est utilisé pour générer les valeurs de retour des éléments mime.
C Code: [ Select ]
itype = php_getimagetype(stream, NULL TSRMLS_CC);
Depuis cela semble être une fonction thats par rapport à la "image.c fichier" Im déjà, Ill voir si je peux trouver la déclaration il ya par CTRL + F avant d'aller au findstr.
Yep, même dossier, quelques lignes sur la ligne 1219.
C Code: [ Select ]
PHPAPI int php_getimagetype(php_stream * stream, char *filetype TSRMLS_DC)
{
char tmp[12];
if ( !filetype) filetype = tmp;
if((php_stream_read(stream, filetype, 3)) != 3) {
php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Read error!");
return IMAGE_FILETYPE_UNKNOWN;
}
/* BYTES READ: 3 */
if (!memcmp(filetype, php_sig_gif, 3)) {
return IMAGE_FILETYPE_GIF;
} else if (!memcmp(filetype, php_sig_jpg, 3)) {
return IMAGE_FILETYPE_JPEG;
} else if (!memcmp(filetype, php_sig_png, 3)) {
if (php_stream_read(stream, filetype+3, 5) != 5) {
php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Read error!");
return IMAGE_FILETYPE_UNKNOWN;
}
if (!memcmp(filetype, php_sig_png, 8)) {
return IMAGE_FILETYPE_PNG;
} else {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "PNG file corrupted by ASCII conversion");
return IMAGE_FILETYPE_UNKNOWN;
}
} else if (!memcmp(filetype, php_sig_swf, 3)) {
return IMAGE_FILETYPE_SWF;
} else if (!memcmp(filetype, php_sig_swc, 3)) {
return IMAGE_FILETYPE_SWC;
} else if (!memcmp(filetype, php_sig_psd, 3)) {
return IMAGE_FILETYPE_PSD;
} else if (!memcmp(filetype, php_sig_bmp, 2)) {
return IMAGE_FILETYPE_BMP;
} else if (!memcmp(filetype, php_sig_jpc, 3)) {
return IMAGE_FILETYPE_JPC;
}
if (php_stream_read(stream, filetype+3, 1) != 1) {
php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Read error!");
return IMAGE_FILETYPE_UNKNOWN;
}
/* BYTES READ: 4 */
if (!memcmp(filetype, php_sig_tif_ii, 4)) {
return IMAGE_FILETYPE_TIFF_II;
} else if (!memcmp(filetype, php_sig_tif_mm, 4)) {
return IMAGE_FILETYPE_TIFF_MM;
} else if (!memcmp(filetype, php_sig_iff, 4)) {
return IMAGE_FILETYPE_IFF;
} else if (!memcmp(filetype, php_sig_ico, 3)) {
return IMAGE_FILETYPE_ICO;
}
if (php_stream_read(stream, filetype+4, 8) != 8) {
php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Read error!");
return IMAGE_FILETYPE_UNKNOWN;
}
/* BYTES READ: 12 */
if (!memcmp(filetype, php_sig_jp2, 12)) {
return IMAGE_FILETYPE_JP2;
}
/* AFTER ALL ABOVE FAILED */
if (php_get_wbmp(stream, NULL, 1 TSRMLS_CC)) {
return IMAGE_FILETYPE_WBMP;
}
if (php_get_xbm(stream, NULL TSRMLS_CC)) {
return IMAGE_FILETYPE_XBM;
}
return IMAGE_FILETYPE_UNKNOWN;
}
{
char tmp[12];
if ( !filetype) filetype = tmp;
if((php_stream_read(stream, filetype, 3)) != 3) {
php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Read error!");
return IMAGE_FILETYPE_UNKNOWN;
}
/* BYTES READ: 3 */
if (!memcmp(filetype, php_sig_gif, 3)) {
return IMAGE_FILETYPE_GIF;
} else if (!memcmp(filetype, php_sig_jpg, 3)) {
return IMAGE_FILETYPE_JPEG;
} else if (!memcmp(filetype, php_sig_png, 3)) {
if (php_stream_read(stream, filetype+3, 5) != 5) {
php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Read error!");
return IMAGE_FILETYPE_UNKNOWN;
}
if (!memcmp(filetype, php_sig_png, 8)) {
return IMAGE_FILETYPE_PNG;
} else {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "PNG file corrupted by ASCII conversion");
return IMAGE_FILETYPE_UNKNOWN;
}
} else if (!memcmp(filetype, php_sig_swf, 3)) {
return IMAGE_FILETYPE_SWF;
} else if (!memcmp(filetype, php_sig_swc, 3)) {
return IMAGE_FILETYPE_SWC;
} else if (!memcmp(filetype, php_sig_psd, 3)) {
return IMAGE_FILETYPE_PSD;
} else if (!memcmp(filetype, php_sig_bmp, 2)) {
return IMAGE_FILETYPE_BMP;
} else if (!memcmp(filetype, php_sig_jpc, 3)) {
return IMAGE_FILETYPE_JPC;
}
if (php_stream_read(stream, filetype+3, 1) != 1) {
php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Read error!");
return IMAGE_FILETYPE_UNKNOWN;
}
/* BYTES READ: 4 */
if (!memcmp(filetype, php_sig_tif_ii, 4)) {
return IMAGE_FILETYPE_TIFF_II;
} else if (!memcmp(filetype, php_sig_tif_mm, 4)) {
return IMAGE_FILETYPE_TIFF_MM;
} else if (!memcmp(filetype, php_sig_iff, 4)) {
return IMAGE_FILETYPE_IFF;
} else if (!memcmp(filetype, php_sig_ico, 3)) {
return IMAGE_FILETYPE_ICO;
}
if (php_stream_read(stream, filetype+4, 8) != 8) {
php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Read error!");
return IMAGE_FILETYPE_UNKNOWN;
}
/* BYTES READ: 12 */
if (!memcmp(filetype, php_sig_jp2, 12)) {
return IMAGE_FILETYPE_JP2;
}
/* AFTER ALL ABOVE FAILED */
if (php_get_wbmp(stream, NULL, 1 TSRMLS_CC)) {
return IMAGE_FILETYPE_WBMP;
}
if (php_get_xbm(stream, NULL TSRMLS_CC)) {
return IMAGE_FILETYPE_XBM;
}
return IMAGE_FILETYPE_UNKNOWN;
}
- PHPAPI int php_getimagetype(php_stream * stream, char *filetype TSRMLS_DC)
- {
- char tmp[12];
- if ( !filetype) filetype = tmp;
- if((php_stream_read(stream, filetype, 3)) != 3) {
- php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Read error!");
- return IMAGE_FILETYPE_UNKNOWN;
- }
- /* BYTES READ: 3 */
- if (!memcmp(filetype, php_sig_gif, 3)) {
- return IMAGE_FILETYPE_GIF;
- } else if (!memcmp(filetype, php_sig_jpg, 3)) {
- return IMAGE_FILETYPE_JPEG;
- } else if (!memcmp(filetype, php_sig_png, 3)) {
- if (php_stream_read(stream, filetype+3, 5) != 5) {
- php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Read error!");
- return IMAGE_FILETYPE_UNKNOWN;
- }
- if (!memcmp(filetype, php_sig_png, 8)) {
- return IMAGE_FILETYPE_PNG;
- } else {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "PNG file corrupted by ASCII conversion");
- return IMAGE_FILETYPE_UNKNOWN;
- }
- } else if (!memcmp(filetype, php_sig_swf, 3)) {
- return IMAGE_FILETYPE_SWF;
- } else if (!memcmp(filetype, php_sig_swc, 3)) {
- return IMAGE_FILETYPE_SWC;
- } else if (!memcmp(filetype, php_sig_psd, 3)) {
- return IMAGE_FILETYPE_PSD;
- } else if (!memcmp(filetype, php_sig_bmp, 2)) {
- return IMAGE_FILETYPE_BMP;
- } else if (!memcmp(filetype, php_sig_jpc, 3)) {
- return IMAGE_FILETYPE_JPC;
- }
- if (php_stream_read(stream, filetype+3, 1) != 1) {
- php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Read error!");
- return IMAGE_FILETYPE_UNKNOWN;
- }
- /* BYTES READ: 4 */
- if (!memcmp(filetype, php_sig_tif_ii, 4)) {
- return IMAGE_FILETYPE_TIFF_II;
- } else if (!memcmp(filetype, php_sig_tif_mm, 4)) {
- return IMAGE_FILETYPE_TIFF_MM;
- } else if (!memcmp(filetype, php_sig_iff, 4)) {
- return IMAGE_FILETYPE_IFF;
- } else if (!memcmp(filetype, php_sig_ico, 3)) {
- return IMAGE_FILETYPE_ICO;
- }
- if (php_stream_read(stream, filetype+4, 8) != 8) {
- php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Read error!");
- return IMAGE_FILETYPE_UNKNOWN;
- }
- /* BYTES READ: 12 */
- if (!memcmp(filetype, php_sig_jp2, 12)) {
- return IMAGE_FILETYPE_JP2;
- }
- /* AFTER ALL ABOVE FAILED */
- if (php_get_wbmp(stream, NULL, 1 TSRMLS_CC)) {
- return IMAGE_FILETYPE_WBMP;
- }
- if (php_get_xbm(stream, NULL TSRMLS_CC)) {
- return IMAGE_FILETYPE_XBM;
- }
- return IMAGE_FILETYPE_UNKNOWN;
- }
Cela semble prometteur. Je vois octets à partir du contenu des fichiers en cours de lecture et par rapport aux signatures connues type d'image.
Il n'a toujours pas de valider le contenu du fichier complet, c'est à dire assez rusé que quelqu'un peut être capable de glisser quelque chose de passé trouble, mais il vaut mieux que de compter sur un nom de fichier facilement modifiables bien.
Bien que <Edit> fonctions du gestionnaire d'image comme «php_handle_png" ne lire la suite dans les fichiers, ils n'ont toujours pas de valider plus loin que l'en-tête du fichier. Cela signifie simplement que, plutôt que précéder de quelques bits pour une signature image, un en-tête ensemble du dossier doit être préfixé au lieu </ Edit>
Je ne vois pas d'autres méthodes spécialement conçus pour déterminer une extension de fichier qui peut être étudié. Alors, je dois chiffre poste $ soit être déterminé en examinant les caractères des dernières années d'un nom de fichier, ou en regardant les premiers octets du fichier.
Maintenant Im se demander, comment est-$ _FILES ["id"] ["type"] a déterminé?
Im ne sais pas par où commencer la recherche de cet élément d'information mais, alors commencez à mal avec la PHP page de manuel pour le téléchargement de fichiers qui me donne ce petit morceau d'information.
Quote:
$ _FILES ["Userfile"] ["type"]
Le type MIME du fichier, si le navigateur a fourni cette information . Un exemple serait "image / gif". Ce type mime n'est cependant pas vérifié du côté de PHP et ne tiennent donc pas sa valeur de soi.
Le type MIME du fichier, si le navigateur a fourni cette information . Un exemple serait "image / gif". Ce type mime n'est cependant pas vérifié du côté de PHP et ne tiennent donc pas sa valeur de soi.
Thats un grand drapeau rouge là. "Si le navigateur a fourni cette information", PHP suppose l'entité le chargement du fichier est de dire la vérité sur le fichier. Il peut être falsifiée.
Donc, à ce stade, l'indice ["size]" est à peu près sans importance. Les deux autres éléments peuvent être falsifiés.
Supposons que vous êtes permettant upload d'image, et que quelqu'un trouve où ces ajouts sont stockés et que theyre directement accessible depuis un navigateur.
A en juger par les déclarations de fonctions, et en supposant que les deux pathinfo et getimagesize sont utilisés pour vérifier l'extension, quelqu'un pourrait précéder la signature binaire d'un JPG / GIF / PNG à un script PHP, le nom de l'aide d'un jpg / gif / png extension, et télécharger un script PHP de leur propre conception de l'image dans le dossier upload.
Ce seul fait n'est pas trop mauvais. Un des paramètres par défaut sont généralement les serveurs ne va pas être configuré pour autoriser les fichiers avec les extensions image à traiter comme des scripts PHP, autant que je sache.
Toutefois, si quelque chose de theres, par exemple un générateur d'images aléatoires, dans l'annuaire et le serveur est configuré pour traiter les extensions des fichiers image comme PHP, un attaquant pourrait, connaissant le répertoire et donc le chemin vers le fichier image, d'exécuter ce fichier.
En tout état de cause, pour être sûr, il serait préférable de déterminer le type de fichier à l'aide getimagesize, puis en utilisant la valeur de retour de celui de décider qui fonctionnent sur l'image pour essayer de créer une ressource image à partir de, par exemple imagecreatefrompng et en supposant une ressource d'image valide retourné par cette fonction * imagecreate, puis confiance en elle que la fonction de l'image a à lire et à analyser le contenu du fichier complet afin de retourner un ressource d'image valide.
Il faudra un lot plus de mémoire par l'image de téléchargement, mais il sera plus sûr.
Cela est bien sûr en supposant qu'il n'ya pas de défaut dans l'un des formats de fichiers image ou les bibliothèques que le serveur utilise pour les lire. Mais thats tout un sujet complètement différent.
Strong with this one, the sudo is.
- seularts
- Graduate


- Inscription: Jan 02, 2007
- Messages: 147
- Loc: Romania
- Status: Offline
Désolé j'ai oublié de dire qu'il vient de sauter l'instruction if. Exe $ viens de lire vers l'arrière le nom du fichier d'extraction que l'extension et de le comparer avec ce qui est dans l'instruction if. J'ai pensé à elle en fin de compte, mais ..
Cela a été le principal problème. Je n'ai toujours aucune idée pourquoi il a travaillé auparavant dans la première forme et maintenant je dû faire appel à la seconde pour le rendre utilisable!?
Code: [ Select ]
if (($ext == "jpg" || "gif" || "png") && ($_FILES["uploaded_file"]["type"] == "image/jpeg" || "image/gif" || "image/png") && ($_FILES["uploaded_file"]["size"] < 1000000))
had to be changed into
if (($ext == "jpg" || $ext == "gif" || $ext == "png") && ($_FILES["uploaded_file"]["type"] == "image/jpeg" || $_FILES["uploaded_file"]["type"] == "image/gif" || $_FILES["uploaded_file"]["type"] == "image/png") && ($_FILES["uploaded_file"]["size"] < 1000000))
had to be changed into
if (($ext == "jpg" || $ext == "gif" || $ext == "png") && ($_FILES["uploaded_file"]["type"] == "image/jpeg" || $_FILES["uploaded_file"]["type"] == "image/gif" || $_FILES["uploaded_file"]["type"] == "image/png") && ($_FILES["uploaded_file"]["size"] < 1000000))
- if (($ext == "jpg" || "gif" || "png") && ($_FILES["uploaded_file"]["type"] == "image/jpeg" || "image/gif" || "image/png") && ($_FILES["uploaded_file"]["size"] < 1000000))
- had to be changed into
- if (($ext == "jpg" || $ext == "gif" || $ext == "png") && ($_FILES["uploaded_file"]["type"] == "image/jpeg" || $_FILES["uploaded_file"]["type"] == "image/gif" || $_FILES["uploaded_file"]["type"] == "image/png") && ($_FILES["uploaded_file"]["size"] < 1000000))
Cela a été le principal problème. Je n'ai toujours aucune idée pourquoi il a travaillé auparavant dans la première forme et maintenant je dû faire appel à la seconde pour le rendre utilisable!?
- joebert
- Sledgehammer


- Inscription: Fév 10, 2004
- Messages: 13455
- Loc: Florida
- Status: Offline
Peut-être que la première version n'a pas été testé suffisamment en profondeur et il me semblait-il fonctionné?
Je suppose qu'il aurait pu être deux versions de PHP utilisées entre alors et maintenant, et qu'il y avait un changement de priorité des opérateurs entre ces deux versions qui a modifié le comportement de ceux "A == B | C |" bits que vous avez là. Je ne me souviens pas de l'audience d'un tel changement, youd ont à examiner que dans le changelog de PHP sur votre propre.
J'ai le pressentiment que sa chose que le pas testé à fond assez bien.
Je suppose qu'il aurait pu être deux versions de PHP utilisées entre alors et maintenant, et qu'il y avait un changement de priorité des opérateurs entre ces deux versions qui a modifié le comportement de ceux "A == B | C |" bits que vous avez là. Je ne me souviens pas de l'audience d'un tel changement, youd ont à examiner que dans le changelog de PHP sur votre propre.
J'ai le pressentiment que sa chose que le pas testé à fond assez bien.
Strong with this one, the sudo is.
Page 1 sur 1
Pour répondre à ce sujet, vous devez vous connecter ou vous enregistrer. Il est gratuit.
Afficher de l'information
- Total des messages de ce sujet: 4 messages
- Utilisateurs parcourant ce forum: Kurthead+1, ScottG et 114 invités
- Vous ne pouvez pas poster de nouveaux sujets
- Vous ne pouvez pas répondre aux sujets
- Vous ne pouvez pas éditer vos messages
- Vous ne pouvez pas supprimer vos messages
- Vous ne pouvez pas joindre des fichiers
