我是否安全免受MySQL注入的影响?
以下内容是否足以避免SQL注入?
mysql_real_escape_string(htmlentities (urlencode($_POST['postmessage'])));
以下内容是否足以避免SQL注入?
mysql_real_escape_string(htmlentities (urlencode($_POST['postmessage'])));
mysql_real_escape_string()
是您在这里需要的唯一方法。
在数据库中插入数据之前,不应执行 nor 操作。这些方法通常是在呈现您提供给用户的视图期间执行的代码。htmlentities()
urlencode()
避免 SQL 注入的更好方法是使用预准备语句。
资源:
关于同一主题:
我认为您混淆了两个安全问题:SQL注入和跨站点脚本(XSS)。
在发送到 SQL 数据库的 SQL 查询中使用经过正确清理的用户输入时,网站容易受到 SQL 注入的影响。例如,此代码引入了一个 SQL 注入漏洞:
mysql_query("INSERT INTO postmessages (postmessage) VALUES ('" . $_POST['postmessage'] . "')");
这个问题很容易通过用这样的函数转义用户输入来解决:mysql_real_escape_string
mysql_query("INSERT INTO postmessages (postmessage) VALUES ('" . mysql_real_escape_string($_POST['postmessage']) . "')");
这就是您需要做的,但棘手的部分是记住对SQL语句中使用的每个用户输入执行此操作。
当用户输入在发送到客户端的 HTML 中使用时,网站容易受到跨站点脚本的攻击。例如,此代码引入了一个 XSS 漏洞:
echo "<div class='postmessage'>" . $_POST['postmessage'] . "</div>";
XSS 漏洞是通过使用类似于 htmlspecialchars
的函数转义用户输入来修复的:
echo "<div class='postmessage'>" . htmlspecialchars($_POST['postmessage']) . "</div>";
同样,这很容易做到,但很容易被遗忘。
通常,放置在数据库中以便以后用于发回 HTML 的用户输入将保存得未经修改。也就是说,仅使用。但是,您可以转义用户输入以防止 XSS,然后转义 XSS 安全字符串以防止 SQL 注入:mysql_real_escape_string
mysql_query("INSERT INTO postmessages (postmessage) VALUES ('" . mysql_real_escape_string(htmlspecialchars($_POST['postmessage'])) . "')");
这样做的好处是,在将值写入 HTML 之前,您不需要记住从数据库中转义值。缺点是某些值可能需要使用不同的函数进行转义。例如,用户名可能会使用 转义,但“postmessage”可能允许 BBcode、Markdown 或 HTML 的子集。如果转义了所有输入以防止 XSS,则需要使用例如 htmlspecialchars_decode
从数据库中取消转义值。htmlspecialchars
htmlspecialchars
一个问题是,取消转义字符串并不总是返回原始字符串(不一定与相同)。即使使用 和 ,使用不同的引号样式也会导致此问题。另一个例子是,如果使用,那么信息将不可恢复地被删除;您将无法撤消 .因此,许多开发人员选择仅使用将值保存到数据库中和(或其他)从数据库中准备要在HTML中使用的字符串。unescape(escape($orig))
$orig
htmlspecialchars
htmlspecialchars_decode
strip_tags
strip_tags
mysql_real_escape_string
htmlspecialchars