Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/287.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 - Fatal编程技术网

何时清理PHP&;MySQL代码在存储到数据库之前还是在显示时?

何时清理PHP&;MySQL代码在存储到数据库之前还是在显示时?,php,mysql,Php,Mysql,好的,我想知道什么时候应该清理代码,什么时候将代码添加到数据库中,什么时候将代码显示在网页上,或者两者兼而有之 我之所以问这个问题,是因为我在代码存储到数据库之前对其进行了清理,但在代码为用户显示时,我从未进行过清理 下面是一个示例,说明如何在代码存储到数据库之前对其进行清理 $title = mysqli_real_escape_string($mysqli, $purifier->purify(strip_tags($_POST['title']))); $content = mysq

好的,我想知道什么时候应该清理代码,什么时候将代码添加到数据库中,什么时候将代码显示在网页上,或者两者兼而有之

我之所以问这个问题,是因为我在代码存储到数据库之前对其进行了清理,但在代码为用户显示时,我从未进行过清理

下面是一个示例,说明如何在代码存储到数据库之前对其进行清理

$title = mysqli_real_escape_string($mysqli, $purifier->purify(strip_tags($_POST['title'])));
$content = mysqli_real_escape_string($mysqli, $purifier->purify($_POST['content']));

你(可能)在这里谈论的是不同的威胁:

  • 您需要清理插入到数据库中的数据以避免错误
  • 您还需要小心向用户显示的数据,因为它可能包含恶意脚本(如果是由其他用户提交的)。参见维基百科的条目(又名XSS)
对数据库有害的东西不一定对用户有害(反之亦然)。你必须相应地处理这两种威胁

在您的示例中:

  • 对插入到数据库中的数据使用()
您可能希望在插入数据之前使用净化器-只需确保在用户获取数据时它已“净化”


如果
magic_quotes
处于打开状态,您可能需要对从数据库检索到的数据使用(),以便将其正确显示给用户。永远不要信任用户。

在将某些内容放入数据库时,请确保将其安全放入数据库

$title = mysqli_real_escape_string($mysqli, $purifier->purify(strip_tags($_POST['title'])));
$content = mysqli_real_escape_string($mysqli, $purifier->purify($_POST['content']));
当您要在浏览器中显示某些内容时,请确保在浏览器中显示该内容是安全的


如果在将某个内容放入数据库之前使其在浏览器中是安全的,那么您现在就养成了一种习惯,即相信当这些内容从数据库中出来时,它们在浏览器中是安全的。信任用户数据不是一个好习惯,即使您非常确定以前已经清理过它。如果您正在使用其他人的数据库或代码,也很容易忘记在输出前进行清理。

我认为您可能希望在插入数据库时同时
转义输入(以避免SQL注入)和
清理(以避免脚本攻击)。

这样,插入时只需运行
消毒剂一次,而不是(可能)在显示器上运行数百万次

显示数据时,应始终对其进行编码。这样您的应用程序就不会出错。这将保护您免受不良数据的侵害。

您使用的$purizer类是什么?@aircole HTML purizer at htmlpurifier.org为什么手动使用转义调用?您应该使用带有查询占位符的prepare/bind/execute循环。结果是自动转义。@Charles举一个你正在谈论的例子就好了。请查看mysqli的PHP手册页,我认为如果你的代码将数据库写入抽象为一个总是对它们进行清理的写入函数,那么信任来自数据库的数据是安全的?如果你的代码有这个功能,那么是的,它会有安全的输出。但是如果将来有人更改了代码,或者您获得了另一个数据源,该怎么办?确保它是安全的比相信它是安全的要好。除非启用了magic quotes,否则永远不需要对从数据库检索的内容运行
stripslashes
。此外,meta使用的是mysqli扩展,而不是mysql,因此调用这种方法来转义数据是错误的。@Charles首先,可能会启用magic quotes。哦,我没注意到他在用mysqli。我很确定他知道在“mysql”之后加上“I”。这个函数对mysql.*来说是一个奇怪的联盟。我只是想表达我的观点,我们真的需要吹毛求疵吗?如果事实上不正确,GeezIt就不是吹毛求疵的人。在任何现代PHP安装中都不太可能使用魔法引号。请不要忘记,你不仅仅是在回答一个人的问题。其他不是提问者的人读了你写的东西,你不想让他们因此学到错误的东西。@Charles我想我落后于时代了,嗯?只要你不重复编码。它是安全的剥离输入和编码输出。