这足以避免SQL注入吗?
mysql_real_escape_string(htmlentities (urlencode($_POST['postmessage'])));
Colin Hebert.. 21
mysql_real_escape_string()
是你需要的唯一方法.
你不应该做的htmlentities()
,也没有urlencode()
在数据库中插入数据之前.这些方法通常是在呈现您向用户提供的View时的代码.
避免SQL注入的更好方法是使用预准备语句.
资源:
php.net - 用PDO准备的语句
在同一主题上:
PHP:mysql_real_escape_string是否足以清除用户输入?
Daniel Trebb.. 10
我认为您混淆了两个安全问题: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 "" . $_POST['postmessage'] . "";
通过使用以下函数转义用户输入来修复XSS漏洞htmlspecialchars
:
echo "" . htmlspecialchars($_POST['postmessage']) . "";
同样,这很容易做到,但很容易被遗忘.
通常,放置在数据库中以用于稍后发送回HTML的用户输入未经修改地保存.也就是说,仅mysql_real_escape_string
使用.但是,您可以转义用户输入以阻止XSS,然后转义XSS安全字符串以防止SQL注入:
mysql_query("INSERT INTO postmessages (postmessage) VALUES ('" . mysql_real_escape_string(htmlspecialchars($_POST['postmessage'])) . "')");
好处是,在将数据htmlspecialchars
写入HTML之前,您无需记住从数据库中转义值.缺点是某些值可能需要使用不同的函数进行转义.例如,用户名可能会被转义htmlspecialchars
,但"postmessage"可能允许BBcode,Markdown或HTML的子集.如果您转义所有输入以阻止XSS,那么您需要从数据库中取消值,例如,htmlspecialchars_decode
.
一个问题是,转义转义字符串并不总是返回原始字符串(unescape(escape($orig))
不一定相同$orig
).即使使用htmlspecialchars
和htmlspecialchars_decode
,使用不同的引用样式也会导致此问题.另一个例子是如果strip_tags
使用if ,那么信息将被无法恢复; 你将无法撤消strip_tags
.因此,许多开发人员选择mysql_real_escape_string
仅使用将值保存到数据库和htmlspecialchars
(或其他任何)来从数据库中准备要在HTML中使用的字符串.
mysql_real_escape_string()
是你需要的唯一方法.
你不应该做的htmlentities()
,也没有urlencode()
在数据库中插入数据之前.这些方法通常是在呈现您向用户提供的View时的代码.
避免SQL注入的更好方法是使用预准备语句.
资源:
php.net - 用PDO准备的语句
在同一主题上:
PHP:mysql_real_escape_string是否足以清除用户输入?
我认为您混淆了两个安全问题: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 "" . $_POST['postmessage'] . "";
通过使用以下函数转义用户输入来修复XSS漏洞htmlspecialchars
:
echo "" . htmlspecialchars($_POST['postmessage']) . "";
同样,这很容易做到,但很容易被遗忘.
通常,放置在数据库中以用于稍后发送回HTML的用户输入未经修改地保存.也就是说,仅mysql_real_escape_string
使用.但是,您可以转义用户输入以阻止XSS,然后转义XSS安全字符串以防止SQL注入:
mysql_query("INSERT INTO postmessages (postmessage) VALUES ('" . mysql_real_escape_string(htmlspecialchars($_POST['postmessage'])) . "')");
好处是,在将数据htmlspecialchars
写入HTML之前,您无需记住从数据库中转义值.缺点是某些值可能需要使用不同的函数进行转义.例如,用户名可能会被转义htmlspecialchars
,但"postmessage"可能允许BBcode,Markdown或HTML的子集.如果您转义所有输入以阻止XSS,那么您需要从数据库中取消值,例如,htmlspecialchars_decode
.
一个问题是,转义转义字符串并不总是返回原始字符串(unescape(escape($orig))
不一定相同$orig
).即使使用htmlspecialchars
和htmlspecialchars_decode
,使用不同的引用样式也会导致此问题.另一个例子是如果strip_tags
使用if ,那么信息将被无法恢复; 你将无法撤消strip_tags
.因此,许多开发人员选择mysql_real_escape_string
仅使用将值保存到数据库和htmlspecialchars
(或其他任何)来从数据库中准备要在HTML中使用的字符串.