esc_url()和esc_url_raw()之间的区别


9

http://core.trac.wordpress.org/browser/trunk/wp-includes/formatting.php#L2239

我对何时应该使用它们之一感到困惑。

假设我有此URL http://site.com/?getsomejavascript=1:,它是动态生成的javascript:

  • 如果我将脚本包含在中,则会esc_url(add_query_arg('apples', 420))得到http://site.com/?getsomejavascript=1&apples=420,并且由于这些#038;引用而中断

  • 如果我使用esc_url_raw(add_query_arg('apples', 420))我得到正确的URL:http://site.com/?getsomejavascript=1&apples=420

但是在文档中我发现esc_url_raw仅应用于转义插入数据库中的URL ...

Answers:


10

食品数据Codex条目中:URLs

esc_url( $url, (array) $protocols = null ) (从2.8开始)

清理URL时,请始终使用esc_url(在文本节点,属性节点或其他任何地方)。拒绝没有提供的白名单协议之一的URL(默认为http,https,ftp,ftps,mailto,news,irc,gopher,nntp,feed和telnet),消除无效字符,并删除危险字符。从3.0开始不推荐使用:clean_url()此函数将字符编码为HTML实体:在生成(X)HTML或XML文档时使用它。将&符号和单引号(')编码为数字实体引用(&,')。

esc_url_raw( $url, (array) $protocols = null ) (从2.8开始)

用于在数据库中插入URL。此功能不会将字符编码为HTML实体:在存储URL或在其他需要非编码URL的情况下使用它。通过将$ context设置为db,可以在旧的clean_url函数中复制此功能。

因此,主要区别似乎是:

  1. esc_url()编码HTML实体,但esc_url_raw()不编码
  2. esc_url()用于 输出,而esc_url_raw()用于数据库存储

编辑:

由于您要对查询字符串中的实际URL进行硬编码(或单独保存/存储),然后通过附加查询字符串[add_query_arg()][2],所以最好通过来转义附加的查询字符串esc_js(),而不是esc_url()

例如:

add_query_arg( esc_js( 'apples' ), esc_js( '420' ), $myurl )

2
好的,但是esc_url()当您要输出的URL中有查询参数时,该选项将无法正常工作
onetrickpony

使用esc_js()仅转义通过添加的数据该add_query_arg()怎么办?请参阅上方的答案编辑。
Chip Bennett

我没有尝试过,但这没有意义:) esc_js('apples')或'apples'都将返回apples。这个问题在add_query_arg加入“苹果”与其他参数时&
onetrickpony

那么,如果数据是可信的(即静态的),为什么还要逃脱呢?
Chip Bennett

我并不完全确定不逃避它是安全的。我基本上使用的脚本包括<script type="text/javascript" src="<?= $_SERVER['REQUEST_URI'] ?>'/?javascriptcode=1"></script>
onetrickpony
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.