使用用户输入保护simplexml_load_file文件名

时间:2012-12-02 21:21:09

标签: php simplexml

  

可能重复:
  Sanitize file path in PHP

我有一个看起来像这样的PHP脚本:

$search = $_REQUEST['search'];
$xml = simplexml_load_file("SOMEURL/search?q=".$search);

我想知道通过更改搜索参数来阻止人们尝试加载文件或网页的正确方法是什么。

我完全了解SQL注入问题并知道如何处理它们,但我不确定使用用户输入保护文件位置的最佳方法。

我期待你的回复。

修改

我正在为这个问题添加更多详细信息,因为它被标记为一个帖子的副本,它不能回答我所追求的内容。

我在Linux机器上有一个php脚本,它使用simplexml_load_file来查询在Windows机器上运行的SEARCH ENGINE Java(而不是javascript)脚本。用户可以将搜索项更改为用户希望的任何内容,因为它是搜索引擎。 Windows框中的脚本返回XML,然后PHP代码将其用于显示目的。

我想确保用户无法更改Search参数以加载其他网址或文件。

1 个答案:

答案 0 :(得分:1)

您将无法阻止用户/潜在攻击者更改“搜索”参数。您可以做和应该做的是验证输入到有效值列表。如果您的列表很小且是静态的,那么这可能是一个简单的数组:

$validSearchValues = array(
    'foo',
    'bar',
);

$search = $_REQUEST['search'];
if (! in_array($search, $validSearchValues)) {
    //anything other than foo or bar will reach this point
    echo 'invalid input';
} else {
    //only foo or bar values will reach this point
    $xml = simplexml_load_file("SOMEURL/search?q=".$search);
}

对于较大的值列表,您可以将它们存储在数据库中并发出查询以检查其有效性。

这个例子是基本的。有几个框架和组件有很好的输入验证方法,你应该研究(检查Zend Framework或Symfony)。