嘿伙计们我有一个问题,在将数据插入SQL以防止XSS时,我可以使用一些东西吗?而不是在阅读时。
例如,我的sql中有很多来自用户生成的输出,是否可以在输入SQL时保证安全,或者在离开SQL时是否必须使其安全?
TL:DR我可以在将数据插入SQL时使用类似htmlspecialchars的东西来防止XSS,这会有什么样的好保护吗?
答案 0 :(得分:1)
我认为问题中有几件事情混杂在一起。
一般来说,你不能阻止带有输入验证的XSS ,除非是非常特殊的情况,你可以验证输入是否只有像数字一样严格。
考虑这个html页面(让我们想象<?=
用于在您的服务器端语言中将数据插入到您的html中,因为您暗示了PHP,当然可能因使用的语言而异):
<script>
var myVar = <?= var1 ?>;
</script>
在这种情况下,服务器上的var1
不需要任何特殊字符,只有字母足以注入javascript。这对攻击者是否有用取决于几个方面,但从技术上讲,这几乎不受任何输入验证的XSS攻击。当然,这样的作业目前可能不在您的Javascript中,但您如何确保永远不会有?
另一个例子显然是DOM XSS,其中输入不会到达服务器,但这是一个不同的故事。
防止XSS是输出编码的东西。在某些情况下,输入验证可能有所帮助,但在大多数情况下不会提供足够的保护。
在数据库中存储html编码的值通常不是一个好主意。一方面,它使搜索,排序,任何类型的处理更加麻烦。另一方面,它违反了单一责任和分离关注点。编码是视图级别的事情,您的后端数据库与您希望如何呈现该数据无关。当你考虑不同的编码时,它会更加强调。只有在想要将数据写入HTML上下文时,HTML编码才可以。如果它是javascript(在脚本标签中,或在on *属性中,如onclick或其他几个地方),html编码是不够的,更不用说你有更多特殊输出。您的数据库不需要知道,数据将在何处使用,它是输出的东西,因此,它应该由视图处理。
答案 1 :(得分:0)
您应该使用正则表达式测试白名单字符的输入,例如只接受[a-Z] [0-9]。如果你使用黑名单尝试相反的方法,你将会非常头痛,因为有很多方法可以利用输入并捕获所有输入是一个大问题
另外,请注意SqlInjections。您应该在Linux上使用SqlMap来测试您的网站是否易受攻击