在我的应用程序中,用户可以发布他们的状态更新,其中您可能会发布一些代码html / javascript或任何其他脚本,我将其存储在我的数据库中,并在网页上显示,我想在不影响页面的情况下显示此代码,代码应显示为普通文本,在服务器端处理或在客户端加载时不应运行...如何实现此目的?而且我在没有任何处理的情况下存储它,例如mysql_real_escape_string()
或strip_tags()
或任何其他过滤器......是不是对它进行任何处理?有没有与之相关的威胁?如果我应该对它执行任何操作,那么我应该使用哪些函数来更安全,并实现我的目的,即显示用户输入,就像普通/纯文本一样。
更新:
在阅读完所有答案后,我想我应该去阅读有关htmlspecialchars
和htmlentities
答案 0 :(得分:2)
看起来你想要htmlentities。在显示文本时使用它 - 在阅读或存储文本时,您不必做任何特别的事情。
仅供参考:对于您正在显示的用户创建的任何文本,这可能是一个好主意 - 可以防止XSS,CSRF以及所有其他令人讨厌的注入问题。
修改强>
看起来我在这里投票,但我建议您在存储时不对数据进行编码,而是在显示数据时要小心。它更加一致,同时允许您的数据是纯粹的。
例如,您可以直接查询数据WHERE SOME_TEXT LIKE '%<script>%'
而不是WHERE SOME_TEXT LIKE '%<script>'
,因此数据访问更简单。您可以在报表或桌面应用程序等内容中无害地显示数据。如果你对显示器侧的数据编码保持一致,你就不必考虑是否已经在输入上编码了它(这会导致双重编码,非常难看),所以你可以安全地使用对您的输出进行编码,无论您是否认为这是一个不安全的数据入口点。
答案 1 :(得分:2)
这正是htmlspecialchars()
和htmlentities()
的用途。
是的,你肯定应该在将用户提供的数据插入数据库之前将其转义。 mysql_real_escape_string()
将实现此目的,但根据docs上的大红框以及所有其他mysql_*
函数,它已被弃用。您应该使用PDO或MySQLi代替。
答案 2 :(得分:2)
虽然现有答案已经提及htmlspecialchars
和htmlentities
,但我建议您在存储文本时应用这些答案,而不是在显示时应用1>强>文字。这个理由是双重的:
答案 3 :(得分:1)
使用htmlspecialchars
。这是事实上的显示html作为文本&#34;功能
你应将mysql_real_escape_string
存储起来(实际上你应该使用PDO / mysqli正确的参数化查询)以防止注入,但这不会影响原始数据显示。从数据库中检索时使用htmlspecialchars
并准备好显示,而不是在存储时。
答案 4 :(得分:1)
您可以使用<pre>
和<code>
标记来显示格式化代码。但是为了防止代码执行而不显示,您需要将文本转换为字符实体。 &GT;变为&gt;,&lt;成为&amp; lt等等。
您可以使用PHP执行此操作,例如:
<?php echo htmlentities('function getSize() { var myFSO = new
ActiveXObject("Scripting.FileSystemObject");
var filepath =
document.upload.file.value; var
thefile = myFSO.getFile(filepath);
var size = thefile.size; alert(size
+ " bytes"); }'); ?>
由于您的系统依赖于用户输入,您可能必须依靠AJAX来实际处理用户输入并将其转换为HTML实体。