John Campbell wrote:
On 9/28/07, Kenneth Downs <[EMAIL PROTECTED]> wrote:

  I will claim that putting security
directly into the database is better than any other way because it does what
is needed in the end with the least possible work.

I must be missing something.  Take a simple social networking
scenario: A user can only see another user's complete profile if and
only if they are mutual friends.  Implementing that in the tables
would be a huge pain in the ass and incur a big performance penalty.
Is there some super easy way to implement this that I am missing?


It would?

Think of the profile information as follows:
ProfileTable
Username, userid, fullname, address, emailaddress, bio, Recordid
FriendTable:
Recordid, friendid


So, in the classic sense, if someone loads a profile, you might do a join between friendtable and profiletable and add a where clause where the friendid equals your userid- if you get data from it you display it. Otherwise, you would pull just the public information.


In a DB driven sense, you would have:
ProfileTable
Username, fullname, address, emailaddress, bio, Recordid
FriendTable:
Recordid, friendusername

PublicProfiles:
A select only view of ProfileTable having only:
username, fullname, bio

And then for each and every userid, you have created automatically a set of views:
Myusername.friendprofiles
select Username, fullname, address, emailaddress, bio from profiletable where recordid in (select recordid from friendtable where friendusername = 'myusername')

(and to extend it a bit, you would also have a view for update:
Myusername.myprofile
select Username, fullname, address, emailaddress, bio from profiletable where username = 'myusername')


Now from the application perspective, you have 2 queries:
First you do a select to the myusername.firendprofiles table and if you locate the user your looking for, display the full data.
Second, if no record is found, than check the publicprofiles table for data


The important point here is that the only view you have UPDATE authority to is myusername.myprofile, wheras you have select authority on myusername.friendprofiles and publicprofiles. You have no direct access to the profiletable.


Now, assume for a moment that the user get's some SQL injected past the program.

In the first case, since all the queries are run against the profiletable, the user can then view the private informaiton of other users(and worse, can change it since they have edit authority to edit their own record!)

With the view level security, the only view they can update is myusername.myprofile - so they can only change their personal record. As for selecting data, they can only select from the myusername.friendsprofile and myusername.publicprofiles.

Since the only data in those views is the data they are allowed to see anyway, even if they manage an SQL injection they still can't view data they were not authorized to access.


_______________________________________________
New York PHP Community Talk Mailing List
http://lists.nyphp.org/mailman/listinfo/talk

NYPHPCon 2006 Presentations Online
http://www.nyphpcon.com

Show Your Participation in New York PHP
http://www.nyphp.org/show_participation.php

Reply via email to