转义PHP GET和POST值

时间:2012-02-25 17:01:19

标签: php security post get

  

可能重复:
  The ultimate clean/secure function

我在另一个帖子中被告知这段代码非常无用:

function getPost($s) {
        if (array_key_exists($s, $_POST))
            return mysql_real_escape_string(htmlspecialchars($_POST[$s]));
        else return false;
    }


    function getGet($s) {
        if (array_key_exists($s, $_GET))
            return mysql_real_escape_string(htmlspecialchars($_GET[$s]));
        else return false;
    }

有人可以帮助理解为什么以及如何让它更好吗?也欢迎链接或参考。

只是努力改进:)

2 个答案:

答案 0 :(得分:11)

嗯,这与magic_quotes_gpc糟糕的方式一样糟糕。这是神奇的,无论你是否愿意,都会逃避一切。相反,处理它所使用的转义,你可以毫无问题地改变事物。所以:

function post($key) {
    if(array_key_exists($key, $_POST)) {
        return $_POST[$key];
    }

    return false;
}

在你需要的地方逃跑。否则,事情可能看起来很奇怪,无视它们会破坏这一点。考虑一下;我在文本框中输入我的姓氏O'Hara。您希望echo返回,但您可以使用getPost获取它。这是我得到的:

  

O \'原

你再次htmlspecialchars了吗?那么,我得到:

  

0 \&安培;#39; ARA

或者其他什么。这种情况在我身上发生了很多,而且非常烦人 - 请不要这样做。

答案 1 :(得分:7)

我不会说无用,只是有点误导。您应该在需要转义的上下文中使用之前立即执行转义。例如,如果要将值发送回浏览器,可以执行以下操作:

echo htmlspecialchars($_GET['name']);

但是如果你想将它发送到数据库,你可以这样做:

mysql_query(... 'INSERT INTO users VALUES ("'.mysql_real_escape_string($_GET['name']).'")');

使用您的方法,您可以使用它来解决问题。如果你这样做:

echo getGet('name');

您打算打印出一个MySQL转义字符串而不是实际名称。