如果 PDO 和 mysqli 不可用,使用 mysql_* 函数是不是安全?
Posted
技术标签:
【中文标题】如果 PDO 和 mysqli 不可用,使用 mysql_* 函数是不是安全?【英文标题】:Is is safe to use mysql_* functions if PDO and mysqli is not available?如果 PDO 和 mysqli 不可用,使用 mysql_* 函数是否安全? 【发布时间】:2012-10-26 04:39:12 【问题描述】:我有一个托管在共享主机上的网站。 他们安装了 php 5.2.13。
我知道 SQL 注入的漏洞,我想阻止它。
所以我想使用 PDO 或 mysqli 来防止它。
但是当我使用phpinfo();
查看托管环境php设置信息时出现问题,
发现PDO没有mysql驱动,里面也不支持mysqli。
所以我想知道使用旧的 mysql_* 函数是否安全(以及
像mysql_real_escape_string
这样的函数。
我在 SO 上看过这个,但对我没有多大帮助。 Prepared statements possible when mysqli and PDO are not available?
更新:
我忘了提到大多数查询都很简单。没有使用任何表单,因此不会使用用户输入来进行查询。所有查询都将使用必要的参数进行硬编码,并且一旦设置就不会更改。
【问题讨论】:
您是否考虑过使用不会为您提供残障 PHP 设置的托管公司? 它属于我的朋友,其他人正在为他处理所有网站的事情,如设计、购买域名和托管服务等。现在我的朋友希望我维护他的网站。 甚至不再支持 PHP 5.2。因此,使用该版本已经使提供商变得糟糕 - 您不会简单地为您的客户提供不再提供安全更新等的过时版本。 是的,我知道我会告诉我的朋友这件事,由他决定是继续使用它还是切换到其他提供商。 【参考方案1】:实现这一点的一个好方法是实现一个 Wrapper 类以使用 mysql_* 函数,并使用一些方法来创建预准备语句。
这个想法是您必须在查询中传递强类型参数。
例如,这里有一段代码,大致思路。当然,它需要更多的工作。 但如果实施得当,这可以防止 SQL 注入攻击。
您还可以搜索已经实现该功能的 3rd 方库,因为这很常见。
<?php
class MyDb
protected $query;
public function setQuery($query)
$this->query = $query;
public function setNumericParameter($name, $value)
if (is_numeric($value)) // SQL Injection check, is the value really an Int ?
$this->query = str_replace(':'.$name, $value);
// else, probably an intent of SQL Injection
// Implement here the methods for all the types you need, including dates, strings, etc
public function fetchArray()
$res = mysql_query($this->query);
return mysql_fetch_array($res);
MyDb $db = new MyDb();
$db->setQuery('SELECT * FROM articles WHERE id = :id');
$db->setNumericParameter('id', 15);
while ($row = $db->fetchArray())
// do your homework
【讨论】:
【参考方案2】:没有。缺乏更安全的解决方案绝不是退回到更不安全或更易受攻击的解决方案的正当借口。
你最好找到一个不同的托管服务提供商,即使在他们的共享托管包中也不会禁用任意 PHP 功能。哦,尝试获得一个使用 PHP 5.3 的,或者如果可以的话,PHP 5.4 更好。
【讨论】:
【参考方案3】:如果您对始终使用 mysql_real_escape_string()
和所有用户提供的输入非常严格,那么我认为您应该避免任何准备好的语句保护您免受 SQL 注入。
你在这方面有多完美?我敢打赌,大多数缓冲区溢出漏洞都是由认为自己擅长检查输入的程序员创建的......
【讨论】:
以上是关于如果 PDO 和 mysqli 不可用,使用 mysql_* 函数是不是安全?的主要内容,如果未能解决你的问题,请参考以下文章
PDO vs MYSQLI,Prepared Statemens 和绑定参数
使用 PHP7 在 MariaDB 中的 MySQLi 和 PDO
PHP中的MySQLi扩展学习MySQLI_STMT对象操作