全部
运行PHP版本5.2.11并且我们已经获得了一个我们被告知在早期版本(可能是4版)上运行的网站。
我们遇到一个奇怪的问题,其中有几个页面有一堆更新MySql的表单无效。问题是更新脚本中使用的变量没有在PHP之前的任何地方定义。例如
UPDATE users SET FirstName='$form_firstname'WHERE UserID='$id'"
现在,如果我们将其更改为..
$form_firstname = $_POST['form_firstname'];
UPDATE users SET FirstName='$form_firstname'WHERE UserID='$id'"
然后更新工作。我们可以为每个更新语句中定义的每个变量执行此操作,但我认为这看起来必须先前工作,我们正在查看形成这些变量的某些已弃用的代码。我找了任何
import_request_variables
陈述,但是nada。
任何人都可以想到在新服务器中默认关闭的任何内容会导致此问题,或者是否必须在某处声明此变量?
非常欢呼
答案 0 :(得分:8)
这是register_globals
。 不要使用它;它是gaping security hole。
答案 1 :(得分:1)
如其他地方所述,因为原始代码启用了register_globals - 这是非常糟糕的做法。
作为一个快速黑客,您可以在每个页面的顶部添加一些代码(在全局范围内):
extract($_GET); extract($_POST);
...具有相同的效果,但逐个脚本。但是,只有在您正确地重新实现代码时才能保持站点运行。请注意,这不是代码的唯一问题 - 将未经检查的用户输入拼接到SQL语句中是灾难的一个方法。
您应该将代码重写为....
$form_firstname = mysql_real_escape_string($_POST['form_firstname'], $db_handle);
$id = mysql_real_escape_string($_POST['id'], $db_handle);
$qry="UPDATE users SET FirstName='$form_firstname'WHERE UserID='$id'";
下进行。
答案 2 :(得分:0)
我希望你不要将它用于严肃的事情。该代码适用于各种入侵,注入和黑客攻击。我有两个答案给你。快速&脏:打开register_globals。替代方案:找人从头开始重写您的应用程序或找到更好的应用程序。
答案 3 :(得分:-2)
我认为你需要在php.ini中设置resister_global = on