转义PHP GET和POST值

转义PHP GET和POST值,php,security,post,get,Php,Security,Post,Get,可能重复: 在另一个线程中,我被告知这段代码非常无用: 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_ke

可能重复:

在另一个线程中,我被告知这段代码非常无用:

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;
    }
有人能帮我理解为什么我能做得更好吗?也欢迎链接或参考


只是一直在努力提高:)

好吧,就像magic\u quotes\u gpc不好一样。这是一种魔力,无论你愿不愿意,它都能逃脱一切。相反,在使用转义的地方处理转义,您可以毫无问题地更改内容。因此:

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

    return false;
}
在需要的地方逃跑。否则,事情可能会看起来很奇怪,逃避它们将无法解决问题。考虑这一点;我在一个文本框中输入我的姓,
O'Hara
。您想
echo
将其返回,但可以使用
getPost
获取它。以下是我得到的反馈:

奥哈拉

您是否再次
htmlspecialchars
?那么,我得到:

O\&39;阿糖胞苷


或者别的什么。这种情况经常发生在我身上,令人非常恼火——请不要这样做。

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

echo htmlspecialchars($_GET['name']);
mysql_query(... 'INSERT INTO users VALUES ("'.mysql_real_escape_string($_GET['name']).'")');
但如果要将其发送到数据库,可以执行以下操作:

echo htmlspecialchars($_GET['name']);
mysql_query(... 'INSERT INTO users VALUES ("'.mysql_real_escape_string($_GET['name']).'")');
有了你的方法,你就知道你能用它做什么。如果您这样做:

echo getGet('name');

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

请参阅底线:批发卫生是无用的。在使用数据时使用正确的方法对其进行清理。(不过,写更少的代码并不反对将卫生设施放入函数的基本思想。)嗯,我并没有在所有的POST值中使用它。它只是在真正需要的时候重新使用。不管怎样,回答得很好。感谢sql insert查询看起来有点难看……还可以使用
mysqli
PDO
,而不是
mysql\ucode>扩展。并使用准备好的语句,而不是
mysql*\u real\u escape\u string