魔术引号是ON&& striplashes的使用和mysql-real-escape-string TOGETHER

时间:2013-02-02 21:15:32

标签: php mysql mysql-real-escape-string stripslashes magic-quotes-gpc

  

可能重复:
  How to prevent SQL injection in PHP?

我在免费的php服务器上,我没有访问php.ini文件,而magic_quotes是ON。所以当我通过我的表单页面添加记录到mysql时,我的PHP代码是

$_POST["text"]=trim(stripslashes(mysql_real_escape_string($_POST["text"])));

$_POST["text"]=trim(stripslashes(mysql_real_escape_string($_POST["text"]))); 我的问题:

  1. 我想消除magic_quote效果,因为它会贬值并删除 AND 放置潜在的恶意用户 以最佳方式输入mysql。我的代码也是如此,或者我需要更改, 改进?

    感谢,

1 个答案:

答案 0 :(得分:3)

只需条带()就足以摆脱魔法引号。

$text = stripslashes($_POST["text"]); 

查看在运行时删除魔术引号的更完整示例:http://php.net/manual/en/security.magicquotes.disabling.php

你真的应该得到一个不同的PHP服务器。自PHP 5。3。0(2009年6月)以来,魔术引用已被弃用。你的PHP托管网站近四年没有更新PHP,你面临许多其他错误甚至安全漏洞的风险。是时候搬到另一个主人了。


重新评论:

是的,stripslashes只是将请求参数转换为纯文本。

关于是否应该使用mysql_real_escape_string()...

的问题

首先,如果要将值插入到SQL查询中,则应该只执行 。对于每个POST值,你不一定会这样做,所以将转义应用于所有内容都是愚蠢的。

通过类比,它就像把你的晚餐放入冰箱储存容器之前你知道你将吃多少以及你将剩下多少剩饭。 : - )

其次,你不应该再使用mysql_ *函数了。从PHP 5.5.0开始它们是deprecated,它们将在未来的PHP版本中删除。您现在应该开始使用mysqli_ *或PDO函数。

第三,您不应该在SQL查询中使用escaping来获取动态值。而是使用带参数的准备查询。与使用mysql_real_escape_string()相比,参数化查询更安全,更易于编码,运行速度更快


重申您的下一条评论:

不,我认为你还没有。

如果要将$ _POST [“text”]插入到SQL查询中,并且魔术引号为ON,则执行以下操作:

// remove the magic quotes simply with stripslashes():
$text = stripslashes($_POST["text"]);

// prepare an SQL statement, using a ? placeholder instead of interpolated value
$stmt = $mysqli->prepare("INSERT INTO mytable (mytext) VALUES (?)");

// always check for an error on prepare, you might have made a syntax error, 
// or the table might not exist, etc.
if ($stmt === false) {
  die($mysqli->error);
} 

// bind one PHP variables for each parameter placeholder in the query
$stmt->bind_param("s", $text);

// then execute!  MySQL will use the values of the PHP variables you bound
// in place of the placeholders
$status = $stmt->execute();

// always check for an error on execute too, because the value of the parameter 
// might cause the query to fail, e.g. conflicting with another value in a 
// unique column, etc.
if ($status === false) {
  die($stmt->error);
}

如果您使用查询参数,则无需使用mysqli_real_escape_string()。


如果您需要更多帮助,请参阅mysqli教程,其中包含显示绑定参数的示例: