PHP $ _SESSION简单的证券化问题

时间:2012-01-28 14:02:47

标签: php

我正在构建一个包含3个信息的会话数组:mailpasswordid。我在POST中使用的邮件和密码。请注意,在使用数据之前,我使用mysql_real_escape_string作为邮件,使用sha1作为密码。但对于id我从数据库中获取值。问题是:出于安全目的,我应该'id'=>htmlentities($data['ENS_ID'])而不仅仅'id'=>$data['ENS_ID']吗?对不起,如果我的问题对你没有任何意义,但我对安全感有点失落。提前感谢您的回复。干杯。马克

$result = mysql_query("SELECT * FROM ENS_MEMBRES WHERE ENS_MAIL = '$mail' AND ENS_PASS = '$password'");

if(mysql_num_rows($result)==1){

    $data=mysql_fetch_assoc($result);   
    $_SESSION['Auth']=array(
        'mail'=>$mail,
        'password'=>$password,
        'id'=>$data['ENS_ID'],
    );

3 个答案:

答案 0 :(得分:3)

您可以将ID存储在会话中,但是无论何时在其他上下文中使用它,都必须适当地转义它。这意味着:

答案 1 :(得分:2)

不,没有必要。 id应为数字类型。即使它是另一种类型,我个人认为最好不要逃避你在$_SESSION中存储的价值,而是在你用它做某事时逃避它。您是否在HTML代码中插入了值 - >使用htmlspecialchars。你打算在后续查询中使用它吗?使用mysql_real_escape_string等。在任何情况下,$_SESSION都应该存储原始值IMHO(即未转义)。毕竟,你需要进行不同类型的转义,具体取决于你对价值所做的事情。

考虑一下如果您在某个时候需要原始(未转义)id或者以不同方式转义它会发生什么。放弃你在$_SESSION中的价值是很麻烦的。

-

请注意,在任何情况下,最好使用PDO或类似工具与数据库进行交互,至少从长远来看是这样。使用预处理语句和有界参数,您甚至不必自己转义参数。

答案 2 :(得分:1)

你做错了!在将邮件字符串放入SQL查询之前应该使用mysql_real_escape_string,但是您可能希望以原始形式将其保存到会话数组中而不会转义。

同样适用于id(或从数据库中获取的任何内容)。只有在使用它时才能转义数据。转义在不同的上下文之间有所不同,因此对于HTMl(具有htmlentities)的转义在SQL上下文中可能不安全,反之亦然。