Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/263.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 在数据库中存储html实体?或在检索时转换?_Php_Mysql - Fatal编程技术网

Php 在数据库中存储html实体?或在检索时转换?

Php 在数据库中存储html实体?或在检索时转换?,php,mysql,Php,Mysql,快速提问,在将数据插入数据库之前或之后调用htmlspecialchars()(或htmlspecialchars())是更好的方法吗 之前:新的较长字符串将导致我必须更改数据库以在字段中保存较长的值。(maxlength=“800”可以更改为804字符字符串) 之后:这将需要更多的服务器处理,并且在每次页面加载或AJAX加载时都可以调用数百个htmlspecialchars() 苏欧。检索结果时进行转换会显著降低代码的速度吗?我应该改变数据库吗?工匠的做法是“测量两次,优化一次”。我没有php

快速提问,在将数据插入数据库之前或之后调用
htmlspecialchars()
(或
htmlspecialchars()
)是更好的方法吗

之前:新的较长字符串将导致我必须更改数据库以在字段中保存较长的值。(
maxlength=“800”
可以更改为804字符字符串)

之后:这将需要更多的服务器处理,并且在每次页面加载或AJAX加载时都可以调用数百个
htmlspecialchars()


苏欧。检索结果时进行转换会显著降低代码的速度吗?我应该改变数据库吗?

工匠的做法是“测量两次,优化一次”。

我没有php经验,但通常我总是转换或转义最接近输出。您不知道输出需求何时会发生变化,例如,您可能希望以XML或JSON数组的形式输出数据,因此转义为HTML然后存储意味着您仅限于以HTML的形式使用数据。

我建议将最原始的数据形式存储在数据库中。这使您在选择如何以及在何处输出数据时具有最大的灵活性


如果您发现性能有问题,可以以某种方式缓存此数据的HTML格式版本。记住,过早优化是一件坏事。

我们最近在工作中进行了这场辩论。我们决定将转义值存储在数据库中,因为以前(在未转义的情况下存储它时)存在数据显示而未转义的情况。这可能导致XSS。所以我们决定把它储存起来以确保安全,如果你想不让它成为替罪羊,你必须自己动手

编辑:因此,对于所有不同意的人,让我为我的案例添加一些背景故事。假设你在一个50多人的团队中工作。。。而且数据库中的数据也不能保证在输出的过程中是HTML编码的,因为没有内置的机制,所以开发人员必须编写代码来完成。这些数据到处都是,所以它不是通过1个开发人员的代码,而是通过30年代-大多数人对这些数据没有任何线索(或者它甚至可能包含罕见的尖括号),只想在页面上显示,继续前进,忘记它


你是否仍然认为最好将HTML格式的数据放入数据库,并依靠非你的随机人员来正确处理事情?因为坦率地说,虽然这似乎不是最佳实践,但我更喜欢失败关闭(意思是当数据在Word文档中传递时,它看起来像ValueStock而不是Value最简单的方法是“按原样”存储数据,然后在需要时转换为htmlentities

最安全的解决方案是在数据进入数据库之前对其进行过滤,因为这样可以防止由于缺乏安全性实现而对服务器和数据库可能造成的攻击,然后在需要时根据需要对其进行转换。此外,如果使用PDO,则使用预处理语句会自动发生这种情况


最好将文本存储为原始文本,并根据需要对其进行编码。老实说,在将数据输出到wbe页面时,您始终需要对数据进行htmlencode,以防止XSS黑客攻击

在将数据放入数据库之前,不应对其进行编码。主要原因是:

  • 如果这些数据接近列大小限制,比如32个字符,如果标题是“Steve&Fred blah blah blah”,那么您可能会超过该列限制,因为1个字符变成5个字符
  • 您假设数据将始终显示在网页中,将来您永远不知道在哪里查看数据,您可能不希望对其进行编码,现在您必须对其进行解码,并且可能无法访问PHP的解码功能

  • 在php/MySQL web应用程序中,数据以两种方式流动

    数据库->脚本语言(php)->HTML输出->浏览器->屏幕 和 键盘->浏览器->$\u POST->php->SQL语句->数据库

    数据定义为用户提供的一切

    总是

    A) 在将数据移动到SQL语句中时,通过mysql\u real\u escape\u字符串处理数据,然后

    B) 在将数据移动到HTML输出中时,通过htmlspecialchars处理数据

    这将保护您免受sql注入攻击,并使html字符和实体能够正确显示(除非您忘记了一个位置,然后打开了一个安全漏洞)

    我有没有提到,对于任何用户可能接触、修改或通过脚本提供的每一条数据,都必须这样做


    p、 出于性能原因,在任何地方都使用UTF-8编码

    如果您的网站不需要高性能,请将其存储为原始数据,并在输出时执行所需操作。

    如果您需要性能,则考虑将其存储两次:原始数据以使用它所需的数据,以及另一个具有过滤数据的字段。这可能被认为是冗余的,但CPU很昂贵,而数据存储非常便宜。

    非常糟糕的建议。也许有太多杂乱的代码供你选择;但总的来说,这样做是错误的。我会修正允许未经处理的用户输入显示的流程。这在一般情况下是错误的,因为其他人在他们的答案中已经指出了原因。对于XSS,我认为在存储经过清理的数据和存储转义的数据之间存在巨大的混淆。您希望存储经过清理但未转义的数据。如果有30名开发人员对XSS和转义实践一无所知,那么您将面临严重的招聘和/或培训问题。Oops。。起初,我以为你是在提倡将HTML放入数据库(“HTML输出”vs“输出”)。我想我们说的是同一件事。我要喝可乐。但我是真实的