PHP转义输入变量

时间:2011-09-19 16:45:46

标签: php

我正在使用以下功能来保护我的数据库免受gets的注入攻击等。

function filter($data) {
    global $db;
    $data = trim(htmlentities(strip_tags($data)));
    if (get_magic_quotes_gpc())
        $data = stripslashes($data);

    $data = $db->real_escape_string($data);

    return $data;
}

foreach($_GET as $key => $value) {
    $data[$key] = filter($value);
}

问题是,我不仅要过滤$_GET,还要过滤$_POST。怎么做?

我可以在过滤后将值重新分配给$_GET$_POST吗?我的意思是$_GET[$key] = filter($value);而不是$data[$key] = filter($value); ..

4 个答案:

答案 0 :(得分:6)

不要预先转义变量,只在你需要转义它们时才转义它们。

  • 如果你过早地逃避变量,你永远不会知道哪个变量被转义,哪个不是
  • 在进行字符串操作之前,您必须先取消变量,然后在
  • 之后重新转义它们
  • 来自不同来源(例如来自API,来自文件甚至来自数据库)的变量将不会被转义。你会忘记逃避它们。
  • 在打印之前你必须取消所有变量的转义(你不想打印',我猜)
  • 您无法为每种可能的情况转义变量。那么用escapeshellcmd来逃避它们呢?

PHP过去曾这样做过。它被称为magic_quotes_gpc

但是它bad practice已经被弃用了,它将从下一版本的PHP中删除。

最好在你需要的时候逃避一切。你打印一个变量?逃避它。你不必记住它是否已经被转义:它不是。

答案 1 :(得分:1)

这个功能毫无意义。
并且它不会过滤任何东西 不应该这样使用。

为了保护你的数据库免受注入攻击,你不应该做这个函数中存在的大部分事情,并且应该做很多不存在的事情。

仅保护字符串(引号括起来的数据块)免受注入攻击,你必须使用$ db-> real_escape_string而不是其他。
保护其他查询部分你必须使用其他程序,因为real_escape_string对他们来说完全无用

为了保护您的应用免受“其他攻击”,您必须首先定义这个“等”。

答案 2 :(得分:0)

array_walk($_GET,'filter');
array_walk($_POST,'filter');
array_walk($_COOKIE,'filter');

答案 3 :(得分:-1)

如果您稍后在查询中使用它,您应该过滤$ key,但如果可能,您应该使用mysql预编译语句并绑定变量。

http://www.ultramegatech.com/blog/2009/07/using-mysql-prepared-statements-in-php/

您可以更改$ _GET和$ _POST。