最新公告
  • 欢迎您光临源库坊,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入我们
  • 转义输出;终极教程-关于如何正确保护代码免受XSS攻击而又不会过度逃避

    规则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中的标题,这当然也是可能的,所以让我们创建一个标题如下的帖子:

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

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

    标题在这里两次被转义了。

    这是什么意思?!

    在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()来转义srchref属性的数据– 而是使用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错误并且没有发生任何事情,但是在我们的情况下,我们在浏览器中收到如下警告消息:

    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'    ;

     

    1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
    2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
    3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
    4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
    5. 如有链接无法下载、失效或广告,请联系管理员处理!
    6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
    7. 如遇到加密压缩包,默认解压密码为"www.yuankufang.com",如遇到无法解压的请联系管理员!
    源库坊 » 转义输出;终极教程-关于如何正确保护代码免受XSS攻击而又不会过度逃避

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    源库坊
    一个高级程序员模板开发平台
    • 355会员总数(位)
    • 1195资源总数(个)
    • 0本周发布(个)
    • 0 今日发布(个)
    • 1576稳定运行(天)

    提供最优质的资源集合

    赞助本站svip 了解详情