使用addslashes()和htmlspecialchars()处理特殊字符

<?php
//========== 转义 ==========//
$str = "Is your name O'Reilly?";
echo addslashes($str) . PHP_EOL; // Is your name O\'Reilly?
// addslashes()会在如下字符之前添加反斜线:
// --------------------------------------------------
// 单引号(')
// 双引号(")
// 反斜线(\)
// NUL(NUL 字节)


//========== 反转义 ==========//
$str = "Is your name O\'Reilly?";
echo stripslashes($str) . PHP_EOL; // Is your name O'Reilly?


//========== 特殊字符转HTML实体 ==========//
$str = '<a href="#" target=\'_blank\'>Test</a>';
$flags = ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401;
echo htmlspecialchars($str, $flags) . PHP_EOL; // &lt;a href=&quot;#&quot; target=&#039;_blank&#039;&gt;Test&lt;/a&gt;


//========== HTML实体转特殊字符 ==========//
$str = '&lt;a href=&quot;#&quot; target=&#039;_blank&#039;&gt;Test&lt;/a&gt;';
$flags = ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401;
echo htmlspecialchars_decode($str, $flags) . PHP_EOL; // <a href="#" target='_blank'>Test</a>


//========== 有效的flags常量 ==========//
// ENT_COMPAT      会转换双引号,不转换单引号。
// ENT_QUOTES      既转换双引号也转换单引号。
// ENT_NOQUOTES    单/双引号都不转换
// ENT_IGNORE      静默丢弃无效的代码单元序列,而不是返回空字符串。不建议使用此标记,因为它可能有安全影响。
// ENT_SUBSTITUTE  替换无效的代码单元序列为Unicode代替符(Replacement Character),U+FFFD (UTF-8)或&#xFFFD;(其他),
//                 而不是返回空字符串。
// ENT_DISALLOWED  为文档的无效代码点替换为 Unicode 代替符(Replacement Character):U+FFFD (UTF-8),或&#xFFFD;(其他),
//                 而不是把它们留在原处。比如以下情况下就很有用:要保证XML文档嵌入额外内容时格式合法。
// ENT_HTML401     以HTML4.01处理代码。
// ENT_XML1        以XML1处理代码。
// ENT_XHTML       以XHTML处理代码。
// ENT_HTML5       以HTML5处理代码。


//========== 总结 ==========//
// 1、addslashes()主要是防SQL注入攻击, htmlspecialchars()主要是防XSS攻击。
// 2、如果使用用户输入数据来拼接SQL,那么务必对用户输入数据进行addslashes处理,以防出现SQL注入漏洞。强烈建议不要拼接SQL然后执行,
//    而是通过预处理(绑定参数)的方式执行SQL,这是防SQL注入攻击最有效的方式。
// 3、在页面上输出用户输入数据时,务必对用户输入数据进行htmlspecialchars处理,避免数据包含恶意代码且被执行。

Copyright © 2024 码农人生. All Rights Reserved