我有一个ajax方法,其工作方式是这样的
function getRow(tableName, idName, idValue, callback)这样做的明显好处是,我有一个函数可以从任何表中检索数据。然而,从安全的角度来看,这感觉是错误的,这样做是否有安全风险?实际读取/操作数据库的相应PHP文件是通过先前的身份验证过程来保护的,因此从理论上讲,表名在真空中的可见性不应该是一种风险(更不用说数据库只接受本地主机连接),但我想知道是否没有更好/更漂亮的方法来实现这一点。
编辑:为了澄清身份验证过程,用户/角色安全性阻止访问除用户显式允许的表之外的所有表。
发布于 2011-04-06 00:30:25
单是表名并没有那么糟糕,但是,您所创建的API可能不是最好的主意……
仔细考虑是否有一些表是人们无法查询的,因为从它的外观来看,我可以从客户端查询数据库中的任何表。例如:
getRow('users', 'id', '7', function(data){console.log(data)})如果users表返回他们的密码怎么办?即使它是散列的,这也不好。还是他们的电子邮件?如果我想收集所有的用户电子邮件呢?很简单的脚本,我可以写这样做。
发布于 2011-04-06 00:35:02
您可以在JS中显示例如users表名,但在服务器端添加前缀,如forum_users,这将是数据库中的实际表名。这样,如果有人找到注入点,他将尝试DROP TABLE users,如果您幸运的话,查询将失败:)
还为表和列添加了一个白色/黑名单,添加了限制1(不要循环),不要返回多个数组,您应该使用这样的内容进行消毒。
$select = preg_replace("#[\w]#", "", $_GET["select"]);
$from = preg_replace("#[\w]#", "", $_GET["from"]);
$where = preg_replace("#[\w]#", "", $_GET["where"]);
$equals = mysql_real_escape_string($_GET["equals"]);
$query = "SELECT $select FROM $from WHERE $where = '$equals' LIMIT 1";发布于 2011-04-06 00:45:15
这是一种风险,因为它向攻击者提供信息。这与提供您正在使用的软件版本是一样的。这本身并不是一个漏洞,但它是一个漏洞的门。
https://stackoverflow.com/questions/5560165
复制相似问题