2012-02-25 138 views
4

可能重复:
The ultimate clean/secure function逃逸PHP GET和POST值

我在另一个线程获悉,这段代码是相当无用:

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

请参阅[最终清洁/安全功能](http://stackoverflow.com/questions/4223980/the-ultimate-clean-secure-function)底线:批发卫生是无用的。在使用数据时对数据进行清理,使用正确的方法。 (没有什么能够说明将卫生系统纳入功能的基本思想,但是要编写更少的代码。) – 2012-02-25 17:04:30

回答

10

嗯,这是坏的一样magic_quotes_gpc的是坏的。这是魔法,无论你是否愿意,都会逃避一切。相反,处理转义的地方,你可以改变事情没有任何问题。所以:

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

    return false; 
} 

并做你的逃避需要的地方。否则,事情可能看起来很奇怪,而消除它们将会击败这一点。考虑这一点;我在文本框中输入我的姓氏O'Hara。你想echo它回来,但你使用getPost获取它。这是我得到的结果:

O \'哈拉

你有没有再次htmlspecialchars呢?好吧,那么我得到:

Ø\ ' ARA

什么的。这发生在我身上很多,而且令人难以置信的烦人 - 请不要这样做。

+0

嗯,我不会在所有POST值中使用它。这只是在需要时重新使用。无论如何,好的答案。谢谢 – jribeiro 2012-02-25 17:13:04

6

我不会说没用,只是有点误导。在使用它之前,您应该立即进行转义,并且需要转义。例如,如果你想将值发送回浏览器,你可以这样做:

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

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

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

与您你可以用它来解决你的问题。如果你这样做:

echo getGet('name'); 

你打算输出一个MySQL转义字符串,而不是实际的名称。

+1

该SQL插入查询看起来有点丑陋.... – itachi 2012-02-25 17:15:39

+2

也使用'mysqli'或'PDO',而不是'mysql_'的扩展名。并使用预准备语句,而不是'mysql * _real_escape_string'。 – 2014-06-06 02:42:54