字符编码和站点安全性

时间:2011-10-17 08:23:17

标签: php mysql character-encoding

function intfix($i)
{
   $i = preg_replace('/[^\d]/', '', $i);
   if (!strlen($i))
      $i = 0;
   return $i;
}


function textfix($text = ""){
if(!is_array($text)){ $text = htmlentities($text,ENT_QUOTES,"UTF-8");
}
return $text;
}

这两个函数会过滤所有用户提交的变量。你认为它足够安全吗?

我对字符编码有点困惑。我希望允许我的用户使用ACII艺术并使用他们想要的任何类型的符号,但目前似乎不可能。应该做什么?它可能与表的编码以及我的函数有关。

编辑:

这些数字实际上非常大。有时数以万亿计。

这是我如何过滤用户输入的示例:

if($_GET['number']){ $number = intfix($_GET['number']);  }
if($_GET['text']){ $text = textfix($_GET['text']);  }'

这是你在说的错误吗?

另外,这是我在插入db之前过滤它们的方法:

function filter($input,$s=1){

    $input = strip_tags($input, "");
    $input = str_replace("\n", "<br />", $input);
    if($s == 1){$input = bbcode($input); } // smileys and bbcode
    $input = textWrap($input); // wordwrap without breaking html
    return $input;
}

function unfilter($input){ // to unfilter in case I need to show the text in a textbox

    $input = html_entity_decode($input,ENT_QUOTES,"UTF-8");
    $input = str_replace("<br />", "\n", $input);

    return $input;

}

2 个答案:

答案 0 :(得分:1)

intval()floatval()替换intfix - 除非你期望非常大的数字,否则你正在重新发明轮子。

我希望你没有在输入上使用textfix()?那将是一个非常大的错误。您必须仅在输出上编码实体,而不是输入。

对于UTF-8,您可能需要:

ini_set('default_charset', 'UTF-8');

答案 1 :(得分:0)

intfix()函数不是必需的,您可以通过执行$num = (int)$num;

简单地对int进行类型转换

对于字符串清理,如果您不能使用参数化查询,请将字符串传递给myqsl_real_escape_string()