|
Posted by Jochem Maas on 08/24/05 15:16
hi Jay,
here is a new and improved version:
<?php
/*
* Query Finder
* Jay Blanchard (and a bit of Jochem too)
* August 2005
* NOT REALLY TOO EXTENSIBLE
*
* usage: call from command line, perform manual output to text file
* i.e. php qryfind.php > <nameOfFileToSave.txt>
*/
/* script help message */
if (in_array('--help', $_SERVER['argv']) ||
in_array('-h', $_SERVER['argv']) ||
in_array('-?', $_SERVER['argv']))
{
echo '
Use this command to search for SQL query strings inside php files.
call from command line, perform manual output to text file
i.e. php '.basename(__FILE__).' > <nameOfFileToSave.txt>
arguments:
-nr no recursion - do not search in subdirectories
-f filtering - only show lines that contain the string passed as the arg to this flag
--filter same as -f
-v show more output, e.g. prints every scanned file instead of only the ones in whichs query strings were found.
--verbose same as -v
show this message: -?, -h or --help
';
exit;
}
/* cruise the directory looking for PHP files */
function findTheQueries($theDirectory, $filterString = null, $beVerbose = false, $NoRec = false)
{
static $arrQueryStarters, $arrQueryStartersCnt, $dirSep;
if (!isset($arrQueryStarters)) {
$arrQueryStarters = array('SELECT ', 'INSERT ', 'UPDATE ', 'FROM ', 'EXECUTE ', 'WHERE ', 'ORDER BY ',
'LEFT JOIN ');
$arrQueryStartersCnt = count($arrQueryStarters);
// Determine OS specific settings
$uname = php_uname();
if (substr($uname, 0, 7) == "Windows") {
$dirSep = "\\";
} else if (substr($uname, 0, 3) == "Mac") {
$dirSep = "/";
} else {
$dirSep = "/";
}
}
if (is_dir($theDirectory)) {
/*
* or you could just use glob('*.php')
*/
if ($dh = opendir($theDirectory)) {
while (($theFile = readdir($dh)) !== false) {
/* recurse subdirs */
if (is_dir($theDirectory.$dirSep.$theFile)) {
if ($theFile != '.' && $theFile != '..' && !$NoRec) {
findTheQueries($theDirectory.$dirSep.$theFile, $filterString, $beVerbose);
}
continue;
}
/* we only want to look at PHP files */
$fileParts = array_reverse(explode('.', $theFile));
if("php" == $fileParts[0]){
/* always echo the file name, even if no queries */
$fileNameOutputLine = "Filename: {$theDirectory}{$dirSep}{$theFile}\n";
if ($beVerbose) {
echo $fileNameOutputLine;
unset($fileNameOutputLine);
}
$lineNo = 0;
/* cruise the file looking for queries */
$openFile = fopen($theDirectory.$dirSep.$theFile, "r");
while(!feof($openFile)){
$fileLine = fgets($openFile, 4096);
$lineNo++;
/* loop through query starter array */
for($i = 0; $i < $arrQueryStartersCnt; $i++){
if(strstr($fileLine, $arrQueryStarters[$i])) {
if (!empty($filterString) && !strstr($fileLine, $filterString)) {
continue;
}
if (isset($fileNameOutputLine)) {
echo $fileNameOutputLine;
unset($fileNameOutputLine);
}
echo " Line " . str_pad($lineNo, 4, ' ', PAD_LEFT) . ": " . $fileLine;
break; // if we find a line no need to find it again because it contains more than one
keyword.
}
}
}
fclose($openFile);
}
}
closedir($dh);
} else {
echo "Could not open: $theDirectory\n";
}
} else {
echo "Bad directory: $theDirectory\n";
}
}
/*
* Determine command args
*/
$filterString = null;
$beVerbose = false;
$NoRec = false;
foreach ($_SERVER['argv'] as $k => $v) {
/* determine (extra) filtering string */
if ($v == '-f' || $v == '--filter' || $v == '--filt') {
$filterString = isset($_SERVER['argv'][ $k + 1 ])
? $_SERVER['argv'][ $k + 1 ]
: null;
}
if ($v == '-v' || $v == '--verbose') {
$beVerbose = true;
}
if ($v == '-nr') {
$NoRec = true;
}
}
echo "Searching for queries in php files in: $theDirectory\n";
if (isset($filterString)) {
echo "...only lines containing '$filterString' will be shown.\n";
}
/* which directory will we be opening? this one, of course */
findTheQueries(getcwd(), $filterString , $beVerbose, $NoRec);
[Back to original message]
|