[Koha-patches] [PATCH] Bug 1953: refactoring C4::Koha::get_itemtypeinfos_of to eliminate potential SQL injection
Andrew Moore
andrew.moore at liblime.com
Fri Jul 25 22:31:11 CEST 2008
C4::Koha::get_itemtypeinfos_of was not using plceholders, opening itself up to
potential SQL injection attacks. This patch refactors it to use placeholders to
bind parameters.
I also had to extend C4::koha::get_infos_of to allow us to pass bind parameters into it.
I'm including a test module for C4::Koha::get_itemtypeinfos_of.
---
C4/Koha.pm | 22 ++++++----
t/lib/KohaTest/Koha/get_itemtypeinfos_of.pm | 59 +++++++++++++++++++++++++++
2 files changed, 72 insertions(+), 9 deletions(-)
create mode 100644 t/lib/KohaTest/Koha/get_itemtypeinfos_of.pm
diff --git a/C4/Koha.pm b/C4/Koha.pm
index 65822aa..401dd9c 100644
--- a/C4/Koha.pm
+++ b/C4/Koha.pm
@@ -261,16 +261,17 @@ sub GetItemTypes {
sub get_itemtypeinfos_of {
my @itemtypes = @_;
- my $query = '
+ my $placeholders = join( ', ', map { '?' } @itemtypes );
+ my $query = <<"END_SQL";
SELECT itemtype,
description,
imageurl,
notforloan
FROM itemtypes
- WHERE itemtype IN (' . join( ',', map( { "'" . $_ . "'" } @itemtypes ) ) . ')
-';
+ WHERE itemtype IN ( $placeholders )
+END_SQL
- return get_infos_of( $query, 'itemtype' );
+ return get_infos_of( $query, 'itemtype', undef, \@itemtypes );
}
# this is temporary until we separate collection codes and item types
@@ -788,9 +789,12 @@ sub getFacets {
=head2 get_infos_of
-Return a href where a key is associated to a href. You give a query, the
-name of the key among the fields returned by the query. If you also give as
-third argument the name of the value, the function returns a href of scalar.
+Return a href where a key is associated to a href. You give a query,
+the name of the key among the fields returned by the query. If you
+also give as third argument the name of the value, the function
+returns a href of scalar. The optional 4th argument is an arrayref of
+items passed to the C<execute()> call. It is designed to bind
+parameters to any placeholders in your SQL.
my $query = '
SELECT itemnumber,
@@ -810,12 +814,12 @@ SELECT itemnumber,
=cut
sub get_infos_of {
- my ( $query, $key_name, $value_name ) = @_;
+ my ( $query, $key_name, $value_name, $bind_params ) = @_;
my $dbh = C4::Context->dbh;
my $sth = $dbh->prepare($query);
- $sth->execute();
+ $sth->execute( @$bind_params );
my %infos_of;
while ( my $row = $sth->fetchrow_hashref ) {
diff --git a/t/lib/KohaTest/Koha/get_itemtypeinfos_of.pm b/t/lib/KohaTest/Koha/get_itemtypeinfos_of.pm
new file mode 100644
index 0000000..9845e90
--- /dev/null
+++ b/t/lib/KohaTest/Koha/get_itemtypeinfos_of.pm
@@ -0,0 +1,59 @@
+package KohaTest::Koha::get_itemtypeinfos_of;
+use base qw( KohaTest::Koha );
+
+use strict;
+use warnings;
+
+use Test::More;
+
+use C4::Koha;
+
+=head2 get_one
+
+calls get_itemtypeinfos_of on one item type and checks that it gets
+back something sane.
+
+=cut
+
+sub get_one : Test( 8 ) {
+ my $self = shift;
+
+ my $itemtype_info = C4::Koha::get_itemtypeinfos_of( 'BK' );
+ ok( $itemtype_info, 'we got back something from get_itemtypeinfos_of' );
+ isa_ok( $itemtype_info, 'HASH', '...and it' );
+ ok( exists $itemtype_info->{'BK'}, '...and it has a BK key' )
+ or diag( Data::Dumper->Dump( [ $itemtype_info ], [ 'itemtype_info' ] ) );
+ is( scalar keys %$itemtype_info, 1, '...and it has 1 key' );
+ foreach my $key ( qw( imageurl itemtype notforloan description ) ) {
+ ok( exists $itemtype_info->{'BK'}{$key}, "...and the BK info has a $key key" );
+ }
+
+}
+
+=head2 get_two
+
+calls get_itemtypeinfos_of on a list of item types and verifies the
+results.
+
+=cut
+
+sub get_two : Test( 13 ) {
+ my $self = shift;
+
+ my @itemtypes = qw( BK MU );
+ my $itemtype_info = C4::Koha::get_itemtypeinfos_of( @itemtypes );
+ ok( $itemtype_info, 'we got back something from get_itemtypeinfos_of' );
+ isa_ok( $itemtype_info, 'HASH', '...and it' );
+ is( scalar keys %$itemtype_info, scalar @itemtypes, '...and it has ' . scalar @itemtypes . ' keys' );
+ foreach my $it ( @itemtypes ) {
+ ok( exists $itemtype_info->{$it}, "...and it has a $it key" )
+ or diag( Data::Dumper->Dump( [ $itemtype_info ], [ 'itemtype_info' ] ) );
+ foreach my $key ( qw( imageurl itemtype notforloan description ) ) {
+ ok( exists $itemtype_info->{$it}{$key}, "...and the $it info has a $key key" );
+ }
+ }
+
+}
+
+
+1;
--
1.5.6
More information about the Koha-patches
mailing list