我知道大多数人会对此表示不满,但在我了解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','insert',$textToFilter);
$textToFilter = str_ireplace('select','select',$textToFilter);
$textToFilter = str_ireplace('values','values',$textToFilter);
$textToFilter = str_ireplace('where','where',$textToFilter);
$textToFilter = str_ireplace('order','order',$textToFilter);
$textToFilter = str_ireplace('into','into',$textToFilter);
$textToFilter = str_ireplace('drop','drop',$textToFilter);
$textToFilter = str_ireplace('delete','delete',$textToFilter);
$textToFilter = str_ireplace('update','update',$textToFilter);
$textToFilter = str_ireplace('set','set',$textToFilter);
$textToFilter = str_ireplace('flush','flush',$textToFilter);
$textToFilter = str_ireplace("'","'",$textToFilter);
$textToFilter = str_ireplace('"',""",$textToFilter);
$textToFilter = str_ireplace(';',";",$textToFilter);
$textToFilter = str_ireplace('>',"›",$textToFilter);
$textToFilter = str_ireplace('<',"‹",$textToFilter);
$textToFilter = nl2br($textToFilter);
$filterInputOutput = $textToFilter;
return $filterInputOutput;
}
}
由于您正试图推出自己的"filter"函数,因此标准响应为"yes,you are"。编写"安全"的代码非常困难,而且你基本上是在试图重新发明轮子,而且这样做的方式很糟糕。
为什么你会遇到所有这些(毫无意义的)麻烦,而你本可以这么做:
$safe_text = mysql_real_escape_string($badtext);
(或者数据库库提供的任何转义功能),让数据库为您完成所有的艰苦工作?
这类事情最好留给专家处理。不要试图自己滚。你应该立即将这个功能补丁到更安全的:
function filterInput($textToFilter)
{
return mysql_real_escape_string($textToFilter);
}
稍后,您可以移除对filterInput
的所有引用,并将其替换为mysql_real_escape_string
。接下来的步骤是完全停止使用mysql_query
,因为它非常危险。切换到mysqli
或PDO提供了显著的好处,特别是因为您可以使用SQL占位符为您进行转义,避免了可能会让您付出高昂代价的简单错误。
定义为"是",因为str_ireplace编码不安全(请参阅信息)。
还有"是",因为您忘记了"truncate"、"grant"、"create"等等
最好的方法是忘记它,转而准备好发言。