我知道在页面之间传递参数的两种方法:

>使用POST和< input type =“hidden”>
>使用$_SESSION [“variable_name”]

我发现第二种方式更容易,但我想知道它是否与第一种方法一样安全,因为在我看到的大多数教程中,它们都使用第一种方式.

有没有什么重要的理由喜欢第一种方式?

为了理解这些差异,我们将详细介绍每种解决方案的工作原理及其安全风险.在此示例中,我们将存储用户的页面查看次数.

$_SESSION

我们启动会话,递增计数器并将其存储在$_SESSION数组中:

<?PHP
session_start();
if(!isset($_SESSION["pageviews"]))
{
    $_SESSION["pageviews"] = 0;
}
$_SESSION["pageviews"]++;
?>

当用户第一次访问此页面时,PHP将生成一个如下所示的随机会话标识符,并要求浏览器将此ID存储在cookie中:

fh4giqncq25ntgs7gjunvj6i33

在服务器上,它将存储并记住有一个pageviews变量,其值为1,属于会话ID fh4giqncq25ntgs7gjunvj6i33.

用户下次访问该页面时,他或她的浏览器将发送先前的会话ID以及请求(假设cookie未过期或被删除). PHP然后识别此ID,并使用pageviews = 1填充$_SESSION数组,然后递增它:pageviews = 2

在安全性方面,请考虑以下问题:

用户是否能够读取存储的数据?否 – 客户端看到的唯一内容是cookie中的随机会话ID;数据本身存储在服务器上.

用户是否能够更改或操作存储的数据?同样,不 – 如果在浏览器中更改了会话ID,PHP将无法再将浏览器与存储的数据联系起来.在这种最糟糕的情况下,用户将获得一个新的会话,从pageviews = 1开始.

会话的主要安全风险是会话劫持,当攻击者以某种方式设法从其他人的浏览器获取会话ID然后将其呈现给服务器,从而冒充其他用户.在我们的例子中,这没有多大意义,因为我们只存储页面视图计数;但是,大多数站点使用会话来跟踪哪个用户从哪个浏览器登录.在那种情况下,窃取他人的会话将意味着访问他们的帐户.

隐藏的领域

在这种情况下,我们有一个带有隐藏字段的表单:

<form action="..." method="post">
    <input type="hidden" name="pageviews" value="<?PHP print($pageviews); ?>" />
    ...
</form>

在服务器上,我们从$_POST中检索pageviews变量并将其递增:

<?PHP
$pageviews = @$_POST["pageviews"];
$pageviews++;
?>

因此,我们不是将其存储在服务器上,而是将数据发送到客户端,并在后续请求中将其返回.除了它只适用于POST请求之外,让我们看看这个解决方案的安全相关缺点:

用户是否能够读取存储的数据?是的 – 它直接进入HTML代码中的浏览器.

用户是否能够更改或操作存储的数据?是的 – 没有什么可以阻止用户在他或她的浏览器中打开开发人员工具并将隐藏值更改为他或她喜欢的任何内容.提交表单后,服务器将获取更改的数据.

< input type =“hidden”>的问题是你不能信任客户端,因此你必须验证每个请求中获得的数据.在某些情况下执行此操作可能是合理的,例如填写多页表单,但即使这样也可以通过会话更好地解决.

摘要

通过$_SESSION保留数据通常比使用< input type =“hidden”>更安全.因为会话数据存储在服务器上,因此不能被客户端篡改.只有随机会话标识符在cookie中发送到浏览器,该cookie将服务器上的数据绑定到该特定浏览器.

php – 使用会话变量而不是隐藏的输入字段更安全吗?的更多相关文章

  1. HTML5 Web缓存和运用程序缓存(cookie,session)

    这篇文章主要介绍了HTML5 Web缓存和运用程序缓存(cookie,session),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. 关于h5中的fetch方法解读(小结)

    这篇文章主要介绍了关于h5中的fetch方法解读(小结),fetch身为H5中的一个新对象,他的诞生,是为了取代ajax的存在而出现,有兴趣的可以了解一下

  3. iOS Swift上弃用后Twitter.sharedInstance().session()?. userName的替代方案

    解决方法如果您仍在寻找解决方案,请参阅以下内容:

  4. 使用Fabric SDK iOS访问Twitter用户时间线

    我试图在这个问题上挣扎两天.我正在使用FabricSDK和Rest工具包,试图为Twitter使用不同的RestAPIWeb服务.我可以使用具有authTokenSecret,authToken和其他值的会话对象的TWTRLogInButton成功登录.当我尝试获取用户时间线时,我总是得到失败的响应,作为:{“errors”:[{“code”:215,“message”:“BadAuthentic

  5. ios – 如何在Swift中手动为UIWebView设置Cookie

    我需要在swift中为webview设置一个cookie.我找到了一个解决方案,但它是针对objective-c的.如何在Swift中做到这一点?

  6. ios – 如何从变量访问属性或方法?

    是否可以使用变量作为Swift中方法或属性的名称来访问方法或属性?在PHP中,您可以使用$object->{$variable}.例如编辑:这是我正在使用的实际代码:解决方法你可以做到,但不能使用“纯粹的”Swift.Swift的重点是防止这种危险的动态属性访问.你必须使用Cocoa的Key-ValueCoding功能:非常方便,它完全穿过你要穿过的字符串到属性名称的桥,但要注意:这里是龙.

  7. ios – 如何从Apple Watch调用iPhone上定义的方法

    有没有办法从Watchkit扩展中调用iPhone上的类中定义的方法?根据我的理解,目前在Watchkit和iPhone之间进行本地通信的方法之一是使用NSUserDefaults,但还有其他方法吗?

  8. 通过在iOS中处理cookie来维护会话信息

    我是iOS开发的新手.我正在使用NSURLSession来管理会话信息.下面是我用来调用任何服务器API的示例代码,我的申请流程是,如果没有登录–>登录(呼叫登录api)Else转到主屏幕并调用其他API.我的问题是,一旦从内存中删除应用程序,会话信息就不会被维护,我不得不再次调用Login.我的要求就像Facebook一样,用户只需登录一次,并且在下次应用程序启动时保持会话.编辑:我想我必须通过

  9. iOS &gt;&gt;块&gt;&gt;更改块外部的变量值

    我不是在处理一个Object并改变它,就像我的mString一样.我希望’center’属性的行为类似于myInt,因为它是直接访问的C结构,而不是指向对象的指针.我希望’backgroundColor’的行为类似于我的imstring,因为它是一个指向一个新对象的对象的指针,不是吗?

  10. ios – Xcode Bot:如何在post触发器脚本上获得.ipa路径?

    我正在使用机器人来存档iOS应用程序,我需要获取.ipa产品路径才能将其发布到我们的分发系统中.机器人设置:并使用脚本打印所有env变量,其中不包含ipa文件的路径.此外,一些变量指向不存在的目录,即:XCS_OUTPUT_DIR这里的env变量输出:除此之外,我还能够确认.ipa文件是在另一个文件夹中创建的(/IntegrationAssets//

随机推荐

  1. PHP个人网站架设连环讲(一)

    先下一个OmnihttpdProffesinalV2.06,装上就有PHP4beta3可以用了。PHP4给我们带来一个简单的方法,就是使用SESSION(会话)级变量。但是如果不是PHP4又该怎么办?我们可以假设某人在15分钟以内对你的网页的请求都不属于一个新的人次,这样你可以做个计数的过程存在INC里,在每一个页面引用,访客第一次进入时将访问时间送到cookie里。以后每个页面被访问时都检查cookie上次访问时间值。

  2. PHP函数学习之PHP函数点评

    PHP函数使用说明,应用举例,精简点评,希望对您学习php有所帮助

  3. ecshop2.7.3 在php5.4下的各种错误问题处理

    将方法内的函数,分拆为2个部分。这个和gd库没有一点关系,是ecshop程序的问题。会出现这种问题,不外乎就是当前会员的session或者程序对cookie的处理存在漏洞。进过本地测试,includes\modules\integrates\ecshop.php这个整合自身会员的类中没有重写integrate.php中的check_cookie()方法导致,验证cookie时返回的username为空,丢失了登录状态,在ecshop.php中重写了此方法就可以了。把他加到ecshop.php的最后面去就可

  4. NT IIS下用ODBC连接数据库

    $connection=intodbc_connect建立数据库连接,$query_string="查询记录的条件"如:$query_string="select*fromtable"用$cur=intodbc_exec检索数据库,将记录集放入$cur变量中。再用while{$var1=odbc_result;$var2=odbc_result;...}读取odbc_exec()返回的数据集$cur。最后是odbc_close关闭数据库的连接。odbc_result()函数是取当前记录的指定字段值。

  5. PHP使用JpGraph绘制折线图操作示例【附源码下载】

    这篇文章主要介绍了PHP使用JpGraph绘制折线图操作,结合实例形式分析了php使用JpGraph的相关操作技巧与注意事项,并附带源码供读者下载参考,需要的朋友可以参考下

  6. zen_cart实现支付前生成订单的方法

    这篇文章主要介绍了zen_cart实现支付前生成订单的方法,结合实例形式详细分析了zen_cart支付前生成订单的具体步骤与相关实现技巧,需要的朋友可以参考下

  7. Thinkphp5框架实现获取数据库数据到视图的方法

    这篇文章主要介绍了Thinkphp5框架实现获取数据库数据到视图的方法,涉及thinkPHP5数据库配置、读取、模型操作及视图调用相关操作技巧,需要的朋友可以参考下

  8. PHP+jquery+CSS制作头像登录窗(仿QQ登陆)

    本篇文章介绍了PHP结合jQ和CSS制作头像登录窗(仿QQ登陆),实现了类似QQ的登陆界面,很有参考价值,有需要的朋友可以了解一下。

  9. 基于win2003虚拟机中apache服务器的访问

    下面小编就为大家带来一篇基于win2003虚拟机中apache服务器的访问。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. Yii2中组件的注册与创建方法

    这篇文章主要介绍了Yii2之组件的注册与创建的实现方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下

返回
顶部