我有一个类在PHP函数。这个文件在服务器上…我可以从url从这个文件调用任何函数吗?我不想修改这个文件…我只知道函数名,这里是function
class mClass {
function execute($q) {
$result = mysql_query($q) or die(mysql_error()."<br />".$q);
}
function getParams($var, $default = '')
{
$tmpvar = $default;
if ( isset($_REQUEST[$var]) ) $tmpvar = $_REQUEST[$var];
return $tmpvar;
}
}
我可以这样做吗? mydomain.com/myfile.php?execute('my query here')
?
为了防止其他人设想做这样的事情,我觉得有义务回答"不要这样做!!!!! "
这是一个可怕的安全漏洞和灾难等待发生。您还不如直接交出服务器的控制权。除此之外,它还提供了有关系统设计的详细信息(再次为黑客提供不必要的信息)。此外,您无法保证何时,如何,以什么顺序,使用什么参数,在什么情况下可以调用函数,函数xxx
使用的cookie变量的内容是什么。你正在以一种可怕的方式放弃对你的系统的控制。
现在让我们看看你的具体例子。如果我看到一个网站有?execute(...)
,那就会发出危险信号。作为黑客,我想,"当然不会,没有人会做这样的事情!"所以我谷歌了一下URL的那一部分,果然出现了堆栈溢出的问题,我看到你把参数转储到一个MYSQL查询。"天哪,我甚至不需要sql注入!"
所以,作为一个邪恶的人,我决定把这个查询放在:
.php?execute('SELECT * FROM `information_schema`.`tables`')
现在我看到了你的数据库结构,看,有一个名为user_account_info
的表!我想知道如何利用这些信息向你勒索数百万美元……
I could try
.php?execute('SELECT * FROM user_account_information')
或者
.php?execute('SELECT credit_card FROM user_account_information')
但是为什么要停在这里呢,我真的可以用
来扭转局面UPDATE user_account_information SET vital_customer_information =
ENCRYPT(vital_customer_information, my_key_which_you_will_never_crack);
现在,你想要回你重要的客户信息?你先在我开曼群岛的银行账户里存点钱,然后我再考虑....
即使忽略安全隐患,这也是一个糟糕的设计。通过让用户在代码中透明地调用函数,封装、信息隐藏等的全部意义都被打破了。
其他人都指出你真的不应该这样做,我同意。但如果有人拿枪指着你的头,你可以用这样的URL:
mydomain.com/myfile.php?sql=my%20query%20here
然后在PHP中,您将使用$_GET['sql']
来获取查询。
顺便说一句,对所有警告Bobby Tables的人——你没有听说过限制GRANT权限吗?当我们运行只需要读取的应用程序时,它们只使用具有SELECT权限的帐户,而不是UPDATE或DELETE。像这样的脚本绝对应该使用权限非常有限的帐户。