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