转义PHP GET和POST值

jri*_*iro 4 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_key_exists($s, $_GET))
            return mysql_real_escape_string(htmlspecialchars($_GET[$s]));
        else return false;
    }
Run Code Online (Sandbox Code Playgroud)

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

只是想要总是改进:)

Ry-*_*Ry- 11

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

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

    return false;
}
Run Code Online (Sandbox Code Playgroud)

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

O \'哈拉

htmlspecialchars又来了吗?那么,我得到:

ø\' ARA

或者其他的东西.这种情况发生在我身上,令人非常恼火 - 请不要这样做.


spe*_*rcw 7

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

echo htmlspecialchars($_GET['name']);
Run Code Online (Sandbox Code Playgroud)

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

mysql_query(... 'INSERT INTO users VALUES ("'.mysql_real_escape_string($_GET['name']).'")');
Run Code Online (Sandbox Code Playgroud)

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

echo getGet('name');
Run Code Online (Sandbox Code Playgroud)

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

  • 也可以使用`mysqli`或`PDO`,而不是`mysql_`扩展名.并使用预处理语句,而不是`mysql*_real_escape_string`. (2认同)