我在Joomla中做了一个简单的业余组件...
其中有一个选择>选项下拉列表,用于向 URL 添加参数。
问题是它不适用于 1.1 值,而是适用于 1.5 值。
我的一个朋友解决了这个问题,但我想知道为什么会发生这种情况
原始查询:
$query = "SELECT * FROM `TABLE 2` WHERE Power='".$_GET["Power"]."' AND Poles='".$_GET["Poles"]."'";
新的工作查询:
$query = "SELECT * FROM `TABLE 2` WHERE Power=".floatval($_GET["Power"])." AND Poles='".$_GET["Poles"]."'";
如果你正在使用Joomla,你应该坚持Joomla的编码标准和方法,这包括数据库查询:
https://docs.joomla.org/Selecting_data_using_JDatabase
您还应该使用 JInput
而不是$_POST
或$_GET
调用:
http://docs.joomla.org/Retrieving_request_data_using_JInput
查看您的查询,它应如下所示:
$db = JFactory::getDbo();
$input = JFactory::getApplication()->input;
$power = $input->get('Power', '', 'RAW');
$polls = $input->get('Pols', '', 'RAW');
$query = $db->getQuery(true);
$query->select($db->qn(array('*')))
->from($db->qn('#__table'))
->where($db->qn('Power') . ' = ' . $db->q($power), 'AND')
->where($db->qn('Polls') . ' = ' . $db->q($polls));
$db->setQuery($query);
$results = $db->loadObjectList();
// Do what you want with the $results object
使用此方法意味着可以正确转义列名称和数据值,并且您不会留下@skidr0w提到的 SQL 漏洞。
注意:#__
是数据库表前缀,假设您遵循了此方法。如果没有,只需将#__table
替换为表的全名
表列 Power 的类型为 float 或 double。在第一个查询中,您尝试插入字符串值。第二个查询通过首先将请求值强制转换为浮点数并删除值两边的引号来插入正确的浮点数。
顺便说一下,你永远不会在sql查询中使用未经过滤的用户输入(例如$_GET值)。
实际上,几天后我发现问题和解决方案更简单。
只需删除'符号即可解决问题
Power='".$_GET["Power"]."'
跟
Power=".$_GET["Power"]."
问候