Additional Sql-injection functions and techniques for escaping;
authorbradymiller <bradymiller@users.sourceforge.net>
Sun, 10 Mar 2013 09:35:20 +0000 (10 01:35 -0800)
committerbradymiller <bradymiller@users.sourceforge.net>
Mon, 18 Mar 2013 02:29:47 +0000 (17 19:29 -0700)
 1. Improved/clarified the functions in library/formdata.inc.php
 2. Added mechanism for whitelisting openemr sql table names.
 3. Added mechanism for whitelisting openemr sql column names.
 4. Incorporated it into the messages module
 5. Incorporated into dictation form
 6. Incorporated into work/school form/note

14 files changed:
interface/forms/dictation/new.php
interface/forms/dictation/report.php
interface/forms/dictation/save.php
interface/forms/dictation/table.sql [deleted file]
interface/forms/dictation/view.php
interface/forms/note/new.php
interface/forms/note/print.php
interface/forms/note/report.php
interface/forms/note/save.php
interface/forms/note/view.php
library/api.inc
library/formdata.inc.php
library/forms.inc
library/pnotes.inc

index 6ef6abd..b372978 100644 (file)
@@ -1,5 +1,9 @@
 <!-- Form generated from formsWiz -->
 <?php
+
+$fake_register_globals=false;
+$sanitize_all_escapes=true;
+
 include_once("../../globals.php");
 include_once("$srcdir/api.inc");
 formHeader("Form: dictation");
@@ -11,14 +15,14 @@ $returnurl = $GLOBALS['concurrent_layout'] ? 'encounter_top.php' : 'patient_enco
 </head>
 <body class="body_top">
 <form method=post action="<?php echo $rootdir;?>/forms/dictation/save.php?mode=new" name="my_form">
-<span class="title"><?php xl('Speech Dictation','e'); ?></span><br><br>
-<span class=text><?php xl('Dictation: ','e'); ?></span><br><textarea cols=80 rows=24 wrap=virtual name="dictation" ></textarea><br>
-<span class=text><?php xl('Additional Notes:','e'); ?> </span><br><textarea cols=80 rows=8 wrap=virtual name="additional_notes" ></textarea><br>
+<span class="title"><?php echo xlt('Speech Dictation'); ?></span><br><br>
+<span class=text><?php echo xlt('Dictation: '); ?></span><br><textarea cols=80 rows=24 wrap=virtual name="dictation" ></textarea><br>
+<span class=text><?php echo xlt('Additional Notes:'); ?> </span><br><textarea cols=80 rows=8 wrap=virtual name="additional_notes" ></textarea><br>
 <br>
-<a href="javascript:top.restoreSession();document.my_form.submit();" class="link_submit">[<?php xl('Save','e'); ?>]</a>
+<a href="javascript:top.restoreSession();document.my_form.submit();" class="link_submit">[<?php echo xlt('Save'); ?>]</a>
 <br>
 <a href="<?php echo "$rootdir/patient_file/encounter/$returnurl";?>" class="link"
- onclick="top.restoreSession()">[<?php xl('Don\'t Save','e'); ?>]</a>
+ onclick="top.restoreSession()">[<?php echo xlt('Don\'t Save'); ?>]</a>
 </form>
 <?php
 formFooter();
index 5bc8287..3388bc4 100644 (file)
@@ -18,8 +18,8 @@ function dictation_report( $pid, $encounter, $cols, $id) {
         $value = "yes";
       }
       $key=ucwords(str_replace("_"," ",$key));
-      print "<td><span class=bold>" . xl($key) . ": </span><span class=text>" .
-        nl2br($value) . "</span></td>";
+      print "<td><span class=bold>" . xlt($key) . ": </span><span class=text>" .
+        nl2br(text($value)) . "</span></td>";
       $count++;
       if ($count == $cols) {
         $count = 0;
index a58955f..916219c 100644 (file)
@@ -1,19 +1,19 @@
 <?php
 //------------Forms generated from formsWiz
+
+$fake_register_globals=false;
+$sanitize_all_escapes=true;
+
 include_once("../../globals.php");
 include_once("$srcdir/api.inc");
 include_once("$srcdir/forms.inc");
-foreach ($_POST as $k => $var) {
-$_POST[$k] = mysql_escape_string($var);
-echo "$var\n";
-}
 if ($encounter == "")
 $encounter = date("Ymd");
 if ($_GET["mode"] == "new"){
 $newid = formSubmit("form_dictation", $_POST, $_GET["id"], $userauthorized);
 addForm($encounter, "Speech Dictation", $newid, "dictation", $pid, $userauthorized);
 }elseif ($_GET["mode"] == "update") {
-sqlInsert("update form_dictation set pid = {$_SESSION["pid"]},groupname='".$_SESSION["authProvider"]."',user='".$_SESSION["authUser"]."',authorized=$userauthorized,activity=1, date = NOW(), dictation='".$_POST["dictation"]."', additional_notes='".$_POST["additional_notes"]."' where id=$id");
+sqlInsert("update form_dictation set pid = ?,groupname=?,user=?,authorized=?,activity=1, date = NOW(), dictation=?, additional_notes=? where id=?",array($_SESSION["pid"],$_SESSION["authProvider"],$_SESSION["authUser"],$userauthorized,$_POST["dictation"],$_POST["additional_notes"],$_GET["id"]));
 }
 $_SESSION["encounter"] = $encounter;
 formHeader("Redirecting....");
diff --git a/interface/forms/dictation/table.sql b/interface/forms/dictation/table.sql
deleted file mode 100644 (file)
index 2701f23..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-CREATE TABLE IF NOT EXISTS `form_dictation` (
-id bigint(20) NOT NULL auto_increment,
-date datetime default NULL,
-pid bigint(20) default NULL,
-user varchar(255) default NULL,
-groupname varchar(255) default NULL,
-authorized tinyint(4) default NULL,
-activity tinyint(4) default NULL,
-dictation longtext,
-additional_notes longtext,
-PRIMARY KEY (id)
-) ENGINE=MyISAM;
index 2404435..6bbac5a 100644 (file)
@@ -1,5 +1,9 @@
 <!-- Forms generated from formsWiz -->
 <?php
+
+$fake_register_globals=false;
+$sanitize_all_escapes=true;
+
 include_once("../../globals.php");
 $returnurl = $GLOBALS['concurrent_layout'] ? 'encounter_top.php' : 'patient_encounter.php';
 ?>
@@ -12,15 +16,15 @@ $returnurl = $GLOBALS['concurrent_layout'] ? 'encounter_top.php' : 'patient_enco
 include_once("$srcdir/api.inc");
 $obj = formFetch("form_dictation", $_GET["id"]);
 ?>
-<form method=post action="<?php echo $rootdir?>/forms/dictation/save.php?mode=update&id=<?php echo $_GET["id"];?>" name="my_form">
-<span class="title"><?php xl('Speech Dictation','e'); ?></span><Br><br>
-<span class=text><?php xl('Dictation: ','e'); ?></span><br><textarea cols=80 rows=24 wrap=virtual name="dictation" ><?php echo stripslashes($obj{"dictation"});?></textarea><br>
-<span class=text><?php xl('Additional Notes: ','e'); ?></span><br><textarea cols=80 rows=8 wrap=virtual name="additional_notes" ><?php echo stripslashes($obj{"additional_notes"});?></textarea><br>
+<form method=post action="<?php echo $rootdir?>/forms/dictation/save.php?mode=update&id=<?php echo attr($_GET["id"]);?>" name="my_form">
+<span class="title"><?php echo xlt('Speech Dictation'); ?></span><Br><br>
+<span class=text><?php echo xlt('Dictation: '); ?></span><br><textarea cols=80 rows=24 wrap=virtual name="dictation" ><?php echo text($obj{"dictation"});?></textarea><br>
+<span class=text><?php echo xlt('Additional Notes: '); ?></span><br><textarea cols=80 rows=8 wrap=virtual name="additional_notes" ><?php echo text($obj{"additional_notes"});?></textarea><br>
 <br>
-<a href="javascript:top.restoreSession();document.my_form.submit();" class="link_submit">[<?php xl('Save','e'); ?>]</a>
+<a href="javascript:top.restoreSession();document.my_form.submit();" class="link_submit">[<?php echo xlt('Save'); ?>]</a>
 <br>
 <a href="<?php echo "$rootdir/patient_file/encounter/$returnurl";?>" class="link"
- onclick="top.restoreSession()">[<?php xl('Don\'t Save Changes','e'); ?>]</a>
+ onclick="top.restoreSession()">[<?php echo xlt('Don\'t Save Changes'); ?>]</a>
 </form>
 <?php
 formFooter();
index 89a84d5..b333b2f 100644 (file)
     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. -->
 
 <?php
+
+$fake_register_globals=false;
+$sanitize_all_escapes=true;
+
 include_once("../../globals.php");
 include_once("$srcdir/api.inc");
 formHeader("Form: note");
 $returnurl = $GLOBALS['concurrent_layout'] ? 'encounter_top.php' : 'patient_encounter.php';
-$provider_results = sqlQuery("select fname, lname from users where username='" . $_SESSION{"authUser"} . "'");
+$provider_results = sqlQuery("select fname, lname from users where username=?",array($_SESSION{"authUser"}));
 /* name of this form */
 $form_name = "note"; 
 ?>
@@ -51,19 +55,19 @@ var mypcc = '<?php echo $GLOBALS['phone_country_code'] ?>';
 <?php echo date("F d, Y", time()); ?>
 
 <form method=post action="<?php echo $rootdir."/forms/".$form_name."/save.php?mode=new";?>" name="my_form" id="my_form">
-<span class="title"><?php xl('Work/School Note','e'); ?></span><br></br>
+<span class="title"><?php echo xlt('Work/School Note'); ?></span><br></br>
 
 <div style="margin: 10px;">
-<input type="button" class="save" value="    <?php xl('Save','e'); ?>    "> &nbsp; 
-<input type="button" class="dontsave" value="<?php xl('Don\'t Save','e'); ?>"> &nbsp; 
+<input type="button" class="save" value="    <?php echo xla('Save'); ?>    "> &nbsp; 
+<input type="button" class="dontsave" value="<?php echo xla('Don\'t Save'); ?>"> &nbsp; 
 </div>
 
 <select name="note_type">
-<option value="WORK NOTE"><?php xl('WORK NOTE','e'); ?></option>
-<option value="SCHOOL NOTE"><?php xl('SCHOOL NOTE','e'); ?></option>
+<option value="WORK NOTE"><?php echo xlt('WORK NOTE'); ?></option>
+<option value="SCHOOL NOTE"><?php echo xlt('SCHOOL NOTE'); ?></option>
 </select>
 <br>
-<b><?php xl('MESSAGE:','e'); ?></b>
+<b><?php echo xlt('MESSAGE:'); ?></b>
 <br>
 <textarea name="message" id="message" rows="7" cols="47"></textarea>
 <br>
@@ -77,31 +81,31 @@ var mypcc = '<?php echo $GLOBALS['phone_country_code'] ?>';
 -->
        
 <br>
-<b><?php xl('Signature:','e'); ?></b>
+<b><?php echo xlt('Signature:'); ?></b>
 <br>
 
 <table>
 <tr><td>
-<?php xl('Doctor:','e'); ?>
-<input type="text" name="doctor" id="doctor" value="<?php echo $provider_results["fname"].' '.$provider_results["lname"]; ?>">
+<?php echo xlt('Doctor:'); ?>
+<input type="text" name="doctor" id="doctor" value="<?php echo attr($provider_results["fname"]).' '.attr($provider_results["lname"]); ?>">
 </td>
 
 <td>
-<span class="text"><?php xl('Date','e'); ?></span>
+<span class="text"><?php echo xlt('Date'); ?></span>
    <input type='text' size='10' name='date_of_signature' id='date_of_signature'
     value='<?php echo date('Y-m-d', time()); ?>'
-    title='<?php xl('yyyy-mm-dd','e'); ?>'
+    title='<?php echo xla('yyyy-mm-dd'); ?>'
     onkeyup='datekeyup(this,mypcc)' onblur='dateblur(this,mypcc)' />
    <img src='../../pic/show_calendar.gif' align='absbottom' width='24' height='22'
     id='img_date_of_signature' border='0' alt='[?]' style='cursor:pointer;cursor:hand'
-    title='<?php xl('Click here to choose a date','e'); ?>'>
+    title='<?php echo xla('Click here to choose a date'); ?>'>
 </td>
 </tr>
 </table>
 
 <div style="margin: 10px;">
-<input type="button" class="save" value="    <?php xl('Save','e'); ?>    "> &nbsp; 
-<input type="button" class="dontsave" value="<?php xl('Don\'t Save','e'); ?>"> &nbsp; 
+<input type="button" class="save" value="    <?php echo xla('Save'); ?>    "> &nbsp; 
+<input type="button" class="dontsave" value="<?php echo xla('Don\'t Save'); ?>"> &nbsp; 
 </div>
 
 </form>
index 671b537..d7a90cb 100644 (file)
@@ -1,9 +1,13 @@
 <?php
+
+$fake_register_globals=false;
+$sanitize_all_escapes=true;
+
 include_once("../../globals.php");
 include_once("$srcdir/api.inc");
 formHeader("Form: note");
 $returnurl = $GLOBALS['concurrent_layout'] ? 'encounter_top.php' : 'patient_encounter.php';
-$provider_results = sqlQuery("select fname, lname from users where username='" . $_SESSION{"authUser"} . "'");
+$provider_results = sqlQuery("select fname, lname from users where username=?",array($_SESSION{"authUser"}));
 
 /* name of this form */
 $form_name = "note"; 
@@ -27,26 +31,26 @@ if ($obj['date_of_signature'] != "") {
 <body class="body_top">
 
 <form method=post action="">
-<span class="title"><?php xl('Work/School Note','e'); ?></span><br></br>
-<?php xl('Printed','e'); ?> <?php echo dateformat(); ?>
+<span class="title"><?php echo xlt('Work/School Note'); ?></span><br></br>
+<?php echo xlt('Printed'); ?> <?php echo dateformat(); ?>
 <br><br>
 <select name="note_type">
-<option value="WORK NOTE" <?php if ($obj['note_type']=="WORK NOTE") echo " SELECTED"; ?>><?php xl('WORK NOTE','e'); ?></option>
-<option value="SCHOOL NOTE" <?php if ($obj['note_type']=="SCHOOL NOTE") echo " SELECTED"; ?>><?php xl('SCHOOL NOTE','e'); ?></option>
+<option value="WORK NOTE" <?php if ($obj['note_type']=="WORK NOTE") echo " SELECTED"; ?>><?php echo xlt('WORK NOTE'); ?></option>
+<option value="SCHOOL NOTE" <?php if ($obj['note_type']=="SCHOOL NOTE") echo " SELECTED"; ?>><?php echo xlt('SCHOOL NOTE'); ?></option>
 </select>
 <br>
-<b><?php xl('MESSAGE:','e'); ?></b>
+<b><?php echo xlt('MESSAGE:'); ?></b>
 <br>
-<div style="border: 1px solid black; padding: 5px; margin: 5px;"><?php echo stripslashes($obj["message"]);?></div>
+<div style="border: 1px solid black; padding: 5px; margin: 5px;"><?php echo text($obj["message"]);?></div>
 <br></br>
 
 <table>
 <tr><td>
-<span class=text><?php xl('Doctor:','e'); ?> </span><input type=text name="doctor" value="<?php echo stripslashes($obj["doctor"]);?>">
+<span class=text><?php echo xlt('Doctor:'); ?> </span><input type=text name="doctor" value="<?php echo attr($obj["doctor"]);?>">
 </td><td>
-<span class="text"><?php xl('Date','e'); ?></span>
+<span class="text"><?php echo xlt('Date'); ?></span>
    <input type='text' size='10' name='date_of_signature' id='date_of_signature'
-    value='<?php echo $obj['date_of_signature']; ?>'
+    value='<?php echo attr($obj['date_of_signature']); ?>'
     />
 </td></tr>
 </table>
index b4cf7bc..c0fd017 100644 (file)
@@ -43,10 +43,10 @@ function note_report( $pid, $encounter, $cols, $id) {
             print("<tr>\n");  
             print("<tr>\n");
            if ($key == "Note Type") {
-                print "<td><span class=bold>" . xl($key) . ": </span><span class=text>" . xl($value) . "</span></td>";
+                print "<td><span class=bold>" . xlt($key) . ": </span><span class=text>" . xlt($value) . "</span></td>";
            }
            else {
-               print "<td><span class=bold>" . xl($key) . ": </span><span class=text>$value</span></td>";      
+               print "<td><span class=bold>" . xlt($key) . ": </span><span class=text>" . text($value) . "</span></td>";       
            }
             $count++;
             if ($count == $cols) {
index e1425ba..c206c7b 100644 (file)
     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. -->
 
 <?php
+
+$fake_register_globals=false;
+$sanitize_all_escapes=true;
+
 include_once("../../globals.php");
 include_once("$srcdir/api.inc");
 include_once("$srcdir/forms.inc");
index 9252bd9..c88d4c8 100644 (file)
     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. -->
 
 <?php
+
+$fake_register_globals=false;
+$sanitize_all_escapes=true;
+
 include_once("../../globals.php");
 include_once("$srcdir/api.inc");
 formHeader("Form: note");
 $returnurl = $GLOBALS['concurrent_layout'] ? 'encounter_top.php' : 'patient_encounter.php';
-$provider_results = sqlQuery("select fname, lname from users where username='" . $_SESSION{"authUser"} . "'");
+$provider_results = sqlQuery("select fname, lname from users where username=?",array($_SESSION{"authUser"}));
 
 /* name of this form */
 $form_name = "note"; 
@@ -52,7 +56,7 @@ if ($obj['date_of_signature'] != "") {
 var mypcc = '<?php echo $GLOBALS['phone_country_code'] ?>';
 
 function PrintForm() {
-    newwin = window.open("<?php echo $rootdir."/forms/".$form_name."/print.php?id=".$_GET["id"]; ?>","mywin");
+    newwin = window.open("<?php echo $rootdir."/forms/".$form_name."/print.php?id=".attr($_GET["id"]); ?>","mywin");
 }
 
 </script>
@@ -60,44 +64,44 @@ function PrintForm() {
 </head>
 <body class="body_top">
 
-<form method=post action="<?php echo $rootdir."/forms/".$form_name."/save.php?mode=update&id=".$_GET["id"];?>" name="my_form" id="my_form">
-<span class="title"><?php xl('Work/School Note','e'); ?></span><br></br>
+<form method=post action="<?php echo $rootdir."/forms/".$form_name."/save.php?mode=update&id=".attr($_GET["id"]);?>" name="my_form" id="my_form">
+<span class="title"><?php echo xlt('Work/School Note'); ?></span><br></br>
 
 <div style="margin: 10px;">
-<input type="button" class="save" value="    <?php xl('Save','e'); ?>    "> &nbsp; 
-<input type="button" class="dontsave" value="<?php xl('Don\'t Save','e'); ?>"> &nbsp; 
-<input type="button" class="printform" value="<?php xl('Print','e'); ?>"> &nbsp; 
+<input type="button" class="save" value="    <?php echo xla('Save'); ?>    "> &nbsp; 
+<input type="button" class="dontsave" value="<?php echo xla('Don\'t Save'); ?>"> &nbsp; 
+<input type="button" class="printform" value="<?php echo xla('Print'); ?>"> &nbsp; 
 </div>
 
 <select name="note_type">
-<option value="WORK NOTE" <?php if ($obj['note_type']=="WORK NOTE") echo " SELECTED"; ?>><?php xl('WORK NOTE','e'); ?></option>
-<option value="SCHOOL NOTE" <?php if ($obj['note_type']=="SCHOOL NOTE") echo " SELECTED"; ?>><?php xl('SCHOOL NOTE','e'); ?></option>
+<option value="WORK NOTE" <?php if ($obj['note_type']=="WORK NOTE") echo " SELECTED"; ?>><?php echo xlt('WORK NOTE'); ?></option>
+<option value="SCHOOL NOTE" <?php if ($obj['note_type']=="SCHOOL NOTE") echo " SELECTED"; ?>><?php echo xlt('SCHOOL NOTE'); ?></option>
 </select>
 <br>
-<b><?php xl('MESSAGE:','e'); ?></b>
+<b><?php echo xlt('MESSAGE:'); ?></b>
 <br>
-<textarea name="message" id="message" cols ="67" rows="4"><?php echo stripslashes($obj["message"]);?></textarea>
+<textarea name="message" id="message" cols ="67" rows="4"><?php echo text($obj["message"]);?></textarea>
 <br> <br>
 
 <table>
 <tr><td>
-<span class=text><?php xl('Doctor:','e'); ?> </span><input type=entry name="doctor" value="<?php echo stripslashes($obj["doctor"]);?>">
+<span class=text><?php echo xlt('Doctor:'); ?> </span><input type=entry name="doctor" value="<?php echo attr($obj["doctor"]);?>">
 </td><td>
-<span class="text"><?php xl('Date','e'); ?></span>
+<span class="text"><?php echo xlt('Date'); ?></span>
    <input type='text' size='10' name='date_of_signature' id='date_of_signature'
-    value='<?php echo $obj['date_of_signature']; ?>'
-    title='<?php xl('yyyy-mm-dd','e'); ?>'
+    value='<?php echo attr($obj['date_of_signature']); ?>'
+    title='<?php echo xla('yyyy-mm-dd'); ?>'
     onkeyup='datekeyup(this,mypcc)' onblur='dateblur(this,mypcc)' />
    <img src='../../pic/show_calendar.gif' align='absbottom' width='24' height='22'
     id='img_date_of_signature' border='0' alt='[?]' style='cursor:pointer;cursor:hand'
-    title='<?php xl('Click here to choose a date','e'); ?>'>
+    title='<?php echo xla('Click here to choose a date'); ?>'>
 </td></tr>
 </table>
 
 <div style="margin: 10px;">
-<input type="button" class="save" value="    <?php xl('Save','e'); ?>    "> &nbsp; 
-<input type="button" class="dontsave" value="<?php xl('Don\'t Save','e'); ?>"> &nbsp; 
-<input type="button" class="printform" value="<?php xl('Print','e'); ?>"> &nbsp; 
+<input type="button" class="save" value="    <?php echo xla('Save'); ?>    "> &nbsp; 
+<input type="button" class="dontsave" value="<?php echo xla('Don\'t Save'); ?>"> &nbsp; 
+<input type="button" class="printform" value="<?php echo xla('Print'); ?>"> &nbsp; 
 </div>
 
 </form>
index c4b14cf..b91b25f 100644 (file)
@@ -38,7 +38,7 @@ function formSubmit ($tableName, $values, $id, $authorized = "0")
         // the variable escaping method.
         global $sanitize_all_escapes;
 
-       $sql = "insert into $tableName set pid = {$_SESSION['pid']},groupname='".$_SESSION['authProvider']."',user='".$_SESSION['authUser']."',authorized=$authorized,activity=1, date = NOW(),";
+       $sql = "insert into " . escape_table_name($tableName) . " set pid = ?,groupname=?,user=?,authorized=?,activity=1, date = NOW(),";
        foreach ($values as $key => $value)
                if (strpos($key,"openemr_net_cpt") === 0) {
                        //code to auto add cpt code
@@ -61,7 +61,7 @@ function formSubmit ($tableName, $values, $id, $authorized = "0")
                else {
                         if (isset($sanitize_all_escapes) && $sanitize_all_escapes) {
                                 // using new security method, so escape the key and values here
-                                $sql .= " " . add_escape_custom($key) . " = '" . add_escape_custom($value) . "',";
+                                $sql .= " " . escape_sql_column_name($key,array($tableName)) . " = '" . add_escape_custom($value) . "',";
                         }
                         else {
                                 // original method (rely on code to escape values before using this function)
@@ -69,19 +69,30 @@ function formSubmit ($tableName, $values, $id, $authorized = "0")
                         }
                }
        $sql = substr($sql, 0, -1);
-       return sqlInsert($sql);
+       return sqlInsert($sql,array($_SESSION['pid'],$_SESSION['authProvider'],$_SESSION['authUser'],$authorized));
 }
 
 
 function formUpdate ($tableName, $values, $id, $authorized = "0")
 {
-       $sql = "update $tableName set pid = {$_SESSION['pid']},groupname='".$_SESSION['authProvider']."',user='".$_SESSION['authUser']."',authorized=$authorized,activity=1, date = NOW(),";
+        // Bring in $sanitize_all_escapes variable, which will decide
+        // the variable escaping method.
+        global $sanitize_all_escapes;
+
+       $sql = "update " . escape_table_name($tableName) . " set pid = ?,groupname=?,user=?,authorized=?,activity=1, date = NOW(),";
        foreach ($values as $key => $value)
-               $sql .= " $key = '$value',";
+                if (isset($sanitize_all_escapes) && $sanitize_all_escapes) {
+                        // using new security method, so escape the key and values here
+                        $sql .= " " . escape_sql_column_name($key,array($tableName)) . " = '" . add_escape_custom($value) . "',";
+                }
+                else {
+                        // original method (rely on code to escape values before using this function)
+                       $sql .= " $key = '$value',";
+                }
        $sql = substr($sql, 0, -1);
-       $sql .= " where id=$id";
+       $sql .= " where id=?";
        
-       return sqlInsert($sql);
+       return sqlInsert($sql,array($_SESSION['pid'],$_SESSION['authProvider'],$_SESSION['authUser'],$authorized,$id));
 }
 
 
@@ -96,7 +107,8 @@ function formJump ($address = "0")
 
 function formFetch ($tableName, $id, $cols="*", $activity="1")
 {
-       return sqlQuery ( "select $cols from `$tableName` where id='$id' and pid = '{$GLOBALS['pid']}' and activity like '$activity' order by date DESC LIMIT 0,1" ) ;
+        // Note that tableName is hard-coded, so no need to run through escape_table_name() function (at least not yet).
+       return sqlQuery ( "select $cols from `" . $tableName . "` where id=? and pid = ? and activity like ? order by date DESC LIMIT 0,1", array($id,$GLOBALS['pid'],$activity) ) ;
 }
 
 function formGetIds ($tableName, $cols = "*", $limit='all', $start=0, $activity = "1")
index 21c348d..f1113b3 100644 (file)
@@ -62,40 +62,120 @@ function escape_limit($s) {
  * @return  string     Escaped sort order keyword variable.
  */
 function escape_sort_order($s) {
-      $ok = array("asc","desc");
-      $key = array_search(strtolower($s),$ok);
-      return $ok[$key];
+      return escape_identifier(strtolower($s),array("asc","desc"));
+}
+
+/**
+ * Escape/sanitize a table sql column name for a sql query..
+ *
+ * This will escape/sanitize the sql column name for a sql query. It is done by whitelisting
+ * all of the current sql column names in the openemr database from a table(s). Note that if
+ * there is no match, then it will die() and a error message will be sent to the screen and
+ * the error log. This function should not be used for escaping tables outside the openemr
+ * database (should use escape_identifier() function below for that scenario)
+ *
+ * @param   string        $s       sql column name variable to be escaped/sanitized.
+ * @param   array         $tables  The table(s) that the sql columns is from (in an array).
+ * @param   boolean       $long    Use long form (ie. table.colname) vs short form (ie. colname).
+ * @return  string                 Escaped table name variable.
+ */
+function escape_sql_column_name($s,$tables,$long=FALSE) {
+
+      // If the $tables is empty, then process them all
+      if (empty($tables)) {
+            $res = sqlStatementNoLog("SHOW TABLES");
+            $tables = array();
+            while ($row=sqlFetchArray($res)) {
+                $keys_return = array_keys($row);
+                $tables[]=$row[$keys_return[0]];
+            }
+      }
+
+      // First need to escape the $tables
+      $tables_escaped = array();
+      foreach ($tables as $table) {
+            $tables_escaped[] = escape_table_name($table);
+      }
+
+      // Collect all the possible sql columns from the tables
+      $columns_options = array(); 
+      foreach ($tables_escaped as $table_escaped) {
+            $res = sqlStatementNoLog("SHOW COLUMNS FROM ".$table_escaped);
+            while ($row=sqlFetchArray($res)) {
+                  if ($long) {
+                        $columns_options[]=$table_escaped.".".$row['Field'];
+                  }
+                  else {
+                        $columns_options[]=$row['Field'];
+                  }
+            }
+      }
+
+      // Now can escape(via whitelisting) the sql column name
+      return escape_identifier($s,$columns_options,TRUE);
+}
+
+/**
+ * Escape/sanitize a table name for a sql query..
+ *
+ * This will escape/sanitize the table name for a sql query. It is done by whitelisting
+ * all of the current tables in the openemr database. Note that if there is no match, then
+ * it will die() and a error message will be sent to the screen and the error log. This
+ * function should not be used for escaping tables outside the openemr database (should
+ * use escape_identifier() function below for that scenario)
+ *
+ * @param   string $s  sql table name variable to be escaped/sanitized.
+ * @return  string     Escaped table name variable.
+ */
+function escape_table_name($s) {
+      $res = sqlStatementNoLog("SHOW TABLES");
+      $tables_array = array();
+      while ($row=sqlFetchArray($res)) {
+            $keys_return = array_keys($row); 
+            $tables_array[]=$row[$keys_return[0]];
+      }
+
+      // Now can escape(via whitelisting) the sql table name
+      return escape_identifier($s,$tables_array,TRUE);
 }
 
 /**
  * Escape/sanitize a sql identifier variable to prepare for a sql query.
  *
- * This will escape/sanitize a sql identifier. There are two options provided by this funtion.
- * The first option is done by whitelisting ($whitelist_flag=true) and in this case
+ * This will escape/sanitize a sql identifier. There are two options provided by this
+ * function.
+ * The first option is done by whitelisting ($whitelist_items is used) and in this case
  * only certain identifiers (listed in the $whitelist_items array) can be used; if
- * there is no match, then it will default to the first item in the $whitelist_items array.
- * The second option is done by sanitizing ($whitelist_flag=false) and in this case
+ * there is no match, then it will either default to the first item in the $whitelist_items
+ * (if $die_if_no_match is FALSE) or it will die() and send an error message to the screen
+ * and log (if $die_if_no_match is TRUE).
+ * The second option is done by sanitizing ($whitelist_items is not used) and in this case
  * only US alphanumeric,'_' and '.' items are kept in the returned string. Note
  * the second option is still experimental as we figure out the ideal items to
  * filter out of the identifier. The first option is ideal if all the possible identifiers
  * are known, however we realize this may not always be the case.
  *
- * @param   string  $s                Sql identifier variable to be escaped/sanitized.
- * @param   boolean $whitelist_flag   True to use whitelisting method (See function description for details of whitelisting method).
- * @param   array   $whitelist_items  Items used in whitelisting method (See function description for details of whitelisting method).
- * @return  string                    Escaped/sanitized sql identifier variable.
+ * @param   string   $s                Sql identifier variable to be escaped/sanitized.
+ * @param   array    $whitelist_items  Items used in whitelisting method (See function description for details of whitelisting method).
+ * @param   boolean  $die_if_no_match  If there is no match in the whitelist, then die and echo an error to screen and log.
+ * @return  string                     Escaped/sanitized sql identifier variable.
  */
-function escape_identifier($s,$whitelist_flag=FALSE,$whitelist_items) {
-      if ($whitelist_flag) {
+function escape_identifier($s,$whitelist_items,$die_if_no_match=FALSE) {
+      if (is_array($whitelist_items)) {
             // Only return an item within the whitelist_items
-            //  (if no match, then it will return the first item in whitelist_items)
+            if ( $die_if_no_match && !(in_array($s,$whitelist_items)) ) {
+                  // There is no match in the whitelist and the $die_if_no_match flag is set
+                  // so die() and send error messages to screen and log
+                  error_Log("ERROR: OpenEMR SQL Escaping ERROR of the following string: ".$s,0);
+                  die("<br><span style='color:red;font-weight:bold;'>".xlt("There was an OpenEMR SQL Escaping ERROR of the following string")." ".text($s)."</span><br>");
+            }
             $ok = $whitelist_items;
             $key = array_search($s,$ok);
             return $ok[$key];
       }
       else {
             // Return an item that has been "cleaned" up
-            // (this is currently experimental)
+            // (this is currently experimental and goal is to avoid using this)
             return preg_replace('/[^a-zA-Z0-9_.]/','',$s);
       }
 }
index a366dad..3b8b13b 100644 (file)
@@ -59,15 +59,20 @@ function addForm($encounter, $form_name, $form_id, $formdir, $pid,
 {
        if (!$user) $user = $_SESSION['authUser'];
        if (!$group) $group = $_SESSION['authProvider'];
+
+        $arraySqlBind = array();
        $sql = "insert into forms (date, encounter, form_name, form_id, pid, " .
                "user, groupname, authorized, formdir) values (";
-       if($date == "NOW()")
+       if($date == "NOW()") {
                $sql .= "$date";
-       else
-               $sql .= "'$date'";
-       $sql .= ", '$encounter', '$form_name', '$form_id', '$pid', '$user',          " .
-               "'$group', '$authorized', '$formdir')";
-       return sqlInsert( $sql );
+        }
+       else {
+               $sql .= "?";
+                array_push($arraySqlBind,$date);
+        }
+       $sql .= ", ?, ?, ?, ?, ?, ?, ?, ?)";
+        array_push($arraySqlBind,$encounter,$form_name,$form_id,$pid,$user,$group,$authorized,$formdir);
+       return sqlInsert($sql,$arraySqlBind);
 }
 
 function authorizeForm($id, $authorized = "1")
index d8e6550..1ecb475 100644 (file)
@@ -47,9 +47,6 @@ function getPnoteById($id, $cols = "*")
 function getPnotesByUser($activity="1",$show_all="no",$user='',$count=false,$sortby='',$sortorder='',$begin='',$listnumber='')
 {
 
-  // Set the options for $sortby (for sql-injection hardening)
-  $sortbyoptions = array("users.lname","patient_data.lname","pnotes.title","pnotes.date","pnotes.message_status");
-
   // Set the activity part of query
   if ($activity=='1') {
     $activity_query = " pnotes.message_status != 'Done' AND pnotes.activity = 1 AND ";
@@ -78,7 +75,7 @@ function getPnotesByUser($activity="1",$show_all="no",$user='',$count=false,$sor
           LEFT JOIN patient_data ON pnotes.pid = patient_data.pid) WHERE $activity_query
           pnotes.deleted != '1' AND pnotes.assigned_to LIKE ?";
   if (!empty($sortby) || !empty($sortorder)  || !empty($begin) || !empty($listnumber)) {
-    $sql .= " order by ".escape_identifier($sortby,TRUE,$sortbyoptions).
+    $sql .= " order by ".escape_sql_column_name($sortby,array('users','patient_data','pnotes'),TRUE).
             " ".escape_sort_order($sortorder).
             " limit ".escape_limit($begin).", ".escape_limit($listnumber);
   }