连接表时,我使用Zend Framework的SQL模型。例如,我修改了我的实际代码,但我想您会明白的:
$this->getSelect()->join(
array('sections' => $sectionsTableName),
'main_table.banner_id = pages.banner_id',
array()
)
->where("sections.section= '$section' OR sections.section = '0' OR (sections.section = '6' AND ? LIKE main_table.url)",$url)
->group('main_table.banner_id');
该页面加载了ajax,并且$ section参数作为GET参数(www.example.com/controllerName/index/display/3?paremeter1=example§ion=www.example2.com
)发送。
如果有人执行以下操作,这就是问题所在:
www.example.com/controllerName/index/display/3?paremeter1=example&url=(SELECT 3630 FROM(SELECT COUNT(*),CONCAT(0x7170786a71,(SELECT (ELT(3630=3630,1))),0x717a716b71,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.CHARACTER_SETS GROUP BY x)a)
这样,用户可以转储整个数据库。不会显示数据,但是SQL仍会执行转储,这可能导致sql重载。
问题:
- 防止这种情况的最佳方法是什么?
- 现在,我为以前的客户感到担忧。使用此代码是否可以采取更大的风险措施,例如延迟或更改表?我猜不是因为您不能在SELECT中放入除SELECT之外的任何其他语句,所以DELETE将产生sql语法错误。我对吗?
更新: 我的示例不是对SQL注入的正确说明,因为存在'符号围绕$ sections,因此将无法进行注入。无论如何,当期望整数值并且不过滤整数输入时,这都是可能的。见下面我的评论。
'
sign之前总会有(
sign,因此(SELECT
否则其他任何东西都将像字符串一样起作用而不起作用。当字段是整数时,则'
不需要它,这使得这种情况成为可能。但是整数应该始终用进行过滤,intval()
因此这也不是问题。
'
怎么办?那' AND (SELECT ...) '
呢 顺便说一句,我不认为Zend不会引用这个……而且,如果您使用绑定,那么PDO将处理这个问题。只是永远不要使用这样的字符串连接:"sections.section= '$section'"
$db = Mage::getSingleton('core/resource')->getConnection('core_read');
,$db->quote()
也可以使用$db->quoteInto
。如果$this
是资源,则可以执行:如果是资源,$this->getConnection('core_read')->quoteInto()
则可以执行:$this->getResource()->getConnection('core_read')->quoteInto()
。遵循这些原则。如果这样可以帮助您实现目标。