我是不是从mysql注入安全?

use*_*391 12 php xss sql-injection

这足以避免SQL注入吗?

mysql_real_escape_string(htmlentities (urlencode($_POST['postmessage'])));
Run Code Online (Sandbox Code Playgroud)

Col*_*ert 21

mysql_real_escape_string()是你需要的唯一方法.
你不应该做的htmlentities(),也没有urlencode()在数据库中插入数据之前.这些方法通常是在呈现您向用户提供的View时的代码.

避免SQL注入的更好方法是使用预准备语句.


资源:

在同一主题上:


Dan*_*ien 10

我认为您混淆了两个安全问题:SQL注入跨站点脚本(XSS).

当在发送到SQL数据库的SQL查询中使用不正确的清理用户输入时,网站容易受到SQL注入攻击.例如,此代码引入了SQL注入漏洞:

mysql_query("INSERT INTO postmessages (postmessage) VALUES ('" . $_POST['postmessage'] . "')");
Run Code Online (Sandbox Code Playgroud)

通过以下函数转义用户输入很容易解决此问题mysql_real_escape_string:

mysql_query("INSERT INTO postmessages (postmessage) VALUES ('" . mysql_real_escape_string($_POST['postmessage']) . "')");
Run Code Online (Sandbox Code Playgroud)

这就是您需要做的所有事情,但棘手的部分是记住为SQL语句中使用的每个用户输入执行此操作.

当用户输入用于发送到客户端的HTML时,网站容易受到跨站点脚本的攻击.例如,此代码引入了XSS漏洞:

echo "<div class='postmessage'>" . $_POST['postmessage'] . "</div>";
Run Code Online (Sandbox Code Playgroud)

通过使用以下函数转义用户输入来修复XSS漏洞htmlspecialchars:

echo "<div class='postmessage'>" . htmlspecialchars($_POST['postmessage']) . "</div>";
Run Code Online (Sandbox Code Playgroud)

同样,这很容易做到,但很容易被遗忘.

通常,放置在数据库中以用于稍后发送回HTML的用户输入未经修改地保存.也就是说,仅mysql_real_escape_string使用.但是,您可以转义用户输入以阻止XSS,然后转义XSS安全字符串以防止SQL注入:

mysql_query("INSERT INTO postmessages (postmessage) VALUES ('" . mysql_real_escape_string(htmlspecialchars($_POST['postmessage'])) . "')");
Run Code Online (Sandbox Code Playgroud)

好处是,在将数据htmlspecialchars写入HTML之前,您无需记住从数据库中转义值.缺点是某些值可能需要使用不同的函数进行转义.例如,用户名可能会被转义htmlspecialchars,但"postmessage"可能允许BBcode,Markdown或HTML的子集.如果您转义所有输入以阻止XSS,那么您需要从数据库中取消值,例如,htmlspecialchars_decode.

一个问题是,转义转义字符串并不总是返回原始字符串(unescape(escape($orig))不一定相同$orig).即使使用htmlspecialcharshtmlspecialchars_decode,使用不同的引用样式也会导致此问题.另一个例子是如果strip_tags使用if ,那么信息将被无法恢复; 你将无法撤消strip_tags.因此,许多开发人员选择mysql_real_escape_string仅使用将值保存到数据库和htmlspecialchars(或其他任何)来从数据库中准备要在HTML中使用的字符串.

  • @Xeross:当然。准备好的语句可以更轻松地一致转义用户输入。然而,在回答OP的问题时,我想确保他/她理解使用“mysql_real_escape_string”(或某些数据库转义机制)和“htmlentities”(或某些XSS转义机制)的原因。 (2认同)