2012-01-28 53 views
0

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

$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'], 
    ); 
+0

为什么你存储在会话密码?在会议期间你需要什么密码? – Gumbo 2012-01-28 14:07:08

+0

因为我多次检查用户已登录。我有一个isLogged()函数首先检查会话信息是否设置,并且信息是否正确(使用db进行检查) – Marc 2012-01-28 14:13:04

+0

处理数据库中存储的信息已被更改的情况? – Gumbo 2012-01-28 14:15:38

回答

3

您可以在会话ID存储为作为,但每当你在另一个环境中使用它,你必须适当地逃避它。这意味着:

+0

你好knittl,谢谢你的回复。还有很多其他的......有不同的......使用? – Marc 2012-01-28 14:14:56

+0

@ user1162116:是的,你必须使用的函数取决于上下文,我只写了最常见的陷阱。其他上下文可能包括:CSV数据,JSON,XML,shell函数等 – knittl 2012-01-28 14:17:05

2

不,不应该有必要。 id应该是数字类型。即使它是另一种类型的,我个人会考虑最好不要逃避,你在$_SESSION存储的价值,而是逃避它,当你这样做有它的东西。您是否在HTML代码中插入值 - >使用htmlspecialchars。你打算在随后的查询中使用它吗?使用mysql_real_escape_string等。在任何情况下,$_SESSION应该真的存储原始值恕我直言(即不逃避)。毕竟,您需要根据您对价值所做的事情进行不同类型的转义。

试想,在某些时候,如果你需要的原始(未转义)会发生什么id,还是有它以不同的方式逃脱。如果不能简化你在$_SESSION中的价值,那将是非常麻烦的。

-

注意,最好是使用PDO或类似的在任何情况下,与数据库交互,至少从长远来看。通过准备好的语句和有界参数,您甚至不必自己逃避参数。

+0

在这种情况下,是否需要证实来自数据库的数据?如果从我的数据库中为会话目的检索到的值是除int之外的另一个类型,那么我应该在这种情况下使用htmlentities()吗? – Marc 2012-01-28 14:08:23

+0

我已经在这方面更新了我的答案。答案是:我认为最好将原始值保存在$ _SESSION中,并在您使用它进行一些可能危险的操作(如将代码插入HTML代码中或在查询中使用它)时将其转义。根据该操作的类型,您将需要不同类型的转义。 – robert 2012-01-28 14:11:38

1

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

也是一样的ID(或任何你从数据库中获取)。只有在需要使用它时才会跳过数据。转义在不同的上下文中有所不同,所以在SQL上下文中转义HTMl(使用htmlentities)可能并不安全,反之亦然。

+0

在使用mysql_real_escape_string将它放入查询之前..和sha1之前也有密码.. – Marc 2012-01-28 14:17:16

+0

是的,但是存储转义邮件几乎总是错误的会话数组中的字符串。您想要在转义前查看字符串。 – 2012-01-28 14:30:12