summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSeiji Masugata <masugata@php.net>2006-04-03 13:04:13 +0000
committerSeiji Masugata <masugata@php.net>2006-04-03 13:04:13 +0000
commitccf09f5bbe740c11e0a2eeda39f62cc5584a22b6 (patch)
tree308f4647816adeb45902c4e2cc94ed878bb53b19
parent0946fc2fbf5dac958393124be63ac63818390452 (diff)
downloadphp-git-ccf09f5bbe740c11e0a2eeda39f62cc5584a22b6.tar.gz
added mb_check_encoding( ). detect possible invalid encoding attack(avoids a security issue).
-rw-r--r--ext/mbstring/libmbfl/mbfl/mbfilter.c4
-rw-r--r--ext/mbstring/mbstring.c60
-rw-r--r--ext/mbstring/mbstring.h1
3 files changed, 65 insertions, 0 deletions
diff --git a/ext/mbstring/libmbfl/mbfl/mbfilter.c b/ext/mbstring/libmbfl/mbfl/mbfilter.c
index 9f16331874..a8e3b68d33 100644
--- a/ext/mbstring/libmbfl/mbfl/mbfilter.c
+++ b/ext/mbstring/libmbfl/mbfl/mbfilter.c
@@ -335,6 +335,10 @@ int mbfl_buffer_illegalchars(mbfl_buffer_converter *convd)
{
int num_illegalchars = 0;
+ if (convd == NULL) {
+ return 0;
+ }
+
if (convd->filter1 != NULL) {
num_illegalchars += convd->filter1->num_illegalchar;
}
diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c
index f02ce1c76e..48f2496a71 100644
--- a/ext/mbstring/mbstring.c
+++ b/ext/mbstring/mbstring.c
@@ -253,6 +253,7 @@ function_entry mbstring_functions[] = {
PHP_FE(mb_decode_numericentity, NULL)
PHP_FE(mb_send_mail, NULL)
PHP_FE(mb_get_info, NULL)
+ PHP_FE(mb_check_encoding, NULL)
PHP_FALIAS(mbstrlen, mb_strlen, NULL)
PHP_FALIAS(mbstrpos, mb_strpos, NULL)
PHP_FALIAS(mbstrrpos, mb_strrpos, NULL)
@@ -3812,6 +3813,65 @@ PHP_FUNCTION(mb_get_info)
}
/* }}} */
+/* {{{ proto bool mb_check_encoding([string var[, string encoding]])
+ Check if the string is valid for the specified encoding */
+PHP_FUNCTION(mb_check_encoding)
+{
+ char *var = NULL;
+ int var_len;
+ char *enc = NULL;
+ int enc_len;
+ mbfl_buffer_converter *convd;
+ enum mbfl_no_encoding no_encoding = MBSTRG(current_internal_encoding);
+ mbfl_string string, result, *ret = NULL;
+ long illegalchars = 0;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|ss", &var, &var_len, &enc, &enc_len) == FAILURE) {
+ RETURN_FALSE;
+ }
+
+ if (var == NULL) {
+ RETURN_BOOL(MBSTRG(illegalchars) == 0);
+ }
+
+ if (enc != NULL) {
+ no_encoding = mbfl_name2no_encoding(enc);
+ if (no_encoding == mbfl_no_encoding_invalid || no_encoding == mbfl_no_encoding_pass) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid encoding \"%s\"", enc);
+ RETURN_FALSE;
+ }
+ }
+
+ convd = mbfl_buffer_converter_new(no_encoding, no_encoding, 0);
+ if (convd == NULL) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to create converter");
+ RETURN_FALSE;
+ }
+ mbfl_buffer_converter_illegal_mode(convd, MBSTRG(current_filter_illegal_mode));
+ mbfl_buffer_converter_illegal_substchar(convd, MBSTRG(current_filter_illegal_substchar));
+
+ /* initialize string */
+ mbfl_string_init(&string);
+ mbfl_string_init(&result);
+ string.no_encoding = no_encoding;
+ string.no_language = MBSTRG(current_language);
+
+ string.val = (unsigned char *)var;
+ string.len = var_len;
+ ret = mbfl_buffer_converter_feed_result(convd, &string, &result);
+ illegalchars = mbfl_buffer_illegalchars(convd);
+ mbfl_buffer_converter_delete(convd);
+
+ if (ret != NULL) {
+ MBSTRG(illegalchars) += illegalchars;
+ efree(ret->val);
+ RETURN_BOOL(illegalchars == 0);
+ } else {
+ RETURN_FALSE;
+ }
+}
+/* }}} */
+
/* {{{ MBSTRING_API int php_mb_encoding_translation() */
MBSTRING_API int php_mb_encoding_translation(TSRMLS_D)
{
diff --git a/ext/mbstring/mbstring.h b/ext/mbstring/mbstring.h
index 95e2616077..c64a296aab 100644
--- a/ext/mbstring/mbstring.h
+++ b/ext/mbstring/mbstring.h
@@ -117,6 +117,7 @@ PHP_FUNCTION(mb_encode_numericentity);
PHP_FUNCTION(mb_decode_numericentity);
PHP_FUNCTION(mb_send_mail);
PHP_FUNCTION(mb_get_info);
+PHP_FUNCTION(mb_check_encoding);
MBSTRING_API int php_mb_encoding_translation(TSRMLS_D);