note 48065 added to security.database.sql-injection
| From: | Jones at example dot com | Date: | Fri, 10 Dec 2004 10:24:31 +0000 |
| Subject: | note 48065 added to security.database.sql-injection | ||
| Groups: | php.notes | ||
| Request: | Send a blank email to php-notes+get-81632@lists.php.net to get a copy of this message | ||
I use the following funktion to avoid such things:
<?php
function prepareSQL($queryString, $paramArr) {
foreach (array_keys($paramArr) as $paramName) {
if (is_int($paramArr[$paramName])) {
$paramArr[$paramName] = (int)$paramArr[$paramName];
}
elseif (is_numeric($paramArr[$paramName])) {
$paramArr[$paramName] = (float)$paramArr[$paramName];
}
elseif (($paramArr[$paramName] != 'NULL') and ($paramArr[$paramName] != 'NOT
NULL')) {
$paramArr[$paramName] = mysql_real_escape_string(stripslashes($paramArr[$paramName]));
$paramArr[$paramName] = '\''.$paramArr[$paramName].'\'';
}
}
return preg_replace('/\{(.*?)\}/ei','$paramArr[\'$1\']',
$queryString);
}
$sqlQuery = 'SELECT col1, col2 FROM tab1 WHERE col1 = {1} AND col3 = {2} LIMIT {3}';
$stm = mysql_query(prepareSQL($sqlQuery, array('username', 24.3, 20);
?>
So everything that's not NULL, NOT NULL, an integer or a float/double will be escaped with
MySQL's mysql_real_escape_string and putted into '
A problem is if e.g. an user gives an "hacked" variable for the LIMIT-Clause - than the
function whould return something like this
SELECT .... LIMIT '0; DELETE FROM users'
So mysql whould produce an error - but better than deleting the users table ;)
----
Manual Page -- http://www.php.net/manual/en/security.database.sql-injection.php
Edit -- http://master.php.net/manage/user-notes.php?action=edit+48065
Delete -- http://master.php.net/manage/user-notes.php?action=delete+48065&report=yes
Reason: bad code -- http://master.php.net/manage/user-notes.php?action=delete+48065&report=yes&reason=bad+code
Reason: spam -- http://master.php.net/manage/user-notes.php?action=delete+48065&report=yes&reason=spam
Reason: useless example -- http://master.php.net/manage/user-notes.php?action=delete+48065&report=yes&reason=useless+example
Reason: contains commercial links -- http://master.php.net/manage/user-notes.php?action=delete+48065&report=yes&reason=contains+commercial+links
Reason: useless note -- http://master.php.net/manage/user-notes.php?action=delete+48065&report=yes&reason=useless+note
Reject -- http://master.php.net/manage/user-notes.php?action=reject+48065&report=yes
Search -- http://master.php.net/manage/user-notes.php