gpt4 book ai didi

sql-injection - 如何防止跨站点脚本?

转载 作者:行者123 更新时间:2023-12-04 22:16:53 24 4
gpt4 key购买 nike

我正在使用 php、mysql 和 smarty 以及用户可以放置评论等的地方。在插入数据库进行 SQL 注入(inject)之前,我已经对字符进行了转义。我还需要做什么?

最佳答案

XSS 主要是关于 HTML 转义(*)。任何时候您将纯文本字符串放入 HTML 页面,无论该文本是来自数据库、直接来自用户输入、来自文件还是完全来自其他地方,您都需要对其进行转义。

最小的 HTML 转义是转换所有 &符号到 &amp;和所有 <符号到 &lt; .当您将某些内容放入属性值时,您还需要转义用于分隔属性的引号字符,通常是 "&quot; .总是转义两个引号( &quot; 和单引号撇号 &#39; )并没有什么坏处,有些人也会转义 >&gt; ,尽管这仅对 XHTML 中的一种极端情况是必需的。

任何好的面向网络的语言都应该提供一个功能来为你做这件事。例如在 PHP 中是 htmlspecialchars() :

<p> Hello, <?php htmlspecialchars($name); ?>! </p>

在 Smarty 模板中是 escape修饰符:
<p> Hello, {$name|escape:'html'}! </p>

真的,因为 HTML 转义是您 95% 的时间想要的(允许包含原始 HTML 标记相对较少),这应该是默认设置。较新的模板语言已经了解到,选择加入 HTML 转义是一个巨大的错误,会导致无限的 XSS 漏洞,因此默认情况下会出现 HTML 转义。

您可以通过更改 default modifiers 使 Smarty 表现得像这样。至 html . (不要使用他们建议的 htmlall,除非你真的知道你在做什么,否则它可能会搞砸你所有的非 ASCII 字符。)

无论您做什么,都不要陷入常见的 PHP 错误,即在输入的 HTML 被处理或放入数据库之前进行 HTML 转义或“清理”。这是执行输出级编码的错误位置,会给您带来各种问题。如果您想验证您的输入以确保它是特定应用程序所期望的,那么很好,但是在此阶段清除或转义“特殊”字符是不合适的。

*:XSS 的其他方面存在于 (a) 您实际上希望允许用户发布 HTML,在这种情况下,您必须将其缩减为可接受的元素和属性,这是一个复杂的过程,通常由 HTML Purifier 之类的库完成,即使那样也有漏洞。另一种更简单的标记方案可能会有所帮助。 (b) 当您允许用户上传文件时,这很难保证安全。

关于sql-injection - 如何防止跨站点脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2790897/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com