Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.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 MySQL安全性的困惑:字符集、转义字符等_Php_Mysql_Sql_Security - Fatal编程技术网

Php MySQL安全性的困惑:字符集、转义字符等

Php MySQL安全性的困惑:字符集、转义字符等,php,mysql,sql,security,Php,Mysql,Sql,Security,我知道对公共网站上输入或提交的数据进行消毒的要求。 然而,网上有这么多关于安全的文档,我完全不知道该走哪条路 a) 目前,我的MySQL表采用MyISAM格式,大多数表采用utf8\u bin编码,其他表采用latin1\u swedish\u ci编码。我认为utf8\u bin更可取,但我可以安全地转换它们吗 b) 目前,我通过POST/GET/REQUEST接收到的所有数据都有以下巨大的“转换器”: foreach($_POST as $k=>$v){ if(ini_get(

我知道对公共网站上输入或提交的数据进行消毒的要求。 然而,网上有这么多关于安全的文档,我完全不知道该走哪条路

a) 目前,我的MySQL表采用MyISAM格式,大多数表采用
utf8\u bin
编码,其他表采用
latin1\u swedish\u ci
编码。我认为
utf8\u bin
更可取,但我可以安全地转换它们吗

b) 目前,我通过POST/GET/REQUEST接收到的所有数据都有以下巨大的“转换器”:

foreach($_POST as $k=>$v){
    if(ini_get('magic_quotes_gpc'))
        $_POST[$k]=stripslashes($_POST[$k]);
    $_POST[$k]=htmlspecialchars(strip_tags($_POST[$k]));
    $_POST[$k]=utf8_decode($_POST[$k]);
}
除此之外,在SQL查询中,我使用了
mysql\u real\u escape\u string
,这大大增加了源代码,尤其是对于大型表单


有没有一种方法可以优化它(我真的需要所有这些转换吗?),特别是,我如何确保使用外国字符集(如中文等)时,我的表单等不会完全混乱?显示前是否必须将数据转换回?

用于清理要附加到SQL查询的数据,并在将数据附加到HTML之前清理数据。

用于清理要附加到SQL查询的数据,和用于在将数据附加到HTML之前清理数据。

在SQL命令中将输入用于数据库之前清理输入是必要的,但它不能阻止所有形式的SQL注入。防止这种情况发生的最佳策略是使用参数化查询,这使数据库能够区分哪些是数据,哪些是命令,因此即使有错误的输入潜入,并且SQL命令出现在数据中,数据库也知道如何将其视为数据

这是一篇关于我的好文章


有关这方面的更多信息,请参阅精彩的。

在SQL命令中将输入用于数据库之前,必须对输入进行清理,但这并不能阻止所有形式的SQL注入。防止这种情况发生的最佳策略是使用参数化查询,这使数据库能够区分哪些是数据,哪些是命令,因此即使有错误的输入潜入,并且SQL命令出现在数据中,数据库也知道如何将其视为数据

这是一篇关于我的好文章


有关这方面的更多信息,请参阅精彩的。

您在问题中概述的是与输入编码、输出编码以及数据库编码相关的多个位置

让我们从PHP应用程序的输入开始,即示例中的
$\u POST
。通过首先注意在应用程序运行的位置正确配置主机,可以显著减少案例数量:

<?php

    /* Prevent the application to run if magic quotes are enabled. */
    if (ini_get('magic_quotes_gpc')) {
        throw new Exception('Magic Quotes must be disabled.');
    }
如本例所示,您所做的输入验证需要特定于您的案例。您应该知道需要哪个输入字符集,然后让应用程序处理它

除此之外,在本例中,
strip\u标签
在输入上使用在这里是不必要的

由于此应用程序在正确配置的主机上工作,因此在此处也找不到任何
strip\u斜线

长度检查表明,需要检查的不仅仅是基本内容。它始终取决于您的需求,并且输入应该始终有一个限制。在这种情况下,有一个硬限制(5000)和一个软限制将通知用户。例如,数据库中的列可能具有特定的大小,因此您无法存储更多

数据库只是完成了它的工作。如示例所示,数据仅存储在其中。这就是为什么您应该使用某种类型的数据库层,为您处理它,所以您不必在脚本中的许多地方这样做。如果您不知道从哪里开始,请使用PDO提供的参数化查询。PDO是PHP中的数据库抽象,可用于MySQL数据库

另一个重要部分是输出。你没有在你的例子中命名它,我把它放在这里是为了告诉你
htmlspecialchars
的位置所属:它会注意用户输入中的标签是否正确地显示在网站上


<代码>utf8\u bin
,其他为拉丁文1\u瑞典文\u ci。我认为那是
utf8\u bin

这里列出的是排序规则,这是唯一定义排序数据时如何比较数据的方法

您可能关心的是列本身的编码,如果应用程序将UTF-8引入,则文本字段的编码应该是UTF-8,这样数据库就可以存储所有输入

您给出的示例建议您使用ISO-8859-1而不是UTF-8,因此您的数据库字段不能是UTF-8,但它们可以


您可以在数据库列中使用任何编码,只要它允许您存储输入编码的数据而不会丢失。在您的示例中,您可以将ISO-8859-1输入文本存储到UTF-8数据库列中。

您在问题中概述的是与输入编码、输出编码以及数据库编码相关的多个位置

让我们从PHP应用程序的输入开始,即示例中的
$\u POST
。通过首先注意在应用程序运行的位置正确配置主机,可以显著减少案例数量:

<?php

    /* Prevent the application to run if magic quotes are enabled. */
    if (ini_get('magic_quotes_gpc')) {
        throw new Exception('Magic Quotes must be disabled.');
    }
如本例所示,您所做的输入验证需要特定于您的案例。您应该知道需要哪个输入字符集,然后让应用程序处理它

除此之外,在本例中,
strip\u标签
在输入上使用在这里是不必要的

由于此应用程序在正确配置的主机上工作,因此在此处也找不到任何
strip\u斜线

长度检查表明,需要检查的不仅仅是基本内容。它始终取决于您的需求,并且输入应该始终有一个限制。在这种情况下,有一个硬限制(5000)和一个软限制将通知用户。例如,数据库中的列可能具有