当前位置:  开发笔记 > 编程语言 > 正文

我是不是从mysql注入安全?

如何解决《我是不是从mysql注入安全?》经验,为你挑选了2个好方法。

这足以避免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).即使使用htmlspecialcharshtmlspecialchars_decode,使用不同的引用样式也会导致此问题.另一个例子是如果strip_tags使用if ,那么信息将被无法恢复; 你将无法撤消strip_tags.因此,许多开发人员选择mysql_real_escape_string仅使用将值保存到数据库和htmlspecialchars(或其他任何)来从数据库中准备要在HTML中使用的字符串.



1> Colin Hebert..:

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

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


资源:

php.net - 用PDO准备的语句

在同一主题上:

PHP:mysql_real_escape_string是否足以清除用户输入?



2> Daniel Trebb..:

我认为您混淆了两个安全问题: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).即使使用htmlspecialcharshtmlspecialchars_decode,使用不同的引用样式也会导致此问题.另一个例子是如果strip_tags使用if ,那么信息将被无法恢复; 你将无法撤消strip_tags.因此,许多开发人员选择mysql_real_escape_string仅使用将值保存到数据库和htmlspecialchars(或其他任何)来从数据库中准备要在HTML中使用的字符串.

推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有