0

我知道大多数人会对此皱眉,但在我了解 PDO 语句和转义字符串之前,我不确定我应该如何防止 mysql 注入。

我创建了一个函数,它接受文本并通过过滤器运行它。我想知道它是否真的会阻止sql注入或者他们是否可以绕过它?我当时的目标是让用户能够输入文本并能够完全按照他们输入的方式显示。

除此之外,我还小心翼翼地确保用户对数据库的权限不超过所需权限。我是否使用他们的输入来更新或插入新行等。但鉴于我没有它仍然可以工作吗?:

function filterInput($textToFilter)
{
    if ($textToFilter != null)
{



    //a = a
    //e = e
    //i = i
    //o = o
    //u  = u

    //A = A
    //E = E
    //I = I
    //O = O
    //U = U

    $textToFilter = str_ireplace('insert','ins&#101rt',$textToFilter);
    $textToFilter = str_ireplace('select','s&#101lect',$textToFilter);
    $textToFilter = str_ireplace('values','valu&#101s',$textToFilter);
    $textToFilter = str_ireplace('where','wher&#101',$textToFilter);
    $textToFilter = str_ireplace('order','ord&#101r',$textToFilter);
    $textToFilter = str_ireplace('into','int&#111',$textToFilter);
    $textToFilter = str_ireplace('drop','dr&#111p',$textToFilter);
    $textToFilter = str_ireplace('delete','delet&#101',$textToFilter);
    $textToFilter = str_ireplace('update','updat&#101',$textToFilter);
    $textToFilter = str_ireplace('set','s&#101t',$textToFilter);
    $textToFilter = str_ireplace('flush','fl&#117sh',$textToFilter);
    $textToFilter = str_ireplace("'","&#39",$textToFilter);
    $textToFilter = str_ireplace('"',"&#34",$textToFilter);
    $textToFilter = str_ireplace(';',"&#59",$textToFilter);
    $textToFilter = str_ireplace('>',"›",$textToFilter);
    $textToFilter = str_ireplace('<',"‹",$textToFilter);
$textToFilter = nl2br($textToFilter);
$filterInputOutput = $textToFilter;
return $filterInputOutput;  
}
}
4

3 回答 3

5

由于您正在尝试推出自己的“过滤器”功能 - 标准响应是“是的,您是”。编写“安全”代码非常困难,而且您基本上是在尝试重新发明轮子,而且这样做的方式很糟糕。

当你可以这样做的时候,你为什么还要去做所有这些(毫无意义的)麻烦:

$safe_text = mysql_real_escape_string($badtext);

(或您的数据库库提供的任何转义功能)并让数据库为您完成所有艰苦的工作?

于 2012-09-14T20:01:36.580 回答
2

这种事情最好留给专家。不要试图自己动手。您应该立即将此功能修补到更安全的位置:

function filterInput($textToFilter)
{
    return mysql_real_escape_string($textToFilter);
}

稍后您可以移除所有对 的引用filterInput并将其替换为mysql_real_escape_string. 下一步是mysql_query完全停止使用,因为它非常危险。切换到mysqli或 PDO 提供了显着的好处,特别是因为您可以使用 SQL 占位符为您进行转义,避免可能导致您付出高昂代价的简单错误。

于 2012-09-14T20:07:21.367 回答
1

绝对“是”,因为 str_ireplace 编码不安全(请参阅infos)。

还有“是”,因为您忘记了“截断”、“授予”、“创建”等。

最好的方法是忘记它并转向准备好的陈述

于 2012-09-14T20:08:09.103 回答