我正在使用PHP(Codeigniter)后端构建一个React应用程序。
由于Codeigniter似乎没有自动解决这个问题,我开始探索这个问题。我理解为什么必须在HTML页面中呈现之前转义用户输入,但问题是,这是否应该在仅依赖于AJAX的应用程序中完成。
在通过ajax请求收到后,我尝试在React组件的HTML元素中输出此字符串:
<script>alert('hey');</script>
它最终只是HTML中的文字字符串。当然,没有JS被执行。
是否存在可以执行此类字符串的某些情况,即使它是从ajax JSON中提取的?
答案 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
的简单方法是按原样打印数据 - 不要让浏览器将代码存储在数据库中。