AJAX、PHP、JSON&;查询字符串:如何安全有效地传递变量


AJAX, PHP, JSON & Query Strings: How to safely and effeciently pass variables?

我有一个搜索页面(search.php),它调用AJAX加载并将结果加载到#myresultsdiv:中

$('#myresults').load('results.php', {"q":"<?php echo urlencode($this->params['url']['q']); ?>","min":<?php echo urlencode($this->params['url']['min']); ?>,max:<?php echo urlencode($this->params['url']['max']); ?>});

查询字符串看起来像:

http://www.mydomain.com/search?q=test&min=50&max=100

results.php看起来像这样:

if (isset($data['q']) && isset($data['min']) && isset($data['max'])) {
 $q = urldecode($data['q']);
 $min = urldecode($data['min']);
 $max = urldecode($data['max']);
}

我获取querystring值,然后将它们发布到结果页面。是需要URLEncode还是应该使用htmlspecialchar()?我看过JSON.stringify(),我只是不知道如何"最好地"编码我的数据(这样它就不会被那些操纵querystring的人"破坏"),并将其安全地发布到后端,以便在我的后端php代码中使用。我最关心的是撇号和引号,我该如何处理它们?

最好的做法是删除任何您知道不允许使用的字符,这可以用preg_replace来完成。如果你不能做到这一点,htmlspecialchars()htmlentities()就会起作用。

当然,在搜索数据库之前先对数据进行转义。

根据jQuery文档的load(),您将获得变量POST:

如果数据是作为对象提供的,则使用POST方法;否则假设为GET。

所以你应该把它当作一个正常的POST。

例如,如果在查询中使用变量,则会使用mysql_escape_string()来防止mysql注入。