在javascript中暴露MySQL表名是否存在安全风险?

时间:2011-04-06 00:25:38

标签: php javascript mysql security

我有一个基本上像这样工作的ajax方法

function getRow(tableName, idName, idValue, callback)

这样做的明显好处是我有一个可以从任何表中检索数据的函数。但是,从安全角度来看,这只是感觉错误,这样做是否存在安全风险?实际读取/操作数据库的相应PHP文件是通过先前的身份验证过程来保护的,因此理论上,表名称在真空中的可见性不应该是风险(更不用说数据库只接受localhost连接),但是我想知道是否没有更好/更漂亮的方法来实现这一目标。

编辑:为了澄清身份验证过程,用户/角色安全性会阻止访问除用户明确允许的那些表之外的所有表。

6 个答案:

答案 0 :(得分:10)

如果您确定您没有SQL注入漏洞,并且您永远不会,那就没关系。

如果您确实有SQL注入漏洞,它将使攻击者的工作变得更加容易。

不用说(我希望)服务器端脚本必须使用可以通过此方法公开的表和列的白名单。

答案 1 :(得分:3)

表单名称并不是那么糟糕,但是,您似乎制作的API可能不是最好的主意......

仔细考虑是否有一些人不应该查询的表,因为从它的外观来看,我可以从客户端查询数据库中的任何表。例如:

getRow('users', 'id', '7', function(data){console.log(data)})

如果users表返回密码怎么办?即使是哈希,也不好。还是他们的电邮?如果我想收集所有用户的电子邮件怎么办?我可以编写这么简单的脚本。

答案 2 :(得分:1)

您可以在JS中显示例如users表名,但在服务器端添加类似forum_users的前缀,这将是数据库中的实际表名。这样,如果有人找到注入点,他会尝试DROP TABLE users,如果你幸运,查询将会失败:)

还为表和列添加白/黑列表,添加LIMIT 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";

答案 3 :(得分:1)

这是一种风险,因为它为攻击者提供信息。它与提供您正在使用的软件版本的软件相同。它本身并不是一个漏洞,但它是漏洞的大门。

答案 4 :(得分:1)

这是非常糟糕的主意

例如,假设您正在使用此代码:

$table_name=mysql_real_escape_string($_GET['table']);
$id_name=mysql_real_escape_string($_GET['idname']);
$id_value=mysql_real_escape_string($_GET['idvalue']);

mysql_query("select * from `$table_name` where `$id_name`='$id_value'");

这可以通过多种方式利用:

非SQL注入

此查询将返回mysql.user中的root用户,这是

?table=mysql.user&idname=user&idvalue=root 此请求将创建查询:

select * from {mysql.user {1}}使用者where

SQL注入:

这是有效的,因为mysql_real_escpae_string不会后退:``

='root'

答案 5 :(得分:0)

当然,客户端的直接数据库API应该用于非常特殊的情况。但是你可以用白名单轻松保护它。以PHP为例:

if (in_array($tableName, array("users", "log", "messages", ...))) {

因此,只要您在此处拥有固定列表,我认为从安全的角度来看,这不是什么大问题。