首页 >后端开发 >php教程 >向高手求教:php post提交问题

向高手求教:php post提交问题

WBOY
WBOY原创
2016-06-23 14:20:08941浏览

php post提交

小虾做了一个程序:通过Ajax 技术调用后台PHP的执行过程 向Mysql写数据库,功能是实现了。
后来发现有用户通过 url直接拼凑参数手工通过网址输入方式调用php的执行过程。 
问题1: 有什么好的办法可以禁止直接手工通过网址向后台提交呢?
我查了一些帮助,大意是提交前:通过时间t向后台提交获得相对应的加密键值k1,
在正式提交时,将t与k1都提交,后台通过t重新加密得出k2,如果k1与k2相同,则执行写入数据库过程。
问题2:这种方式,增加了获取键值k1这个过程,肯定比不获取k1多费时间。 有什么办法规避呢?
问题3:获取加密键值k1这个过程又如何保证不被别人直接手工通过网址向后台调用呢?
恳请高人指点! 
谢谢先!


回复讨论(解决方案)

我一般是这么干的

具体的代码

然后就没有了,就是把最后的“?>”去掉了,这样直接提交过来的页面会因为语法错误而执行不了

我一般是这么干的

具体的代码

然后就没有了,就是把最后的“?>”去掉了,这样直接提交过来的页面会因为语法错误而执行不了
-------
这个解决方法有点“偏方”的味道。。。,  
真诚感谢回复!

说实话B/S架构很难避免server端接收的数据一定是由你希望的Browser端发送过来的,毕竟server端只是提供一个页面供客户端请求,接收请求后开始运行。就算是用session验证登录也可以被模拟,所以很难做到接收的数据一定是由你返回页面所产生的,至少我没想到有什么办法,呵呵。
建议在表单上添加一些hidden,通过验证hidden的值来判断(类似楼主所提的方法),但这些方法还是可以被模拟的,只能防范技术较低的人。

我不知道有防范这种调用方式的方法. 毕竟接口写出来就是让用的,只要符合规则让它调用就是了,接口内尽量写的安全些..

关于少写?>xuzuning版大讲过,这样才是更规范更合适的写法, PHP会自动把最后一行后边的换行和空格全部删掉.至于是否对楼主的问题有效就不清楚了,.

使用sesseion可以防止恶意注入数据,具体方法: http://www.ibihuo.com/show-60.html

你的后台是不需要登录的么?

to anglegz : 你从高度回复了我的疑惑, 不过我的应用都是B/S的,改成 B/C的目前不可能;
to anyilaoliu : 接口写安全些是一个解决方案, 用户手工网址方式提交本质就是跳过了ajax检查步骤直接送到后台;
to ahui_lcm: 是需要登录的,目前是登录后的用户(不登录是不能提交的),在同一台机器上再开一个相同的浏览器,手工在地址栏上提交非法数据。
to y244360439: 你的链接中“然后将这个值用sesseion存储起来,$_SESSEION['hash'] = $hash;
”,如何保证写session的存储过程不被用户单独调用呢?  我的理解写session过程也是 带参数的post提交,这也可以通过手工在地址栏提交, 是不是我理解得不对?
多谢各位, 还有没有其它建议?

在前台用js做的限制和判断 要在PHP中再判断一次 否则遇到你说这种绕开js验证的时候就悲剧了

在前台用js做的限制和判断 要在PHP中再判断一次 否则遇到你说这种绕开js验证的时候就悲剧了
------------------------------------
如果在后台再判断一次, 这时候就需要post更多的参数用来作为判断与限制的变量。 在这个post的过程中,就又会有手工网址方式输入的方式对输入变量作假了。 哎, 不还是有漏洞么!?




在前台用js做的限制和判断 要在PHP中再判断一次 否则遇到你说这种绕开js验证的时候就悲剧了
------------------------------------
如果在后台再判断一次, 这时候就需要post更多的参数用来作为判断与限制的变量。 在这个post的过程中,就又会有手工网址方式输入的方式对输入变量作假了。 哎, 不还是有漏洞么!?





如果手工输入的变量都是符合要求的  应该不会担心吧?



在前台用js做的限制和判断 要在PHP中再判断一次 否则遇到你说这种绕开js验证的时候就悲剧了
------------------------------------
如果在后台再判断一次, 这时候就需要post更多的参数用来作为判断与限制的变量。 在这个post的过程中,就又会有手工网址方式输入的方式对输入变量作假了。 哎, 不还是有漏洞么!?





如果手工输入的变量都是符合要求的  应该不会担心吧?
-----------------------------------
手工输入的变量都是符合要求的,自然没有问题。  问题是用户提交“非法”数据。

各位大拿, 还有没有无漏洞的方案呢?  
目前依据我的判断, 用户已经可以获取到"hidden" 变量值的。

手动的话hidden当然可以拿到 就在dom节点中

用户提交"非法"数据  你如何判断它是非法的? 既然是非法的又能判断,判断出来后不继续执行不就可以了...

手动的话hidden当然可以拿到 就在dom节点中

用户提交"非法"数据  你如何判断它是非法的? 既然是非法的又能判断,判断出来后不继续执行不就可以了...
--------------------
“非法”结论是通过后来人工分析数据得出的。 
按照你的说法, 就是在现有js 检查判断“提交数据值”基础上, 将相应的核查重新在php上再进行一次。这个方案我觉得可以尝试一下, 前提条件是:我能够依据后台已经有的数据重新推导出前台用于判断的参数变量,而不是将前台参数变量直接提交到数据库中后使用。
此方法值得一试! 这样就不需要在session中记录加密键值什么的了。

必须不能直接进数据库   进数据库之前要检测下是否有可能引起注入攻击的代码  

除非是个人测试站,没有直接入库的.

to anglegz : 你从高度回复了我的疑惑, 不过我的应用都是B/S的,改成 B/C的目前不可能;
to anyilaoliu : 接口写安全些是一个解决方案, 用户手工网址方式提交本质就是跳过了ajax检查步骤直接送到后台;
to ahui_lcm: 是需要登录的,目前是登录后的用户(不登录是不能提交的),在同一台机器上再开一个相同的浏览器,手工在地址栏上提交非法数据。
to y244360439: 你的链接中“然后将这个值用sesseion存储起来,$_SESSEION['hash'] = $hash;
”,如何保证写session的存储过程不被用户单独调用呢?  我的理解写session过程也是 带参数的post提交,这也可以通过手工在地址栏提交, 是不是我理解得不对?
多谢各位, 还有没有其它建议? session是后台随机生成的,不会受到用户的干扰,discuz也是用的这种办法,他的很多操作都有formharsh值,就是这个原理

最近我正在写这么一个东西, 目前没有很好的办法,参数都可以模拟,后台你如何限制呢,参数又都是合法的

这样的一般  csrf

地址栏上的参数,能用$_POST取的到?你在程序里用$_POST接收表单传过来的数据。如果他用地址栏直接输入参数,难道$_POST会接收到?

模拟是另一种需求,绝对防止是不可能的。

增加难度是可以的。与需求

我一般是这么干的

具体的代码

然后就没有了,就是把最后的“?>”去掉了,这样直接提交过来的页面会因为语法错误而执行不了
没看懂

to y244360439: session是后台随机生成的,不会受到用户的干扰,discuz也是用的这种办法,他的很多操作都有formharsh值,就是这个原理 
---------------------------
我想找个类似的参考一下, 
只找到了 SWFUpload 的源码,它的处理为:
1)前台调用页面的JS 中对URL参数赋值:"PHPSESSID" : ""
2)在后台执行脚本中对sessionid检查并赋值:
// Code for Session Cookie workaround
if (isset($_POST["PHPSESSID"])) {
session_id($_POST["PHPSESSID"]);
} else if (isset($_GET["PHPSESSID"])) {
session_id($_GET["PHPSESSID"]);
}
真心没有找到在JS中如何实现"sesseion存储起来,$_SESSEION['hash'] = $hash”?  可否指导一下具体如何操作? 不行下载discuz源码在琢磨一下。
to ahui_lcm: 看了提交代码,获取变量都是通过 $_REQUEST[‘xxx']方式的,后面改$_POST,应该是代码一大改进。我这个现学现卖的半吊子 漏马甲了 :)

做进一步的说明,你可以再看下,不明白可以在网站上q我, http://www.ibihuo.com/show-60.html

你可以自己?一?加密解密函?,例如:
ajax提交到??的一?url  http://localhost/a.php?key=REWTR54365EY&val=??

其中key的值是使用php的加密函?加密之後的?容(例如:自定?加密函?("要提交的?果")),提交到a.php之後用解密函?得到key的值(然後和要提交的?果作比?),看看是否符合本次提交的需求

其实可以用加密键,同样post到接受页面,在接受页面解密和验证key,

使用$_SERVER["HTTP_REFERER"]判断是不是来自你的页面。伪造$_SERVER["HTTP_REFERER"]是违法的。技术上没有破解不了的东西。

做进一步的说明,你可以再看下,不明白可以在网站上q我, http://www.ibihuo.com/show-60.html
------------------------------------------
我准备试用你说的加密与解密的方法, 提交加密通过Ajax的变量 data: "hash="+hash 来实现, 可是客户端获取后台PHP 生成的 $hash 值我没有很好的方法(我的前台与被调用的后台是分在不同的2个文件中的)。 目前找到获取后台PHP生成$hash值的方法也是单独通过ajax调用, 个人觉得这种获取过程降低了提交效率,同时也可能会泄密。 
可否详细说一下$_SESSEION['hash'] 前台是如何获取的呢? 不胜感激!

1、只用 $_POST 接受提交,可使url参数无效
2、在 cookie 中,置入识别字(包括sessionid)。但cookie可轻易获取,不能确保安全
3、利用js提交(包括动态加入识别字)。一般工具不会执行js,情况会有些好转。但不能排除人工跟踪后进行通讯干预

1、只用 $_POST 接受提交,可使url参数无效
2、在 cookie 中,置入识别字(包括sessionid)。但cookie可轻易获取,不能确保安全
3、利用js提交(包括动态加入识别字)。一般工具不会执行js,情况会有些好转。但不能排除人工跟踪后进行通讯干预
---------------------------------------
1、只用 $_POST 接受提交,可使url参数无效
----> 前面ahui_lcm 提到过, 已经修改了,对于对付手工地址非法输入确实有效。
2、在 cookie 中,置入识别字(包括sessionid)。但cookie可轻易获取,不能确保安全
----> 后面可以加进去,虽然不确保安全, 也算是增加被攻破的难度。
3、利用js提交(包括动态加入识别字)。
----> 增加识别字, 考虑过增加验证码的识别方法,后来觉得用户操作会变得多一步,影响用户使用感受, 目前暂不考虑此方法了。
集思广益, 多谢各位回复 !

1、只用 $_POST 接受提交,可使url参数无效
2、在 cookie 中,置入识别字(包括sessionid)。但cookie可轻易获取,不能确保安全
3、利用js提交(包括动态加入识别字)。一般工具不会执行js,情况会有些好转。但不能排除人工跟踪后进行通讯干预

我是php新手,版主能否详细说一下2,3条是什么意思?


做进一步的说明,你可以再看下,不明白可以在网站上q我, http://www.ibihuo.com/show-60.html
------------------------------------------
我准备试用你说的加密与解密的方法, 提交加密通过Ajax的变量 data: "hash="+hash 来实现, 可是客户端获取后台PHP 生成的 $hash 值我没有很好的方法(我的前台与被调用的后台是分在不同的2个文件中的)。 目前找到获取后台PHP生成$hash值的方法也是单独通过ajax调用, 个人觉得这种获取过程降低了提交效率,同时也可能会泄密。 
可否详细说一下$_SESSEION['hash'] 前台是如何获取的呢? 不胜感激!

通过模板引擎把hash值付给前台模板

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn