Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/251.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 字符编码与站点安全_Php_Mysql_Character Encoding - Fatal编程技术网

Php 字符编码与站点安全

Php 字符编码与站点安全,php,mysql,character-encoding,Php,Mysql,Character Encoding,这两个函数过滤所有用户提交的变量。你认为它足够安全吗 我对字符编码有点困惑。我希望允许我的用户使用ACII艺术,使用他们想要的任何类型的符号,但目前这似乎是不可能的。应该怎么做?它可能与表的编码以及我的函数有关 编辑: 这些数字确实很大。有时以万亿计 以下是我如何过滤用户输入的示例: function intfix($i) { $i = preg_replace('/[^\d]/', '', $i); if (!strlen($i)) $i = 0; return

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

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

编辑:


这些数字确实很大。有时以万亿计

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

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;
}
这就是你所说的错误吗

此外,在插入数据库之前,我也是这样过滤它们的:

if($_GET['number']){ $number = intfix($_GET['number']);  }
if($_GET['text']){ $text = textfix($_GET['text']);  }'
函数过滤器($input,$s=1){
$input=带标签($input,“”);
$input=str\U replace(“\n”,“
,$input”); 如果($s==1){$input=bbcode($input);}//smileys和bbcode $input=textWrap($input);//不破坏html的wordwrap 返回$input; } 函数unfilter($input){//以在需要在文本框中显示文本时取消筛选 $input=html_实体_解码($input,ENT_引号,“UTF-8”); $input=str_replace(“
,”\n“,$input); 返回$input; }
不需要
intfix()
函数,只需执行
$num=(int)$num


至于字符串清理,如果您不能使用参数化查询,请将字符串通过
myqsl\u real\u escape\u string()

将intfix替换为
intval()
floatval()
——除非您期望的数字非常大,否则您是在重新设计轮子

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

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

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;

}

mysql\u real\u escape\u字符串在显示某些内容时绝对没有价值。alert('hello')仍将是alert('hello'),保持您的网站对XSS开放。由于问题被标记为mysql,并且OP包含对数字清理功能的引用,mysql\u real\u escape\u字符串绝对是最有价值的。将用户输入存储在数据库中而不清除可能的SQL注入是比不为XSS尝试屏蔽输入更大的问题。正如Ariel所说,XSS可以在输出时处理。显然,mysql_real_escape_string是最好的保护工具,但我只是说,盲目地将它应用到所有认为安全的东西上并不能解决所有问题。实际上,数字非常大。因为它是一款mmorpg游戏,所以有时会以万亿计。这是我如何过滤用户输入的一个示例:if($\u-GET['number']){$number=intfix($\u-GET['number']);}if($\u-GET['text']){$text=textfix($\u-GET['text']);}就是您所说的错误吗?我在我的主要帖子中添加了另外两个函数,展示了在插入数据库之前如何过滤数据。希望你能看看。不,不,不。这不好。如果你的整数确实比32位有符号整数大(尽管我很惊讶你有这么大的数字),那么你的整数修复就可以了,但是剩下的就没有用了。textfix和filter应该在输出时执行,而不是在输入时执行!对于数据库,请使用
mysql\u real\u escape\u string()
,而不要使用其他内容。当你在页面上显示它时,你可以过滤等等,所以我根本不应该过滤输入?为什么我这么做会有这么大的不同?我想我将不得不重新编码我的大部分网站。你不应该过滤输入,因为html不是唯一的输出。您可以存储在数据库中,或者搜索它,或者通过电子邮件发送它。同时也是到目前为止最重要的:过滤取决于您对输出所做的操作!为
alert()
、一个
style
属性、一个html中的人名、一个ajax中的人名(然后在javascript中使用)、一个title标记中的人名筛选数据-每一个都需要不同的筛选。制作一个通用的过滤器是不可能的,如果可能的话,这个东西会容易得多,但是过滤(转义)需要特定于上下文。
ini_set('default_charset', 'UTF-8');