假设我解析了某个用户提交的日志文件,并将解析后的数据存储在MySQL数据库中。
现在,如果用户足够吝啬,他可以提交一个日志文件,其中包含类似于nickname=<script>alert(hello);<script>
的行。解析器将获取equals符号后面的所有内容,并执行INSERT INTO nicknames (name) VALUE ('<script>alert(hello);</script>')
。
我试了一下,发现mysqli_real_escape_string()
通过转义'
来防止日志文件(如nickname=' AND 1 = 2
)中的一行破坏查询。我以为它也会处理<script>
/<
/>
和其他代码/字符,但显然我错了。
在上述情况下,当用户提交包含行nickname=<script>alert(hello);<script>
的日志文件时,nicknames.name
列将包含值<script>alert(hello);<script>
。
稍后,这些值从表中读取并显示,在网站上的<table>
中每行显示一个昵称。当然,在这种情况下,它不会显示"昵称";正在执行跨站点脚本。会弹出一个消息框,显示"你好",而不是包含昵称的表行。
是否有任何常见的方法可以防止使用类似mysqli_real_escape_string()
的功能进行跨站点脚本编写?这个问题的正确解决方案是什么,甚至可能是最好的?
当然,在INSERT
进入列之前,我可以去掉<
和>
,但我更喜欢这样一种方式,即使在表中有<script>
标签,也只显示昵称。
问候
您可以使用htmlspecialchars
将所有html标记语法转换为相应的实体。这将导致<script>alert('name');</script>
的文字值被显示,而不是被解释为脚本块