从我所看到的一切来看,似乎在用户输入的内容上逃避html的惯例(为了防止XSS)是在渲染内容时这样做.大多数模板语言似乎默认都是这样做的,而且我遇到过像stackoverflow这样的问题,认为这个逻辑是表示层的工作.
所以我的问题是,为什么会这样呢?对我而言,在输入(即表单或模型验证)上逃避似乎更清晰,因此您可以假设数据库中的任何内容都可以安全地显示在页面上,原因如下:
多种输出格式 - 对于现代Web应用程序,您可能使用服务器端html呈现,使用ajax/JSON的javascript web应用程序和接收JSON的移动应用程序(可能有也可能没有某些webview,这可能是javascript应用程序或服务器呈现的HTML).所以你必须处理遍布各地的html.但是输入将始终在保存到db之前被实例化为模型(并经过验证),并且您的模型都可以从相同的基类继承.
您已经必须小心输入以防止代码注入攻击(授予这通常是抽象到ORM或db游标,但仍然),所以为什么不担心html转义到这里所以你不必担心任何事情安全相关的输出?
我很想听听关于为什么html在页面渲染上转义是首选的论点
当然,之前已经提出了这个问题并且已经找到了解决方案,所有这些解决方案迄今为止都没有用 我想通过使用htmlentities或更改TM符号和&符号到他们的html equivelents htmlspecialchars:
$TEST = "Kold Locker™ & other stuff";
echo "ORGINIAL: " . $TEST . "<BR/>";
echo "HTML: " . htmlentities($TEST, ENT_COMPAT, 'UTF-8');
Run Code Online (Sandbox Code Playgroud)
这显示:
ORGINIAL: Kold Locker™ & other stuff
HTML:
Run Code Online (Sandbox Code Playgroud)
我也尝试过,htmlspecialchars第二个参数改变了相同的结果.
我错过了其他人声称在其他解决方案中工作的内容?
更新:我尝试只显示utf8_encode($TEST)并显示HTML: Kold Locker™ & other stuff