Php HTML数据在经过十六进制清理后超过了字段长度

Php HTML数据在经过十六进制清理后超过了字段长度,php,html,validation,Php,Html,Validation,问题是您无法告诉用户字段中允许有多少个字符,因为转义值比未转义值的字符多 我看到了一些解决方案,但没有一个看起来很好: 每个字段都有一个白名单,工作量太大,不能完全解决问题 如上所述,每个字段有一个黑名单 使用可以保存数据的字段长度,即使所有字符都转义为错误 取消对数据库字段大小的锁定 将数据保存为十六进制,并将责任完全转移到输出过滤不太好 让用户猜测最大大小 还有其他选择吗?对于这种情况是否有最佳做法 示例代码: $string = 'javascript:alert("hello!");';

问题是您无法告诉用户字段中允许有多少个字符,因为转义值比未转义值的字符多

我看到了一些解决方案,但没有一个看起来很好:

每个字段都有一个白名单,工作量太大,不能完全解决问题 如上所述,每个字段有一个黑名单 使用可以保存数据的字段长度,即使所有字符都转义为错误 取消对数据库字段大小的锁定 将数据保存为十六进制,并将责任完全转移到输出过滤不太好 让用户猜测最大大小 还有其他选择吗?对于这种情况是否有最佳做法

示例代码:

$string = 'javascript:alert("hello!");';
echo strlen($string);
// outputs 27
$escaped_string = filter_var('javascript:alert("hello!");', FILTER_SANITIZE_ENCODED);
echo strlen($escaped_string);
// outputs 41

如果数据库字段的长度为(比如)40,则转义的数据将不合适。

在此对上下文进行一些粗略的假设:

如果字段可以容纳32个字符,则为32个未转换字符 让用户输入32个字符 转义/取消转义不是用户的问题 为什么这是一个问题? 如果这是表单数据输入,则无关紧要,并且 如果出于某种原因要转义数据并将其传回,请在存储之前取消转义
如果没有进一步的上下文,看起来您正在与一个不存在的问题进行斗争,或者不需要存在的问题进行斗争

在这里对上下文进行一些疯狂的假设:

如果字段可以容纳32个字符,则为32个未转换字符 让用户输入32个字符 转义/取消转义不是用户的问题 为什么这是一个问题? 如果这是表单数据输入,则无关紧要,并且 如果出于某种原因要转义数据并将其传回,请在存储之前取消转义
如果没有进一步的背景,看起来您正在与一个实际上不存在或不需要存在的问题进行斗争

这是一个有趣的问题

我认为,如果你因为卫生处理而将任何责任分配给他们,解决方案将是一个问题。如果他们负责猜测最大长度,那么他们很可能会放弃并选择其他内容,而不理解为什么他们的输入是无效的

我的想法是:使数据库字段的大小为输入的150%。这个额外的大小用作十六进制消毒空间的填充,向用户和验证器显示的最大大小是实际需要的大小。因此,如果您在净化之前检查输入长度,并且它低于66%的长度限制,那么您的净化数据应该可以继续。如果它们超出了缓冲区额外的34%字段空间,则可能不应接受输入

唯一的问题是数据库表会更大。如果您想避免这种情况,那么您总是可以仅转义SQL敏感字符,并处理输出上的所有其他内容


编辑:以你为例,我认为你逃避太多了。要么在输出上使用较小范围的HTMLSpecialChars清理,要么将数据库字段设置为其当前大小的200%。如果你问我的话,那就太夸张了。

这是一个有趣的问题

我认为,如果你因为卫生处理而将任何责任分配给他们,解决方案将是一个问题。如果他们负责猜测最大长度,那么他们很可能会放弃并选择其他内容,而不理解为什么他们的输入是无效的

我的想法是:使数据库字段的大小为输入的150%。这个额外的大小用作十六进制消毒空间的填充,向用户和验证器显示的最大大小是实际需要的大小。因此,如果您在净化之前检查输入长度,并且它低于66%的长度限制,那么您的净化数据应该可以继续。如果它们超出了缓冲区额外的34%字段空间,则可能不应接受输入

唯一的问题是数据库表会更大。如果您想避免这种情况,那么您总是可以仅转义SQL敏感字符,并处理输出上的所有其他内容

编辑:以你为例,我认为你逃避太多了。要么在输出上使用较小范围的HTMLSpecialChars清理,要么将数据库字段设置为其当前大小的200%。如果你问我的话,那就太夸张了

为什么允许用户输入转义字符? 如果确实需要允许显式转义字符,则在检查转义字符是否正确之前对其进行插值 如果字符串仍然以某种方式被编码,那么您几乎不应该对它做任何有意义的工作。先解码,然后再做你的工作

我发现有些人倾向于过早地使用诸如addSlashes之类的转义函数,或者太晚地解码诸如删除HTML实体之类的东西。首先解码,完成你的工作,然后应用你需要的任何编码来存储/输出/等等

为什么允许用户输入转义字符? 如果确实需要显式允许esc 模仿字符,然后在检查是否正确之前插入转义字符 如果字符串仍然以某种方式被编码,那么您几乎不应该对它做任何有意义的工作。先解码,然后再做你的工作


我发现有些人倾向于过早地使用诸如addSlashes之类的转义函数,或者太晚地解码诸如删除HTML实体之类的东西。首先解码,完成你的工作,然后应用你需要的任何编码来存储/输出/等等。

不要围绕数据库构建你的应用程序-为应用程序构建数据库

首先设计您希望界面如何为用户工作,计算出可接受的最长字段长度,然后使用它

通常,在将原始数据存储到数据库中并格式化以供显示之前,不要进行转义。 如果要多次输出某些内容,则存储处理后的版本


请记住,磁盘空间相对便宜-不要浪费精力使数据库紧凑。

不要围绕数据库构建应用程序-为应用程序构建数据库

首先设计您希望界面如何为用户工作,计算出可接受的最长字段长度,然后使用它

通常,在将原始数据存储到数据库中并格式化以供显示之前,不要进行转义。 如果要多次输出某些内容,则存储处理后的版本


请记住,磁盘空间相对便宜-不要浪费精力使数据库紧凑。

在什么编程环境下?Win32,HTML,…?对不起,是HTML。添加了一些标签以进行澄清。对不起,我不太理解您的问题。。。你有没有试过逃避这些价值观?它们应该恢复到正常长度。你能发布一些代码吗?在什么编程环境下?Win32,HTML,…?对不起,是HTML。添加了一些标签以进行澄清。对不起,我不太理解您的问题。。。你有没有试过逃避这些价值观?它们应该恢复到正常长度。你能发布一些代码吗?我只是想特别同意在数据库中存储原始输入的观点。如果您在HTML之前转义数据,并在以后发现转义例程有问题,那么您就不走运了。我只是想特别同意将原始输入存储在数据库中的观点。如果您在HTML之前转义数据,并在以后发现转义例程有问题,那么您就倒霉了。