我在共享主机上托管了一个网站。 他们安装了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?
更新
我忘了提到大多数查询都很简单。没有使用任何表单,因此不会使用任何用户输入来进行查询。所有查询都将使用必要的参数进行硬编码,一旦设置就不会更改。
答案 0 :(得分:4)
没有。缺乏更安全的解决方案永远不是回归不太安全或更脆弱的解决方案的有效借口。
您最好找到一个不同的托管服务提供商,即使在他们的共享主机软件包中也不会禁用任意PHP功能。哦,尝试使用PHP 5.3,或者更好,如果可以的话,PHP 5.4。
答案 1 :(得分:1)
如果您对使用mysql_real_escape_string()
始终使用所有用户提供的输入非常严格,那么我认为您应该对任何准备语句保护您的SQL注入安全。
你有多完美?我敢打赌,大多数缓冲区溢出漏洞都是由程序员创建的,他们认为他们擅长检查输入....
答案 2 :(得分:0)
这样做的一个好方法是使用一个Wrapper类来使用mysql_ *函数,并使用一些方法来创建预准备语句。
您的想法是必须在查询中传递强类型参数。
例如,这是一段具有一般想法的代码。当然需要更多的工作。 但如果它得到了相当的实施,那么可以防止SQL注入攻击。
您还可以搜索已经实现该功能的第三方库,因为这很常见。
<?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
}