$var_to_use_in_app = mysql_escape_string(trim($_GET['variableNameX']));
这通常是错误的做法。应用程序内部使用的字符串应始终是纯文本版本。然后你可以确定你的任何字符串操作都不会破坏它,并且你不会向页面输出错误的东西。
例如,如果您有提交的字符串:
O'Reilly
mysql_escape_string 会将其转义为:
O\'Reilly
当您将该字符串输出到 HTML 页面时,它看起来很傻。如果你把它输出到一个表单域,然后再次提交,你会得到另一个反斜杠,它会变成两个黑斜线,如果再次编辑会变成四个,八个......不久你就得到了由数百个反斜杠组成的字符串。这是在编写不佳的 CMS 和打开了 evil magic_quotes 功能的服务器中常见的问题。
然后,如果您想将名称的前两个字母放入数据库查询中,则可以剪切子字符串:
O\
然后将其连接到查询中:
SELECT * FROM users WHERE namefirst2='O\';
哎呀,语法错误,该字符串现在未终止。对预转义字符串进行字符串处理的变体同样容易让您陷入安全问题。
除了在最终输出阶段将它们连接成 SQL 或 HTML 中的定界文字外,您可以在应用程序中的任何地方将字符串作为简单的未转义文本字符串保存,而不是这种方法。对于 SQL:
"SELECT * FROM users WHERE name='".mysql_real_escape_string($name)."';"
请注意“真实”函数名称——普通旧的 mysql_escape_string 对于东亚字符集和使用 ANSI SQL_MODE 集的连接/数据库等极端情况会失败,因此通常您应该始终使用“真实”版本。
您可以定义一个与 mysql_real_escape_string 相同但名称更短的函数(例如 m()),以使其不那么难看。或者,更好的是,查看 mysqli 的参数化查询。
对于 HTML,应该使用 htmlspecialchars() 函数进行转义:
<div id="greeting">
Hello, Mr. <?php echo htmlspecialchars($name); ?>!
</div>
您可以定义一个执行 echo(htmlspecialchars()) 但名称更短的函数(例如 h()),以使其不那么难看。
如果您错过了对 htmlspecialchars 的调用,那么您的扫描器绝对正确地告诉您您的网站易受 XSS 攻击。但不要觉得太糟糕,几乎所有其他 PHP 程序员都会犯同样的错误。
mysql_[real_]escape_string 在这里根本没有帮助,因为在 HTML 中从文本中分离出来的字符是 '&'、'<',并且在属性中是 '"'。这些都不是特殊的SQL 字符串文字,所以 mysql_escape_string 根本不会触及它们。恶意:
<script>alert("I'm stealing your cookies! "+document.cookie);</script>
只会逃到:
<script>alert("I\'m stealing your cookies! "+document.cookie);</script>
就安全性而言,这没有任何帮助。