跨站点脚本攻击是否与ajax相关?

时间:2018-04-08 09:43:18

标签: javascript php ajax xss

我正在使用PHP(Codeigniter)后端构建一个React应用程序。

由于Codeigniter似乎没有自动解决这个问题,我开始探索这个问题。我理解为什么必须在HTML页面中呈现之前转义用户输入,但问题是,这是否应该在仅依赖于AJAX的应用程序中完成。

在通过ajax请求收到后,我尝试在React组件的HTML元素中输出此字符串:

<script>alert('hey');</script>  

它最终只是HTML中的文字字符串。当然,没有JS被执行。

是否存在可以执行此类字符串的某些情况,即使它是从ajax JSON中提取的?

2 个答案:

答案 0 :(得分:0)

最好在将标签发送到前端之前在后端转换标签。

让我们举一个例子:

我们假设您致电http://example.com/get.php?userInput=&lt;脚本&gt;提醒(&#39; hi&#39;);&lt; / script&gt;

上述请求的预期输出是&#34;&lt;脚本&gt;提醒(&#39; hi&#39;);&lt; / script&gt;&#34;。

现在ajax调用正在将它转换为字符串文字,并且它没有在它被消费的地方执行,但是如果用户直接访问上面的url,它将被呈现为HTML,并且将执行上面的脚本。在这种情况下,受到攻击的人仍然可以窃取cookie或做其他恶意工作。

答案 1 :(得分:0)

我认为您采用Map的方式不同,任何类型的编程语言都无法自动阻止key/values。实际上,在public static int Class() { System.out.println("Character Types"); Map<String, Integer> data = new HashMap<>(); data.put("Wizard", 6); data.put("Sorcerer", 6); data.put("Monk", 8); data.put("Cleric", 8); data.put("Warlock", 8); data.put("Druid", 8); data.put("Rouge", 8); data.put("Bard", 8); data.put("Fighter", 10); data.put("Ranger", 10); data.put("Paladin", 10); data.put("Barbarian", 12); data.keySet().forEach(s -> System.out.println("\t" + s)); int value = -1; String choice; do { System.out.println("Select a Character name from the given list above"); choice = sc.nextLine(); } while ((value = data.getOrDefault(choice, -1)) == -1); return value; } 中,javascript代码已存储在数据库中并在显示时呈现,存储的代码可能具有ajax调用并使用您的cookie数据发送到其他网站的数据。

如果按原样打印存储的代码,则不会有任何问题。如果你打印你的json值像Cross Site Scripting (CSS)那么你的代码将不会被执行,即使你的api没有ajax(通过点击url)调用,因为脚本代码被隐藏在浏览器中(你可以检查出来)。

是的,如果将ajax返回值绑定为HTML,则可以执行代码。这就是javascript框架按原样打印ajax返回值的原因,你必须明确地编写代码来绑定html代码。如果你绑定你的ajax值。

在这种情况下,请参阅how to bind html in reactjs,您的代码可以执行。

在php中有 - CSS函数可以按原样打印代码,这不允许浏览器呈现javascript代码。

阻止CSS的简单方法是按原样打印数据 - 不要让浏览器将代码存储在数据库中。