问题是你无法真正告诉用户字段中允许有多少字符,因为转义值显然比未转义字符具有更多字符.
我看到一些解决方案,但没有一个看起来很好:
每个领域一个白名单(工作太多,并没有完全解决问题)
每个字段的一个黑名单(与上面相同)
使用可以保存数据的字段长度,即使所有字符都被转义(坏)
取消隐藏数据库字段的大小(更糟)
保存十六进制数据并完全将责任传递给输出过滤(不是很好)
让用户猜出最大尺寸(最差)
还有其他选择吗?这种情况有"最佳做法"吗?
示例代码:
$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,则转义的数据将不适合.
不要围绕数据库构建应用程序 - 为应用程序构建数据库!
设计您希望界面首先为用户工作的方式,计算出最长的可接受字段长度,然后使用它.
通常,在存储到数据库之前不要转义 - 将原始数据存储在数据库中并格式化以供显示.如果要输出多次,则存储已处理的版本.
记住磁盘空间相对便宜 - 不要浪费太多努力使数据库紧凑.