WordPress极简博客 WordPress极简博客
  • 新鲜事
  • 战疫情
  • UI素材
    • UI素材
    • 电商/节日
    • PPT
      • 节日庆典
      • 工作汇报
      • 商业计划书
    • word
      • 简历竞聘
      • 合同/公文
  • 创客头条
    • 音乐分享
    • 初创文章
    • 极客头条
    • 生活趣事
    • 生活日记
    • 防骗指南
  • 编程教学
    • API日记
    • Linux安全栏目
      • Linux运维安全汇总
      • DDOS攻击防护
      • XSS攻击防护
      • SQL安全防护
    • Python技术栏目
      • Python基础入门
      • Python基础结构
    • WordPress技术栏目
      • WP主题
      • WordPress技术教程
      • RIPRO主题美化
    • WordPress漏洞发布
    • 技术教程汇总
    • 严选源码
  • 专题
  • 基友
  • 隐私
  • 注册
    登录
立即登录
  • 首页
  • 云优化
  • 新疫情
  • 新鲜事
    • 热文
    • 极客
    • 生活
  • 技术篇
    • WP主题
    • 技术教程
    • Python入门
    • Python基础
  • 专题篇
  • 友链君
首页 技术教程(干货) 转义输出;终极教程-关于如何正确保护代码免受XSS攻击而又不会过度逃避

转义输出;终极教程-关于如何正确保护代码免受XSS攻击而又不会过度逃避

夏柔 4月 29, 2020

规则1

当我们谈论转义时,通常是关于我们从数据库中获得的信息。但是请记住,该数据库不是受信任的数据源。让我给你看一个例子:

echo '<label for="' . $id . '">' . $label . '</label>'; ...

我们在HTML属性中有一个变量,而在HTML标签中有另一个。假设它$label来自数据库,并且包含以下内容:

'<script>window.location = "https://not-www.wpon.cn";</script>'

无需以表格形式显示标签,您的网站用户将被重定向到一些阴暗的网站。看起来不错?不。

同样的事情也适用于$idHTML属性中的变量。这是这样的:

'"><script>window.location = "https://not-www.wpon.cn.com";</script>'

重定向对于您来说似乎并不那么麻烦,但是如果有某种比特币挖掘脚本怎么办?

治愈

为了防止在上面的示例中发生这种废话,我们要做的就是将输出包装在其中esc_attr()并esc_html() 相应地包装。方法如下:

echo '<label for="' . esc_attr( $id ) . '">' . esc_html( $label ) . '</label>'; ...

太好了,现在您已经了解了基础知识,让我们继续

什么时候?

这是一个非常好的问题,因为据说在WordPress的官方文档中,某些WordPress函数负责准备数据以供输出,并举例说明了这些the_title()函数。

让我们现在检查一下!我什至没有说过要更改phpMyAdmin中的标题,这当然也是可能的,所以让我们创建一个标题如下的帖子:

转义输出;终极教程-关于如何正确保护代码免受XSS攻击而又不会过度逃避-WordPress极简博客

在使用the_title()或打印标题的网站页面上get_the_title(),我们得到了:

转义输出;终极教程-关于如何正确保护代码免受XSS攻击而又不会过度逃避-WordPress极简博客

但请注意,尽管它使用相同的get_the_title()功能来打印标题,但/ wp-admin中的WP_Posts_List_Table并未损坏。

转义输出;终极教程-关于如何正确保护代码免受XSS攻击而又不会过度逃避-WordPress极简博客
标题在这里两次被转义了。

这是什么意思?!

在WordPress管理页面中,函数是get_the_title()通过esc_html()以下方式进行转义的:

add_filter( 'the_title', 'esc_html' );

WordPress在真正重要的地方逃避了一切,同时当我们谈论网站前端时,它为用户提供了自由。

这就是我的想法–您可以选择在创建自定义主题的模板时决定是否转义标题等,但是如果您正在开发插件或WordPress管理员的某种UI,则转义是永远是必须的。

esc_attr()

从函数名称可以理解,它为HTML属性中的用法准备了数据。

删除不正确的utf8,
将< (小于),> (大于),& (与号)," (双引号)和'(单引号)字符转换为HTML实体,
永远不会对实体进行双重编码。
例:

echo '<a href="" title="View post: ' . esc_attr( get_the_title() ) . '">...';

请记住:

  • 不要使用esc_attr()来转义src,href属性的数据– 而是使用esc_url(),
  • value也不要将其用于属性,因为它可能导致HTML实体丢失和数据库中存储的值不正确,请改用esc_textarea()。这是因为esc_attr()不会对实体进行双重编码。

esc_html()

准备在HTML中使用的文本。与esc_attr()函数的唯一区别在于,它有一个连接到函数输出的过滤器钩子- esc_html而不是attribute_escape。

示例–假设您有一个类似的字符串,<div class="block">并且想要在网站内容中显示它。

$string = '<div class="block">';
echo esc_html( $string ); // outputs &lt;div class=&quot;block&quot;&gt;

esc_url()

检查,尝试修复和清除URL。这是相同的顺序:

  • 用替换空格%20,
  • 删除网址中不允许使用的符号,例如反斜杠,
  • 如果URL协议是mailto:,排除符号%0d,%0a,%0D,%0A从使用私有字符串_deep_replace()这意味着字符串等功能%0%0%0AAA将被转换为空字符串,而不是%0%0AA 其str_replace()将返回,
  • 替换;//为://万一发生错误的情况,
  • 如果URL中不包含的方案,http://将预置除非它是先从相对链接/,#或者?或php文件)。
  • 如果第三个函数参数$_context等于display(默认情况下),则&符号将替换为,&并将单引号替换为',
  • 用%5B和编码方括号%5D。
  • 检查是否允许使用URL协议,如果不允许-返回空字符串,
  • 最后,将clean_url滤镜挂钩应用于结果。
echo '<a href="' . esc_url( $url ) . '">...</a>';

允许的协议

默认情况下,WordPress列出了可以使用函数检索的良好协议wp_allowed_protocols(),这是列表

  • http / https
  • FTP / FTPS
  • 邮寄
  • 新闻
  • irc
  • 地鼠
  • 恩特普
  • 饲料
  • 远程登录
  • 彩信
  • 短信
  • rtsp
  • svn
  • 电话
  • 传真
  • xmpp
  • Webcal
  • 瓮

如上所述,如果您的网址既不是相对网址,也不包含任何这些协议,则将返回空字符串。但是,如果您想逃避这样的Skype链接skype:rudrastyh?call怎么办?

您可以使用此过滤器挂钩将“ skype”添加到允许的协议列表中kses_allowed_protocols。例:

add_filter( 'kses_allowed_protocols', function( $protocols ) {
 
	$protocols[] = 'skype';
	return $protocols;
 
});

另一种方法是在转义时直接指定协议:

$url = 'skype:rudrastyh?call';
echo '<a href="' . esc_url( $url, array( 'skype' ) ) . '">Call Misha</a>';

esc_js()

 

转义字符串以用作内联JavaScript,例如onclick="",onsubmit=""或在<script>标记内。请注意,在这种情况下,JavaScript中的文本字符串必须始终用单引号引起来!

  • 删除不正确的utf8,
  • 转义单引号',
  • 将< (少于),> (大于),& (与号)," (双引号)字符转换为HTML实体< > & " ,
  • \n在行末添加。

您现在看到了esc_js()和esc_attr()之间的区别吗?

让我们看一个例子:

<?php
$text = "some single ' quote
then the next line and <b>html code</b>";
?>
<script>
	alert('<?php echo esc_js($text) ?>');
</script>

如果您不打算esc_js()在此示例中使用,将出现JavaScript错误并且没有发生任何事情,但是在我们的情况下,我们在浏览器中收到如下警告消息:

转义输出;终极教程-关于如何正确保护代码免受XSS攻击而又不会过度逃避-WordPress极简博客

esc_textarea()

为<textarea>标签内的用法准备一个字符串。

  • 将< (小于),> (大于),& (与号)," (双引号)和'(单引号)字符转换为HTML实体,

与本地化逃离

还值得一提的一对夫妇像定位功能esc_html__(),esc_html_e(),esc_html_x(),esc_attr__(),esc_attr_e(),esc_attr_x()这不仅是翻译字符串,但也难逃他们。

例:

esc_html_e ( 'Hello World','some_text_domain'  ) ;
//绝对相同的
echo esc_html ( __ ( 'Hello World','some_text_domain'  ) ) ;

 

#xss#xss教学
1
等 1 人赞过
J2dcg1.png
猜你喜欢
  • Nginx添加跨域限制规则
  • 使用测速脚本对国内Linux服务器进行测速
  • 域名爆破之自动化信息收集脚本
  • 利用免费接口实现国家开放大学刷网课脚本
  • RiProV2定制导航条
  • 判断是否在微信浏览器打开
  • 微信内自动播放音频非百度方案
  • 利用veImageX加速您的网站,想不快都难!
  • SWAPIDC减少注册信息及防刷注册量教学
  • Python实现定时发送每日早报及生活指数
14 5月, 2020
可爱粉色情人节PPT模板
夏柔
站长
夏山如碧 - 怀柔天下
1725
文章
25
评论
58145K
获赞
版权声明

文章采用创作共用版权 CC BY-NC-ND/2.5/CN 许可协议,与本站观点无关。

如果您认为本文侵犯了您的版权信息,请与我们联系修正或删除。
投诉邮箱wpsite@aliyun.com

栏目推荐
Python基础入门33
WordPress技术教程267
前沿技术情报所22
城市创新——新消费11
最近有哪些不可错过的热文23
程序员的养生之道0
节
春
  • 新鲜事
  • 疫情实况
  • UI素材
  • 技术教程
  • 音乐分享
  • 专题
  • 友情
  • 隐私
  • 云优化
Copyright © 2019-2025 WordPress极简博客. Designed by 夏柔. 辽公网安备21010502000474号 辽ICP备19017037号-2