- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
window.location-6ren">
举个例子...
<cfset ascii32to126 = "!""##$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~">
<cfoutput>
<input type="button" value="Submit" onclick="window.location='xss.cfm?demo1=#encodeForHtmlAttribute(ascii32to126)#'"><br>
window.location='xss.cfm?demo1=!"##$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~'<br>
OBVIOUSLY THIS ONE IS INCORRECT
<br><br>
<input type="button" value="Submit" onclick="window.location='xss.cfm?demo1=#encodeForUrl(ascii32to126)#'"><br>
window.location='xss.cfm?demo1=%21%22%23%24%25%26%27%28%29%2A%2B%2C%2D%2E%2F0123456789%3A%3B%3C%3D%3E%3F%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E%5F%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D%7E'
<br><br>
<input type="button" value="Submit" onclick="window.location='xss.cfm?demo1=#encodeForHtmlAttribute(encodeForUrl(ascii32to126))#'"><br>
window.location='xss.cfm?demo1=%21%22%23%24%25%26%27%28%29%2A%2B%2C%2D%2E%2F0123456789%3A%3B%3C%3D%3E%3F%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E%5F%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D%7E'
<br><br>
<input type="button" value="Submit" onclick="window.location='xss.cfm?demo1=#encodeForHtmlAttribute(encodeForJavaScript(encodeForUrl(ascii32to126)))#'"><br>
window.location='xss.cfm?demo1=\u002521\u002522\u002523\u002524\u002525\u002526\u002527\u002528\u002529\u00252A\u00252B\u00252C\u00252D\u00252E\u00252F0123456789\u00253A\u00253B\u00253C\u00253D\u00253E\u00253F\u002540ABCDEFGHIJKLMNOPQRSTUVWXYZ\u00255B\u00255C\u00255D\u00255E\u00255F\u002560abcdefghijklmnopqrstuvwxyz\u00257B\u00257C\u00257D\u00257E'
</cfoutput>
我相信最后一个示例是针对 XSS 进行适当保护的那个,因为最终这会产生一个 URL(所以 encodeForUrl ),然后退后一步,您现在处于 JavaScript 上下文中(所以 encodeForJavaScript ),然后再进行另一个退后一步,您现在处于 HTML 属性上下文中(所以 encodeForHtmlAttribute )。我一直认为这就是过程,从代码最终将如何使用开始,然后倒退。 我理解正确吗?谢谢!
此外,从技术上讲,encodeForUrl() 的作用与 encodeForHtmlAttribute() 的作用相同,因此可以从最后一个按钮中删除 encodeForHtmlAttribute() 并且不会有任何改变,但我更愿意这样做,因为它有助于教学和理解。
最佳答案
是的,嵌套上下文是处理这个问题的正确方法。然而,最深编码的结果不太可能破坏周围的上下文,因为 ESAPI 函数尽可能严格并且转义符在这些上下文中不会重叠。因此,除非您需要处理不受信任的输入,否则无需嵌套编码。
encodeForHtmlAttribute( encodeForJavaScript( encodeForUrl(ascii32to126) ) )
例子:
encodeForURL("&")
>> %26
encodeForJavaScript("&")
>> \x26
encodeForHTML("&")
>> &
此处的所有控制字符对于其他上下文都是安全的。 %
在 JavaScript 和 HTML 中是安全的。 \
在 URL 和 HTML 中是安全的。 &#;
在 URL 和 JavaScript 中是安全的。这并不一定意味着输出将被正确显示,但至少可以保证将其解释为文字字符串并且不会暴露任何安全风险。
结论:在我下面的示例中仅使用 encodeForUrl("1&b=2&c=3")
就足以抵御 XSS,因为编码输出是 JavaScript 和 HTML 中的文字字符串并且正确解码为 URL。
NOTE: My original answer was based on an outdated server setup of ColdFusion 10. Back then the input of the
encodeFor
functions were normalized/canonicalized and thus made nesting a security risk since only the last call was actually encoding the input.
不,嵌套编码会让你容易受到攻击(当且仅当每个 encodeFor 函数的输入都被规范化时,请参阅评论)。
考虑以下演示:
<cfset qs = encodeForHtmlAttribute( encodeForJavaScript( encodeForUrl("1&b=2&c=3") ) )>
<cfoutput>
<button onclick="window.location='index.cfm?a=#qs#'">click me</button>
</cfoutput>
<cfdump var="#URL#">
这将导致 3 个单独的查询参数(a
、b
、c
),尽管您需要值 1&b= 2&c=3
在单个查询参数 a
中。原因是:规范化。编码器函数将在编码前对输入进行归一化,以防止双重编码攻击。
现在让我们尝试只对实际上下文编码一次:
<cfset qs = encodeForUrl("1&b=2&c=3")>
<cfoutput>
<button onclick="window.location='index.cfm?a=#qs#'">click me</button>
</cfoutput>
<cfdump var="#URL#">
编码一次就足够了,因为转义字符在这些上下文中不会重叠。
关于javascript - ColdFusion XSS Protection with 3 Contexts all-in-one,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38753364/
这个问题在这里已经有了答案: How to make a property protected AND internal in C#? (8 个答案) 关闭 9 年前。 我需要声明一个既受又 内部保
我有以下代码: class Base{ protected val alpha ="Alpha"; protected def sayHello = "Hello"; } class
我正在尝试运行一个宏来创建一个工作正常的pdf。 Excel 文件获得签名后,Excel 文件将自动受到保护。 问题:我的工作表上有一个按钮,需要按下该按钮才能创建 pdf 文档网。然而,这是无法完成
子类需要能够使用种子随机数生成器。 使用的优点和缺点是什么 public abstract class AbstractClass { protected Random rnd; public
我们有两个类(class)(A 和 B)。 A类只能由继承它的类创建(A类)B 类可以由用户创建。 A 类,版本 1 有一个private 数据成员,并且有方法访问 A 类中的数据。 A 类,版本 2
当父类受到保护时,我对继承类的默认构造函数有疑问,在我看来,子类也会有一个默认构造函数受到保护,但事实并非如此。 除了在子类上强制默认构造函数外,还有其他方法可以强制保护默认构造函数吗? C++11
我有一个抽象类,我想在其 protected 构造函数中初始化一个只读字段。我希望这个只读字段在派生类中可用。 按照我将所有字段设为私有(private)并公开属性的习惯,我实现如下: abstrac
我在运行大数据时遇到错误。错误已由以下示例示例解释 加载数据 mdata <- as.matrix(read.table('https://gubox.box.com/shared/static
我在获取 时遇到问题非法访问错误 对于以下示例: 我在名为 arch 的 gradle 模块中声明了一个基类 abstract class BaseClass { protected abst
我相信通过 实现 JSF 应用程序的安全性+ + & 通过使用 是两种不同的方式!?他们是吗? 我尝试通过上述第一种方法(使用 + + )来实现安全性,但发现使用 protected 和不
有没有办法确定以下的二传手能见度差异: public Prop { get; protected set; } protected Prop { get; set; } 使用反射?还是那些与 C# 反
我读了一本关于 OOP 的书,并且关于“ protected ”访问修饰符的示例对我来说很奇怪。 例子总结 这个例子是为了测试“protected”保留字对变量的影响。 ClassA 有 2 个 pr
内部——在集会上公开,在其他地方私有(private)。 protected - 只有派生类可以访问父类成员。 Protected internal - protected OR internal -
我有一个类代表 Wicket 中带有“返回”、“前进”和“取消”按钮的基本页面。但并非所有页面都有所有按钮,例如。 G。第一页明显没有“返回”。 我的想法是定义一个通用的ActionHandler p
在了解到嵌套类是嵌套类的成员并因此可以完全访问嵌套类的成员这一事实后(至少对于 C++11,请参见 here),我在尝试创建嵌套类模板: #include using namespace std;
我刚刚使用了 Resharper,并一直在尝试将字段转换为属性。我希望这些属性受到保护,但 Resharper 不想给我这个选项。相反,只有一个 protected 内部选项。这让我思考。要么某处有一
这是 question 的扩展一个小时前问过。 当覆盖派生类中的虚方法时,我们不能修改访问修饰符。考虑 System.Web.UI 命名空间中的 Control 类 public class Cont
有人可以解释一下 C# 中 protected 和 protected internal 修饰符之间的区别吗?看起来他们的行为是相同的。 最佳答案 “protected internal”访问修饰符是
我想知道下面两行代码之间是否有区别: protected $var = null; protected $var; 我已经看到两者都被使用了,我想知道这是否只是一个偏好问题,(也就是 $var; 将变
我正在尝试使用mockito为“另存为”操作编写单元测试。该操作的一部分是制作并显示一个文件对话框,用户可以在其中输入要保存的文件。选择文件不是我可以自动化的操作,因此我想模拟 FileDialog
我是一名优秀的程序员,十分优秀!