Php 使用哈希将不受信任的输入转换为受信任的输入
向php页面发出Php 使用哈希将不受信任的输入转换为受信任的输入,php,mysql,security,Php,Mysql,Security,向php页面发出get请求。其中一个键/值对被传递给该函数,getReport,该函数访问mysql数据库并返回json序列化字符串: function getReport($untrusted) { $tables = array( "day" => "p_day", "month" => "p_month" ... keys are 'untrusted', values are 'trusted'
get
请求。其中一个键/值对被传递给该函数,getReport
,该函数访问mysql数据库并返回json序列化字符串:
function getReport($untrusted) {
$tables = array(
"day" => "p_day",
"month" => "p_month"
... keys are 'untrusted', values are 'trusted' table names .....
);
$trusted = $tables[$untrusted];
if(!$trusted) {
... error out ...
}
$query = "select * from " . $trusted;
.... access mysql database, do some other stuff ...
}
问题:这是安全的吗?不受信任的输入仅用作查找以获取受信任的字符串。可信字符串用于生成查询
澄清:
这些数据是公开的。我担心SQL注入,或者用户访问连接参数或未在
$tables
中明确列出的表 我会说不。如果服务器得到的只是URL参数,那么任何拥有URL和哈希的人都不能浏览服务器。我想真正的答案需要更多的细节,返回什么,等等
通常,如果我想要安全访问,我会传递用户名/密码或令牌,这是用户身份验证。我在演示文稿和书中描述了类似的方法。我称之为白名单地图,但想法是一样的 在我的示例中,我使用array_key_exists(),因为如果尝试访问不存在的散列键,将出现错误。另外,如果密钥不存在,在我的示例中,我选择默认值而不是出错。但这取决于您,根据应用程序的要求,任何一种操作都可能是正确的
您还应该将散列限制为仅由给定web请求访问的表列表。不要仅仅因为URL名称正确就让URL查询数据库中的任何表。这意味着您需要为每个实例创建一个不同的哈希数组,其中用户输入决定了SQL标识符(表或列名等)。我会大胆地说是的,这是安全的。您正在控制可在SQL查询中使用的有效值,因此无法将意外的内容注入到查询中。就这么简单
显然,如果数据受到保护,那么除此之外,您还需要访问控制。对不起,这是一个措辞拙劣的问题。数据是公开的——我担心SQL注入或用户访问连接参数或未在
$tables
中显式列出的表。。。更新问题。很高兴听到我的推理是正确的。对于SQL,再小心也不为过!