如何保证$ _REQUEST?

时间:2011-04-10 08:51:50

标签: php security

如何在插入mysql数据库之前保护$ _REQUEST?例如:

$message = $message = $_REQUEST['message'];
$tags = $_REQUEST['item']['tags'];

感谢。

5 个答案:

答案 0 :(得分:3)

取决于您对“安全”的意思,以及您打算如何插入数据。 $ _REQUEST没有破坏或任何东西;只是它中的数据几乎可以是任何东西,因此在使用之前你需要对其进行“消毒”。

例如,如果'some_id'应该只是一个int,

$some_id = intval($_REQUEST['some_id']);

将确保$ some_id始终为int。 (即使它在$ _REQUEST中不存在!在这种情况下它将为0。)

如果使用预准备语句,$ _REQUEST数据的许多问题都会消失 - 也就是说,像PDO和mysqli这样的扩展会为你转义参数(如果你使用占位符,就像所有准备好的语句一样!),所以你要做的就是确保数据有效。 (例如,在上面,确保首先设置$ _REQUEST ['some_id']是一个好主意 - 因为我们没有,我们得到了0,这可能无效。)

如果你不使用准备好的陈述,那么你还需要做更多的工作。在将字符串提供给数据库时,您需要使用mysql_real_escape_string来转义字符串,如下所示:

$some_string_sql = mysql_real_escape_string($_REQUEST['some_string']);
$id = intval($_REQUEST['id']);
mysql_query("UPDATE stuff SET some_string = '$some_string_sql' WHERE id = $id");

请注意,我这样做只是为了查询!太多的PHP noob认为他们可以在脚本开头的$ _REQUEST中为一切安全应用一些神奇的公式。如果你总是把它直接送到SQL查询中,你有点可以 - 但是如果你将它用于其他东西,它会破坏你的数据!例如,如果您将数据写入文件,盲目地转义数据将在文件中留下一堆丑陋的反斜杠。您永远不应该* un *转义您的数据 - 它应该始终根据您的需要进行转义,以满足您打算使用它的特定目的。 (htmlentities用于打印到屏幕上的任意数据,mysql_real_escape_string用于进入SQL查询的内容。)

另请注意:如果您的网站已启用magic_quotes_gpc,请将其停用,原因可参见上一段中提到的原因。正确逃脱的东西会在魔法引号的存在下中断,因为它已经被PHP“逃脱”了一半(因此引用了)!幸运的是,这个错误将从PHP 6中删除,如果它发货的话。但是直到那时,如果你启用了魔术引号,你需要{$ 1}}来自$ _REQUEST,$ _GET,$ _POST或$ _COOKIE stripslashes(的任何内容,然后才能正确地逃脱它。 不要依赖于魔术引号 - 它们是一种方便的东西,而且根本不是为安全而设计的。

答案 1 :(得分:2)

在一些SQL查询中注入数据时,您不应忘记转义数据。

使用函数转义数据
根据您正在使用的API:

或者您可以使用准备好的语句
起初看起来有点难以理解 - 但有时值得投资......


然后,当然,当使用数据库中的数据生成一些输出时,同样的想法适用:转义输出。

如果要生成一些HTML输出,通常需要使用htmlspecialchars之类的内容。
或者,要允许某些特定的HTML标记,请参阅HTML Purifier

如果要生成其他类型的输出,则必须找到如何针对此类输出专门转义数据。

答案 2 :(得分:1)

使用mysql_real_escape_string()PDO准备好的陈述。我推荐后者,因为它也有助于保持您的查询整洁。

答案 3 :(得分:0)

尽可能保证安全。

用户可以将这些值更改为他们想要的任何值。

所以,根本不安全。 始终清理您的输入。

答案 4 :(得分:0)

没有什么可以保障的。

您的数据库输入应正确格式化 对于字符串,它是引用转义

只要您的输入数据仅限于字符串并遵循格式规则,就不需要特殊的安全性。