为什么建议清理 Wordpress Customizer select 框、复选框和单选按钮?
Why is it recommended to sanitize Wordpress Customizer select boxes, check boxes and radio buttons?
尊敬的 Wordpress 开发人员
这个问题我一直找不到明确的答案,这个问题的灵感来自 this post by jared about sanitization and this article Theme Foundation 关于 Theme Customizer 的文章。特别是,这是后者的引述:
If the input is a 1 (indicating a checked box) then the function
returns a one. If the input is anything else at all, the function
returns a blank string. This prevents anything harmful from being
saved to the database.
关于防止将有害内容保存到数据库的最后一行是我们都同意的,我想。但我不明白的是你怎么能从复选框中得到任何有害的东西——除非你犯了编程错误——因为只有两个可能的值?
因此,如果在这种情况下进行清理只是为了防止:"data corruption" 由于编程错误,我不知道这是好事还是坏事。
我认为只有当您的输入是文本或文本字段时才对数据进行清理才有意义——至少当您的目标是防止有害内容时。我知道您有时需要格式化数据以使其有用,但这是另一个主题。
That last line about preventing harmful things from being saved to the
database is something we can all agree to
问题是 "harmful" 与上下文密切相关。数据库中的 JavaScript 本身无害 - 如果在另一个用户的会话中输出到 HTML,则只有 "harmful"。其结果是通过输出编码更好地处理这种类型的漏洞 (XSS)。也就是说,当内容输出到页面时,它应该是 HTML 编码。这将使脚本标记输出为 <script;>
,它只是将文字 <script>
实际输出到显示的页面。
But what I don't get is how you can get harmful anything from a
checkbox - unless you make programming errors - since there are only
two possible values?
如果攻击者操纵了 POSTed 数据,则不会。例如,如果您的复选框定义为
<input type="checkbox" name="agreeToTCs" />
这会在选中时将 agreeToTCs=on
发送到您的应用程序。
攻击者可以操纵 POST 请求并将其更改为 agreeToTCs=evil
。这相当于指定
<input type="checkbox" name="agreeToTCs" value="evil" />
在 HTML 和选中的框。
Why is it recommended to sanitize Wordpress Customizer select boxes,
check boxes and radio buttons?
所有这一切归结为您的应用程序应该只处理有效数据。举个简单的例子,假设一个系统允许您 select 在创建新用户时为新用户设置用户级别。系统设计的一部分只允许您指定一个等于或低于您自己的用户。这是为了防止低级别用户创建管理员帐户然后获得完全权限。假设您以中级用户身份登录,下拉列表的 HTML 可能呈现如下:
<select name="userLevel">
<option value="low">low</option>
<option value="medium">medium</option>
</select>
当它被POST发送到服务器时,例如userLevel=medium
已发送。但是,攻击者可能能够将 POSTed 数据操纵为 userlevel=admin
并为自己创建管理员用户。 "Sanitizing" 回发时再次选中该复选框可确保您的应用程序仅接受有效值。
尊敬的 Wordpress 开发人员
这个问题我一直找不到明确的答案,这个问题的灵感来自 this post by jared about sanitization and this article Theme Foundation 关于 Theme Customizer 的文章。特别是,这是后者的引述:
If the input is a 1 (indicating a checked box) then the function returns a one. If the input is anything else at all, the function returns a blank string. This prevents anything harmful from being saved to the database.
关于防止将有害内容保存到数据库的最后一行是我们都同意的,我想。但我不明白的是你怎么能从复选框中得到任何有害的东西——除非你犯了编程错误——因为只有两个可能的值?
因此,如果在这种情况下进行清理只是为了防止:"data corruption" 由于编程错误,我不知道这是好事还是坏事。
我认为只有当您的输入是文本或文本字段时才对数据进行清理才有意义——至少当您的目标是防止有害内容时。我知道您有时需要格式化数据以使其有用,但这是另一个主题。
That last line about preventing harmful things from being saved to the database is something we can all agree to
问题是 "harmful" 与上下文密切相关。数据库中的 JavaScript 本身无害 - 如果在另一个用户的会话中输出到 HTML,则只有 "harmful"。其结果是通过输出编码更好地处理这种类型的漏洞 (XSS)。也就是说,当内容输出到页面时,它应该是 HTML 编码。这将使脚本标记输出为 <script;>
,它只是将文字 <script>
实际输出到显示的页面。
But what I don't get is how you can get harmful anything from a checkbox - unless you make programming errors - since there are only two possible values?
如果攻击者操纵了 POSTed 数据,则不会。例如,如果您的复选框定义为
<input type="checkbox" name="agreeToTCs" />
这会在选中时将 agreeToTCs=on
发送到您的应用程序。
攻击者可以操纵 POST 请求并将其更改为 agreeToTCs=evil
。这相当于指定
<input type="checkbox" name="agreeToTCs" value="evil" />
在 HTML 和选中的框。
Why is it recommended to sanitize Wordpress Customizer select boxes, check boxes and radio buttons?
所有这一切归结为您的应用程序应该只处理有效数据。举个简单的例子,假设一个系统允许您 select 在创建新用户时为新用户设置用户级别。系统设计的一部分只允许您指定一个等于或低于您自己的用户。这是为了防止低级别用户创建管理员帐户然后获得完全权限。假设您以中级用户身份登录,下拉列表的 HTML 可能呈现如下:
<select name="userLevel">
<option value="low">low</option>
<option value="medium">medium</option>
</select>
当它被POST发送到服务器时,例如userLevel=medium
已发送。但是,攻击者可能能够将 POSTed 数据操纵为 userlevel=admin
并为自己创建管理员用户。 "Sanitizing" 回发时再次选中该复选框可确保您的应用程序仅接受有效值。