SQL bug还是别的什么?

时间:2016-02-26 13:42:26

标签: php mysql joomla get

我在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"]."'";

3 个答案:

答案 0 :(得分:0)

表列Power的类型为float或double。在第一个查询中,您尝试插入字符串值。第二个查询通过首先将请求值转换为float并删除值周围的引号来插入正确的float。

顺便说一下,你永远不会在sql查询中使用未经过滤的用户输入(例如$ _GET值)。

答案 1 :(得分:0)

如果您正在使用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

答案 2 :(得分:-1)

实际上,经过几天我发现问题和解决方案更简单。

删除'-sign解决了问题

 Power='".$_GET["Power"]."'

 Power=".$_GET["Power"]."

此致