I am wondering if what I have so far looks vulnerable to injection attacks.
I have left out some array echoes and stuff.
Here is the function in my db_configuration file:
function filter($data) {
$data = trim(htmlentities(strip_tags($data)));
if (get_magic_quotes_gpc())
$data = stripslashes($data);
$data = mysql_real_escape_string($data);
return $data;
}
Here is the login and reg script:
include"db_configuration.php";
if($_POST['reg'] == 'submit') {
foreach($_POST as $key => $value) {
$somedata[$key] = filter($value);
}
$loginname = $somedata['loginname'];
$pwd = md5($somedata['pwd']);
$mail = $somedata['mail'];
$name = $somedata['name'];
$dupers = mysql_query("select count(*) as total from mytable where loginname='$loginname'") or die(mysql_error());
list($total) = mysql_fetch_row($dupers);
if ($total < 1)
{
$insert = 'INSERT into users(loginname, mail, name, pwd) VALUES("'.$loginname.'","'.$mail.'","'.$name.'", "'.$pwd.'")';
mysql_query($insert);
session_start();
}
}
if($_POST['login'] == 'submit') {
foreach($_POST as $key => $value) {
$somedata[$key] = filter($value);
}
$loginname = $somedata['loginname'];
$pwd = md5($somedata['pwd']);
$querydb = mysql_query("SELECT * FROM users WHERE
loginname = '$loginname' AND pwd = '$pwd'");
$dbsays = mysql_fetch_assoc($querydb);
if(mysql_num_rows($query)){
session_start();
$_SESSION['loginname'] = $dbsays['loginname'];
$_SESSION['pwd'] = $dbsays['pwd'];
header("Location: page1.php");
exit;
}
}
?>
Then on the admin page I have
foreach($_POST as $key => $value) {
$somedata[$key] = filter($value);
}
right at the top and just once. I suspect it is better like that, because then there's no chance of escaping twice, but I have seen it coded both ways so I am wondering if anyone knows for sure. Here's the admin page:
include 'db_configuration.php';
foreach($_POST as $key => $value) {
$somedata[$key] = filter($value);
}
if($_POST['addusr'] == 'submit') {
$loginname = $somedata['loginname'];
$pwd = md5($somedata['pwd']);
$mail = $somedata['mail'];
$name = $somedata['name'];
$dupers = mysql_query("select count(*) as total from mytable where username='$username'") or die(mysql_error());
list($total) = mysql_fetch_row($dupers);
if ($total < 1) {
$insert = 'INSERT into mytable(loginname, mail, name, pwd) VALUES("'.$loginname.'","'.$mail.'","'.$name.'", "'.$pwd.'")';
mysql_query($insert);
}
}
if($_POST['addsomething'] == 'submit') {
$addit = $somedata['addit'];
mysql_query("UPDATE mytable SET `somefield` = '$addit'
WHERE mail='$mail'");
mysql_query("update mytable set anotherfield='1' where loginname='$_SESSION[loginname]'");
}
Then finally there's this next page that has a form for entering dates, and a form for users to change their screen names:
include 'db_configuration.php';
if($_POST['date'] == 'submit') {
foreach($_POST as $key => $value) {
$somedata[$key] = filter($value);
}
$StartDate = $somedata['StartDate'];
$EndDate = $somedata['EndDate'];
mysql_query("update mytable set start='$StartDate'
where loginname = '$_SESSION[loginname]'");
mysql_query("update mytable set end='$EndDate' where loginname='$_SESSION[loginname]'");
if($_POST['changemyname'] == 'change')
{
foreach($_POST as $key => $value) {
$somedata[$key] = filter($value);
}
$dbnm = mysql_query("select name from mytable where username='$_SESSION[username]'");
list($oldname) = mysql_fetch_row($dbnm);
if($oldname === ($somedata['oldname']))
{
$newname = ($somedata['newname']);
mysql_query("update mytable set name='$newname' where loginname='$_SESSION[loginname]'");
}
There is a datepicker that enters the dates into a regular text field in 0000-00-00 format. I am wondering if the filter function I am using is ok with numbers like this.
Thanks for looking.