Enable users to set the HTML tags to rewrite

through a configuration directive
This commit is contained in:
Sascha Schumann 2000-10-16 17:25:36 +00:00
parent 8f5e25598a
commit 1c85ad029b
5 changed files with 191 additions and 103 deletions

View File

@ -718,6 +718,9 @@ PHP_MINIT_FUNCTION(basic)
PHP_MINIT(syslog)(INIT_FUNC_ARGS_PASSTHRU); PHP_MINIT(syslog)(INIT_FUNC_ARGS_PASSTHRU);
PHP_MINIT(array)(INIT_FUNC_ARGS_PASSTHRU); PHP_MINIT(array)(INIT_FUNC_ARGS_PASSTHRU);
PHP_MINIT(assert)(INIT_FUNC_ARGS_PASSTHRU); PHP_MINIT(assert)(INIT_FUNC_ARGS_PASSTHRU);
#ifdef TRANS_SID
PHP_MINIT(url_scanner_ex)(INIT_FUNC_ARGS_PASSTHRU);
#endif
if(PG(allow_url_fopen)) { if(PG(allow_url_fopen)) {
if(FAILURE==php_register_url_wrapper("http",php_fopen_url_wrap_http)) { if(FAILURE==php_register_url_wrapper("http",php_fopen_url_wrap_http)) {
@ -759,7 +762,7 @@ PHP_MSHUTDOWN_FUNCTION(basic)
PHP_MSHUTDOWN(browscap)(SHUTDOWN_FUNC_ARGS_PASSTHRU); PHP_MSHUTDOWN(browscap)(SHUTDOWN_FUNC_ARGS_PASSTHRU);
PHP_MSHUTDOWN(array)(SHUTDOWN_FUNC_ARGS_PASSTHRU); PHP_MSHUTDOWN(array)(SHUTDOWN_FUNC_ARGS_PASSTHRU);
PHP_MSHUTDOWN(assert)(SHUTDOWN_FUNC_ARGS_PASSTHRU); PHP_MSHUTDOWN(assert)(SHUTDOWN_FUNC_ARGS_PASSTHRU);
PHP_MSHUTDOWN(url_scanner_ex)(SHUTDOWN_FUNC_ARGS_PASSTHRU);
return SUCCESS; return SUCCESS;
} }

View File

@ -1,4 +1,4 @@
/* Generated by re2c 0.5 on Wed Oct 4 20:04:55 2000 */ /* Generated by re2c 0.5 on Mon Oct 16 00:15:52 2000 */
#line 1 "/home/sas/src/php4/ext/standard/url_scanner_ex.re" #line 1 "/home/sas/src/php4/ext/standard/url_scanner_ex.re"
/* /*
+----------------------------------------------------------------------+ +----------------------------------------------------------------------+
@ -30,6 +30,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include "php_ini.h"
#include "php_globals.h" #include "php_globals.h"
#define STATE_TAG SOME_OTHER_STATE_TAG #define STATE_TAG SOME_OTHER_STATE_TAG
#include "basic_functions.h" #include "basic_functions.h"
@ -40,6 +41,54 @@
#include "php_smart_str.h" #include "php_smart_str.h"
static PHP_INI_MH(OnUpdateTags)
{
url_adapt_state_ex_t *ctx;
char *key;
char *lasts;
char *tmp;
BLS_FETCH();
ctx = &BG(url_adapt_state_ex);
tmp = estrndup(new_value, new_value_length);
if (ctx->tags)
zend_hash_destroy(ctx->tags);
else
ctx->tags = malloc(sizeof(HashTable));
zend_hash_init(ctx->tags, 0, NULL, NULL, 1);
for (key = php_strtok_r(tmp, ",", &lasts);
key;
key = php_strtok_r(NULL, ",", &lasts)) {
char *val;
val = strchr(key, '=');
if (val) {
char *q;
int keylen;
*val++ = '\0';
for (q = key; *q; q++)
*q = tolower(*q);
keylen = q - key;
/* key is stored withOUT NUL
val is stored WITH NUL */
zend_hash_add(ctx->tags, key, keylen, val, strlen(val)+1, NULL);
}
}
efree(tmp);
return SUCCESS;
}
PHP_INI_BEGIN()
STD_PHP_INI_ENTRY("url_rewriter.tags", "a=href,area=href,frame=src,form=fakeentry", PHP_INI_ALL, OnUpdateTags, url_adapt_state_ex, php_basic_globals, basic_globals)
PHP_INI_END()
static inline void append_modified_url(smart_str *url, smart_str *dest, smart_str *name, smart_str *val, const char *separator) static inline void append_modified_url(smart_str *url, smart_str *dest, smart_str *name, smart_str *val, const char *separator)
{ {
register const char *p, *q; register const char *p, *q;
@ -62,6 +111,12 @@ static inline void append_modified_url(smart_str *url, smart_str *dest, smart_st
} }
} }
/* Don't modify URLs of the format "#mark" */
if (bash - url->c == 0) {
smart_str_append(dest, url);
return;
}
if (bash) if (bash)
smart_str_appendl(dest, url->c, bash - url->c); smart_str_appendl(dest, url->c, bash - url->c);
else else
@ -76,47 +131,20 @@ static inline void append_modified_url(smart_str *url, smart_str *dest, smart_st
smart_str_appendl(dest, bash, q - bash); smart_str_appendl(dest, bash, q - bash);
} }
struct php_tag_arg {
char *tag;
int taglen;
char *arg;
int arglen;
};
#define TAG_ARG_ENTRY(a,b) {#a,sizeof(#a)-1,#b,sizeof(#b)-1},
static struct php_tag_arg check_tag_arg[] = {
TAG_ARG_ENTRY(a, href)
TAG_ARG_ENTRY(area, href)
TAG_ARG_ENTRY(frame, src)
TAG_ARG_ENTRY(img, src)
TAG_ARG_ENTRY(input, src)
TAG_ARG_ENTRY(form, fake_entry_for_passing_on_form_tag)
{0}
};
static inline void tag_arg(url_adapt_state_ex_t *ctx PLS_DC) static inline void tag_arg(url_adapt_state_ex_t *ctx PLS_DC)
{ {
char f = 0; char f = 0;
int i;
for (i = 0; check_tag_arg[i].tag; i++) { if (strncasecmp(ctx->arg.c, ctx->lookup_data, ctx->arg.len) == 0)
if (check_tag_arg[i].arglen == ctx->arg.len f = 1;
&& check_tag_arg[i].taglen == ctx->tag.len
&& strncasecmp(ctx->tag.c, check_tag_arg[i].tag, ctx->tag.len) == 0
&& strncasecmp(ctx->arg.c, check_tag_arg[i].arg, ctx->arg.len) == 0) {
f = 1;
break;
}
}
smart_str_appends(&ctx->result, "\""); smart_str_appendc(&ctx->result, '"');
if (f) { if (f) {
append_modified_url(&ctx->val, &ctx->result, &ctx->q_name, &ctx->q_value, PG(arg_separator)); append_modified_url(&ctx->val, &ctx->result, &ctx->q_name, &ctx->q_value, PG(arg_separator));
} else { } else {
smart_str_append(&ctx->result, &ctx->val); smart_str_append(&ctx->result, &ctx->val);
} }
smart_str_appends(&ctx->result, "\""); smart_str_appendc(&ctx->result, '"');
} }
enum { enum {
@ -160,13 +188,10 @@ enum {
int ok = 0; \ int ok = 0; \
int i; \ int i; \
smart_str_copyl(&ctx->tag, start, YYCURSOR - start); \ smart_str_copyl(&ctx->tag, start, YYCURSOR - start); \
for (i = 0; check_tag_arg[i].tag; i++) { \ for (i = 0; i < ctx->tag.len; i++) \
if (ctx->tag.len == check_tag_arg[i].taglen \ ctx->tag.c[i] = tolower(ctx->tag.c[i]); \
&& strncasecmp(ctx->tag.c, check_tag_arg[i].tag, ctx->tag.len) == 0) { \ if (zend_hash_find(ctx->tags, ctx->tag.c, ctx->tag.len, &ctx->lookup_data) == SUCCESS) \
ok = 1; \ ok = 1; \
break; \
} \
} \
STATE = ok ? STATE_NEXT_ARG : STATE_PLAIN; \ STATE = ok ? STATE_NEXT_ARG : STATE_PLAIN; \
} }
@ -197,7 +222,7 @@ static inline void mainloop(url_adapt_state_ex_t *ctx, const char *newdata, size
YYCURSOR = ctx->buf.c; YYCURSOR = ctx->buf.c;
YYLIMIT = ctx->buf.c + ctx->buf.len; YYLIMIT = ctx->buf.c + ctx->buf.len;
#line 201 #line 226
while(1) { while(1) {
@ -217,14 +242,14 @@ yy0:
if(yych != '<') goto yy4; if(yych != '<') goto yy4;
yy2: yych = *++YYCURSOR; yy2: yych = *++YYCURSOR;
yy3: yy3:
#line 210 #line 235
{ PASSTHRU(); STATE = STATE_TAG; continue; } { PASSTHRU(); STATE = STATE_TAG; continue; }
yy4: yych = *++YYCURSOR; yy4: yych = *++YYCURSOR;
yy5: yy5:
#line 211 #line 236
{ PASSTHRU(); continue; } { PASSTHRU(); continue; }
} }
#line 212 #line 237
break; break;
@ -278,11 +303,11 @@ yy6:
yy8: yych = *++YYCURSOR; yy8: yych = *++YYCURSOR;
goto yy13; goto yy13;
yy9: yy9:
#line 217 #line 242
{ HANDLE_TAG() /* Sets STATE */; PASSTHRU(); continue; } { HANDLE_TAG() /* Sets STATE */; PASSTHRU(); continue; }
yy10: yych = *++YYCURSOR; yy10: yych = *++YYCURSOR;
yy11: yy11:
#line 218 #line 243
{ PASSTHRU(); STATE = STATE_PLAIN; continue; } { PASSTHRU(); STATE = STATE_PLAIN; continue; }
yy12: ++YYCURSOR; yy12: ++YYCURSOR;
if(YYLIMIT == YYCURSOR) YYFILL(1); if(YYLIMIT == YYCURSOR) YYFILL(1);
@ -290,7 +315,7 @@ yy12: ++YYCURSOR;
yy13: if(yybm[0+yych] & 128) goto yy12; yy13: if(yybm[0+yych] & 128) goto yy12;
goto yy9; goto yy9;
} }
#line 219 #line 244
break; break;
@ -324,22 +349,22 @@ yy14:
} }
yy16: yych = *++YYCURSOR; yy16: yych = *++YYCURSOR;
yy17: yy17:
#line 224 #line 249
{ PASSTHRU(); HANDLE_FORM(); STATE = STATE_PLAIN; continue; } { PASSTHRU(); HANDLE_FORM(); STATE = STATE_PLAIN; continue; }
yy18: yych = *++YYCURSOR; yy18: yych = *++YYCURSOR;
yy19: yy19:
#line 225 #line 250
{ PASSTHRU(); continue; } { PASSTHRU(); continue; }
yy20: yych = *++YYCURSOR; yy20: yych = *++YYCURSOR;
yy21: yy21:
#line 226 #line 251
{ YYCURSOR--; STATE = STATE_ARG; continue; } { YYCURSOR--; STATE = STATE_ARG; continue; }
yy22: yych = *++YYCURSOR; yy22: yych = *++YYCURSOR;
yy23: yy23:
#line 227 #line 252
{ PASSTHRU(); continue; } { PASSTHRU(); continue; }
} }
#line 228 #line 253
break; break;
@ -393,11 +418,11 @@ yy24:
yy26: yych = *++YYCURSOR; yy26: yych = *++YYCURSOR;
goto yy31; goto yy31;
yy27: yy27:
#line 233 #line 258
{ PASSTHRU(); HANDLE_ARG(); STATE = STATE_BEFORE_VAL; continue; } { PASSTHRU(); HANDLE_ARG(); STATE = STATE_BEFORE_VAL; continue; }
yy28: yych = *++YYCURSOR; yy28: yych = *++YYCURSOR;
yy29: yy29:
#line 234 #line 259
{ PASSTHRU(); STATE = STATE_NEXT_ARG; continue; } { PASSTHRU(); STATE = STATE_NEXT_ARG; continue; }
yy30: ++YYCURSOR; yy30: ++YYCURSOR;
if(YYLIMIT == YYCURSOR) YYFILL(1); if(YYLIMIT == YYCURSOR) YYFILL(1);
@ -405,7 +430,7 @@ yy30: ++YYCURSOR;
yy31: if(yybm[0+yych] & 128) goto yy30; yy31: if(yybm[0+yych] & 128) goto yy30;
goto yy27; goto yy27;
} }
#line 235 #line 260
case STATE_BEFORE_VAL: case STATE_BEFORE_VAL:
@ -459,12 +484,12 @@ yy34: yyaccept = 0;
if(yych == ' ') goto yy41; if(yych == ' ') goto yy41;
if(yych == '=') goto yy39; if(yych == '=') goto yy39;
yy35: yy35:
#line 240 #line 265
{ YYCURSOR--; STATE = STATE_NEXT_ARG; continue; } { YYCURSOR--; STATE = STATE_NEXT_ARG; continue; }
yy36: yych = *++YYCURSOR; yy36: yych = *++YYCURSOR;
goto yy40; goto yy40;
yy37: yy37:
#line 239 #line 264
{ PASSTHRU(); STATE = STATE_VAL; continue; } { PASSTHRU(); STATE = STATE_VAL; continue; }
yy38: yych = *++YYCURSOR; yy38: yych = *++YYCURSOR;
goto yy35; goto yy35;
@ -483,7 +508,7 @@ yy43: YYCURSOR = YYMARKER;
case 0: goto yy35; case 0: goto yy35;
} }
} }
#line 241 #line 266
break; break;
@ -552,13 +577,13 @@ yy46: yyaccept = 0;
yych = *(YYMARKER = ++YYCURSOR); yych = *(YYMARKER = ++YYCURSOR);
if(yych != '>') goto yy63; if(yych != '>') goto yy63;
yy47: yy47:
#line 249 #line 274
{ PASSTHRU(); STATE = STATE_NEXT_ARG; continue; } { PASSTHRU(); STATE = STATE_NEXT_ARG; continue; }
yy48: yyaccept = 1; yy48: yyaccept = 1;
yych = *(YYMARKER = ++YYCURSOR); yych = *(YYMARKER = ++YYCURSOR);
goto yy55; goto yy55;
yy49: yy49:
#line 248 #line 273
{ HANDLE_VAL(0); STATE = STATE_NEXT_ARG; continue; } { HANDLE_VAL(0); STATE = STATE_NEXT_ARG; continue; }
yy50: yych = *++YYCURSOR; yy50: yych = *++YYCURSOR;
goto yy53; goto yy53;
@ -579,7 +604,7 @@ yy55: if(yybm[0+yych] & 32) goto yy54;
yy56: yych = *++YYCURSOR; yy56: yych = *++YYCURSOR;
if(yybm[0+yych] & 16) goto yy52; if(yybm[0+yych] & 16) goto yy52;
yy57: yy57:
#line 247 #line 272
{ HANDLE_VAL(1); STATE = STATE_NEXT_ARG; continue; } { HANDLE_VAL(1); STATE = STATE_NEXT_ARG; continue; }
yy58: ++YYCURSOR; yy58: ++YYCURSOR;
if(YYLIMIT == YYCURSOR) YYFILL(1); if(YYLIMIT == YYCURSOR) YYFILL(1);
@ -600,10 +625,10 @@ yy63: if(yybm[0+yych] & 128) goto yy62;
if(yych >= '>') goto yy60; if(yych >= '>') goto yy60;
yy64: yych = *++YYCURSOR; yy64: yych = *++YYCURSOR;
yy65: yy65:
#line 246 #line 271
{ HANDLE_VAL(1); STATE = STATE_NEXT_ARG; continue; } { HANDLE_VAL(1); STATE = STATE_NEXT_ARG; continue; }
} }
#line 250 #line 275
break; break;
} }
@ -650,7 +675,7 @@ PHP_RINIT_FUNCTION(url_scanner)
ctx = &BG(url_adapt_state_ex); ctx = &BG(url_adapt_state_ex);
memset(ctx, 0, sizeof(*ctx)); memset(ctx, 0, ((size_t) &((url_adapt_state_ex_t *)0)->tags));
return SUCCESS; return SUCCESS;
} }
@ -670,4 +695,18 @@ PHP_RSHUTDOWN_FUNCTION(url_scanner)
return SUCCESS; return SUCCESS;
} }
PHP_MINIT_FUNCTION(url_scanner)
{
REGISTER_INI_ENTRIES();
return SUCCESS;
}
PHP_MSHUTDOWN_FUNCTION(url_scanner)
{
UNREGISTER_INI_ENTRIES();
zend_hash_destroy(BG(url_adapt_state_ex).tags);
free(BG(url_adapt_state_ex).tags);
return SUCCESS;
}
#endif #endif

View File

@ -19,6 +19,8 @@
#ifndef URL_SCANNER_EX_H #ifndef URL_SCANNER_EX_H
#define URL_SCANNER_EX_H #define URL_SCANNER_EX_H
PHP_MINIT_FUNCTION(url_scanner_ex);
PHP_MSHUTDOWN_FUNCTION(url_scanner_ex);
PHP_RSHUTDOWN_FUNCTION(url_scanner_ex); PHP_RSHUTDOWN_FUNCTION(url_scanner_ex);
PHP_RINIT_FUNCTION(url_scanner_ex); PHP_RINIT_FUNCTION(url_scanner_ex);
@ -40,7 +42,11 @@ typedef struct {
smart_str q_name; smart_str q_name;
smart_str q_value; smart_str q_value;
char *lookup_data;
int state; int state;
/* Everything above is zeroed in RINIT */
HashTable *tags;
} url_adapt_state_ex_t; } url_adapt_state_ex_t;
#endif #endif

View File

@ -28,6 +28,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include "php_ini.h"
#include "php_globals.h" #include "php_globals.h"
#define STATE_TAG SOME_OTHER_STATE_TAG #define STATE_TAG SOME_OTHER_STATE_TAG
#include "basic_functions.h" #include "basic_functions.h"
@ -38,6 +39,54 @@
#include "php_smart_str.h" #include "php_smart_str.h"
static PHP_INI_MH(OnUpdateTags)
{
url_adapt_state_ex_t *ctx;
char *key;
char *lasts;
char *tmp;
BLS_FETCH();
ctx = &BG(url_adapt_state_ex);
tmp = estrndup(new_value, new_value_length);
if (ctx->tags)
zend_hash_destroy(ctx->tags);
else
ctx->tags = malloc(sizeof(HashTable));
zend_hash_init(ctx->tags, 0, NULL, NULL, 1);
for (key = php_strtok_r(tmp, ",", &lasts);
key;
key = php_strtok_r(NULL, ",", &lasts)) {
char *val;
val = strchr(key, '=');
if (val) {
char *q;
int keylen;
*val++ = '\0';
for (q = key; *q; q++)
*q = tolower(*q);
keylen = q - key;
/* key is stored withOUT NUL
val is stored WITH NUL */
zend_hash_add(ctx->tags, key, keylen, val, strlen(val)+1, NULL);
}
}
efree(tmp);
return SUCCESS;
}
PHP_INI_BEGIN()
STD_PHP_INI_ENTRY("url_rewriter.tags", "a=href,area=href,frame=src,form=fakeentry", PHP_INI_ALL, OnUpdateTags, url_adapt_state_ex, php_basic_globals, basic_globals)
PHP_INI_END()
static inline void append_modified_url(smart_str *url, smart_str *dest, smart_str *name, smart_str *val, const char *separator) static inline void append_modified_url(smart_str *url, smart_str *dest, smart_str *name, smart_str *val, const char *separator)
{ {
register const char *p, *q; register const char *p, *q;
@ -60,6 +109,12 @@ static inline void append_modified_url(smart_str *url, smart_str *dest, smart_st
} }
} }
/* Don't modify URLs of the format "#mark" */
if (bash - url->c == 0) {
smart_str_append(dest, url);
return;
}
if (bash) if (bash)
smart_str_appendl(dest, url->c, bash - url->c); smart_str_appendl(dest, url->c, bash - url->c);
else else
@ -74,47 +129,20 @@ static inline void append_modified_url(smart_str *url, smart_str *dest, smart_st
smart_str_appendl(dest, bash, q - bash); smart_str_appendl(dest, bash, q - bash);
} }
struct php_tag_arg {
char *tag;
int taglen;
char *arg;
int arglen;
};
#define TAG_ARG_ENTRY(a,b) {#a,sizeof(#a)-1,#b,sizeof(#b)-1},
static struct php_tag_arg check_tag_arg[] = {
TAG_ARG_ENTRY(a, href)
TAG_ARG_ENTRY(area, href)
TAG_ARG_ENTRY(frame, src)
TAG_ARG_ENTRY(img, src)
TAG_ARG_ENTRY(input, src)
TAG_ARG_ENTRY(form, fake_entry_for_passing_on_form_tag)
{0}
};
static inline void tag_arg(url_adapt_state_ex_t *ctx PLS_DC) static inline void tag_arg(url_adapt_state_ex_t *ctx PLS_DC)
{ {
char f = 0; char f = 0;
int i;
for (i = 0; check_tag_arg[i].tag; i++) { if (strncasecmp(ctx->arg.c, ctx->lookup_data, ctx->arg.len) == 0)
if (check_tag_arg[i].arglen == ctx->arg.len f = 1;
&& check_tag_arg[i].taglen == ctx->tag.len
&& strncasecmp(ctx->tag.c, check_tag_arg[i].tag, ctx->tag.len) == 0
&& strncasecmp(ctx->arg.c, check_tag_arg[i].arg, ctx->arg.len) == 0) {
f = 1;
break;
}
}
smart_str_appends(&ctx->result, "\""); smart_str_appendc(&ctx->result, '"');
if (f) { if (f) {
append_modified_url(&ctx->val, &ctx->result, &ctx->q_name, &ctx->q_value, PG(arg_separator)); append_modified_url(&ctx->val, &ctx->result, &ctx->q_name, &ctx->q_value, PG(arg_separator));
} else { } else {
smart_str_append(&ctx->result, &ctx->val); smart_str_append(&ctx->result, &ctx->val);
} }
smart_str_appends(&ctx->result, "\""); smart_str_appendc(&ctx->result, '"');
} }
enum { enum {
@ -158,13 +186,10 @@ enum {
int ok = 0; \ int ok = 0; \
int i; \ int i; \
smart_str_copyl(&ctx->tag, start, YYCURSOR - start); \ smart_str_copyl(&ctx->tag, start, YYCURSOR - start); \
for (i = 0; check_tag_arg[i].tag; i++) { \ for (i = 0; i < ctx->tag.len; i++) \
if (ctx->tag.len == check_tag_arg[i].taglen \ ctx->tag.c[i] = tolower(ctx->tag.c[i]); \
&& strncasecmp(ctx->tag.c, check_tag_arg[i].tag, ctx->tag.len) == 0) { \ if (zend_hash_find(ctx->tags, ctx->tag.c, ctx->tag.len, &ctx->lookup_data) == SUCCESS) \
ok = 1; \ ok = 1; \
break; \
} \
} \
STATE = ok ? STATE_NEXT_ARG : STATE_PLAIN; \ STATE = ok ? STATE_NEXT_ARG : STATE_PLAIN; \
} }
@ -293,7 +318,7 @@ PHP_RINIT_FUNCTION(url_scanner)
ctx = &BG(url_adapt_state_ex); ctx = &BG(url_adapt_state_ex);
memset(ctx, 0, sizeof(*ctx)); memset(ctx, 0, ((size_t) &((url_adapt_state_ex_t *)0)->tags));
return SUCCESS; return SUCCESS;
} }
@ -313,4 +338,18 @@ PHP_RSHUTDOWN_FUNCTION(url_scanner)
return SUCCESS; return SUCCESS;
} }
PHP_MINIT_FUNCTION(url_scanner)
{
REGISTER_INI_ENTRIES();
return SUCCESS;
}
PHP_MSHUTDOWN_FUNCTION(url_scanner)
{
UNREGISTER_INI_ENTRIES();
zend_hash_destroy(BG(url_adapt_state_ex).tags);
free(BG(url_adapt_state_ex).tags);
return SUCCESS;
}
#endif #endif

View File

@ -450,6 +450,7 @@ session.cache_limiter = nocache ; set to {nocache,private,public} to
session.cache_expire = 180 ; document expires after n minutes session.cache_expire = 180 ; document expires after n minutes
session.use_trans_sid = 1 ; use transient sid support if enabled session.use_trans_sid = 1 ; use transient sid support if enabled
; by compiling with --enable-trans-sid ; by compiling with --enable-trans-sid
url_rewriter.tags = a=href,area=href,frame=src,input=src,form=fakeentry
[MSSQL] [MSSQL]
;extension=php_mssql.dll ;extension=php_mssql.dll