PHP/SQL数据库查询良好实践和安全性

Lou*_*uis 7 php mysql security sql-injection

所以我是一个有点经验丰富的php开发人员,自2007年以来一直在做"该死的事".但是,在保护我的应用程序方面,我仍然相对较差.我不知道我知道的所有事情,我可以而且应该这样做.

我已经选择了保护PHP Web应用程序,并正在阅读我的方式来测试一路上的东西.我对与数据库查询相关的一般SO组有一些问题(主要是在mysql下):

创建将数据放入数据库的应用程序时,mysql_real_escape_string和输入数据的一般检查(is_numeric等)是否足够?那些与sql注入不同的其他类型的攻击呢?

有人可以解释存储过程和准备好的语句,而不是 - 你制作它们并调用它们.我想知道它们是如何工作的,幕后的验证是什么.

我在php4绑定环境中工作,php5暂时不是一个选项.有没有其他人曾经在这个位置,你做了什么来保护你的应用程序,而所有酷孩子都在使用这个甜蜜的新mysqli界面?

人们发现有哪些一般的良好做法是有利的,强调创建一个能够承受升级和可能迁移的基础设施(比如将php4移到php5).

注意:有一个搜索周围找不到任何类似于这个打到php-mysql安全性的东西.

Ste*_*GSD 9

哈维尔的回答有一个owasp链接是一个好的开始.

还有一些事情你可以做更多:

  1. 关于SQL注入攻击,您可以编写一个函数来删除输入中的常见SQL语句,如"DROP"或"DELETE*WHERE",如下所示:

    *$ sqlarray = array("DROP","或1 = 1","union select","SELECT*FROM","select host","create table","FROM users","users WHERE");*

    然后编写将检查此数组输入的函数.确保$ sqlarray中的任何内容都不是来自用户的常见输入.(别忘了在这上面使用strtolower,谢谢lou).

  2. 我不确定memcache是​​否适用于PHP 4,但是你可以使用memcache实现一些垃圾邮件保护,只允许在Y时间段内对process.php页面X进行某些远程IP访问.

  3. 特权很重要.如果您只需要插入权限(例如,订单处理),那么您应该使用只有插入且可能具有选择权限的用户登录订单处理页面上的数据库.这意味着即使SQL注入完成,它们也只能执行INSERT/SELECT查询而不能删除或重构.

  4. 将重要的php处理文件放在/ include等目录中.然后禁止所有IP访问该/ include目录.

  5. 在用户的会话中使用用户的代理+ remoteip + salt加盐腌MD5,并在每个页面加载时验证正确的MD5在其cookie中.

  6. 禁止某些标题(http://www.owasp.org/index.php/Testing_for_HTTP_Methods_and_XST).禁止PUT(如果您不需要文件上传)/ TRACE/CONNECT/DELETE标头.


Kri*_*ris 6

我的建议:

  1. 沟通mysqli支持PDO(使用mysql驱动程序)
  2. 使用PDO paremeterized准备好的陈述

然后你可以这样做:

$pdo_obj = new PDO( 'mysql:server=localhost; dbname=mydatabase', 
                    $dbusername, $dbpassword );

$sql = 'SELECT column FROM table WHERE condition=:condition';
$params = array( ':condition' => 1 );

$statement = $pdo_obj->prepare( $sql, 
    array( PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY ) );
$statement->execute( $params );
$result = $statement->fetchAll( PDO::FETCH_ASSOC );
Run Code Online (Sandbox Code Playgroud)

优点:

  1. 不再需要手动转移,因为PDO为您完成了所有工作!
  2. 突然切换数据库后端相对容易.

缺点:

  • 我什么都想不到.