我正在使用php,mysql和smarty,我放置用户可以放置注释等。我已经在插入SQL注入数据库之前转义了字符。我还需要做什么?
答案 0 :(得分:10)
XSS主要是关于HTML转义(*)。每当你获取一串纯文本并将其放入HTML页面时,无论该文本是来自数据库,还是直接来自用户输入,来自文件,还是来自其他任何地方,都需要将其转义。
最小的HTML转义是将所有&
符号转换为&
,将所有<
符号转换为<
。当您将某些内容放入属性值时,您还需要转义用于分隔属性的引号字符,通常是"
到"
。总是逃避两个引号("
和单引号撇号'
)没有害处,有些人也将>
转义为>
,尽管这只是必要的XHTML中的一个角落案例。
任何优秀的面向Web的语言都应该为您提供一个功能。例如在PHP中它是htmlspecialchars()
:
<p> Hello, <?php htmlspecialchars($name); ?>! </p>
在Smarty模板中,它是escape
修饰符:
<p> Hello, {$name|escape:'html'}! </p>
真的,因为HTML-escaping是你想要的95%的时间(想要允许包含原始HTML标记的情况相对较少),这应该是默认的。较新的模板语言已经了解到,使用HTML转义选择加入是一个巨大的错误,导致无限的XSS漏洞,因此默认情况下是HTML-escape。
您可以通过将default modifiers更改为 无论你做什么,在处理或放入数据库之前,不要陷入输入HTML的HTML转义或“消毒”的常见PHP错误。这是执行输出阶段编码的错误位置,会给您带来各种问题。如果你想验证你的输入,以确保它是特定应用程序所期望的,那么很好,但在这个阶段淘汰或逃避“特殊”字符是不合适的。 *:当(a)您实际上想要允许用户发布HTML时,会出现XSS的其他方面,在这种情况下,您必须将其简化为可接受的元素和属性,这是一个复杂的过程通常由像HTML Purifier这样的库完成,即使这样也有漏洞。替代的,更简单的标记方案可能会有所帮助。并且(b)当您允许用户上传文件时,这是非常难以保证的。html
来使Smarty表现得像这样。 (除非你真的知道你在做什
答案 1 :(得分:1)
关于SQL注入,转义是不够的 - 你应该尽可能使用数据访问库和参数化查询。
对于XSS(跨站点脚本),从html编码输出数据开始。同样,反XSS库是你的朋友。
目前的一种方法是只允许使用非常有限数量的标签并清理过程中的标签(白名单+清理)。
答案 2 :(得分:1)
您需要确保人们无法在评论中发布JavaScript代码或可怕的HTML。我建议你除了非常基本的标记之外不允许任何其他内容。
如果评论不应包含任何标记,请执行
echo htmlspecialchars($commentText);
应该足够了,但它非常粗糙。更好的是在将所有输入放入数据库之前对其进行清理。 PHP strip_tags()函数可以帮助您入门。
如果你想允许HTML评论,但是安全,你可以给HTML Purifier一个。
答案 3 :(得分:1)
在将用户放入数据库之前,不应修改用户输入的数据。修改应该在您将其输出到网站时进行。您不想丢失原始数据。
当您将其吐出到网站时,您希望使用类似htmlspecialchars("my output & stuff", ENT_QUOTES, 'UTF-8')
的内容将特殊字符转换为HTML代码 - 确保指定您正在使用的字符集。此字符串将被翻译为my output & stuff
以供浏览器阅读。
答案 4 :(得分:0)
防止SQL注入的最佳方法是不使用接受用户输入的动态SQL。而是将输入作为参数传递;这样它将是强类型的,不能注入代码。