用户提供的输入的SQL转义
-
05-09-2019 - |
题
能否请您给我指教?我搜索了问题,但并没有发现类似的东西给我的。
如何让我的时候都打算在SQL查询中使用我的用户输入自动逃跑?我没有在我的代码充斥着像喜欢
$var_x = $DB->Escape($_POST['var_x']);
$another_var = $DB->Escape($_POST['another_var']);
$some_string = $DB->Escape($_POST['some_string']);
...
假设我有执行逃生方法Database类mysql_real_escape_string
但我不能设置SQL查询汽车逃生为好,因为它打破了插入查询:
function Exec($sql){
$result = mysql_query($this->Escape($sql));
}
$q = $DB->Exec("SELECT * FROM table WHERE id = 'xxx'");
这使他们\ 'XXX \'。这是不正确。
最后一件事我想要做的就是让参数化的语句,因为它将使系统更复杂。当什么都没留下,我会考虑这个选项。
在短期 - 如何使智能自动转义与整个查询工作,并逃脱只值
解决方案
事实上,一个和你曾经考虑的唯一的事情(我们没有口语考试项目在这里,很明显)是使用参数化的语句。这是唯一的方法(当SQL synax允许他们,当然)。处理得当,这不会让你的系统更复杂,但它们的将会的使其更加坚固。
其他提示
很抱歉,您不能自动东西。当您连接字符串,你将永远有字符转义问题存在;这是不是你可以“解决”一次,永远不会有关于三思。
如果你这样做:
$a= "a'b";
$query= "SELECT * FROM things WHERE name='$a'";
然后将查询字符串包含字符串分隔符都撇号是在字符串真正的撇号和撇号:
SELECT * FROM things WHERE name='a'b'
一需要转义;其他不得。你怎么知道哪个是哪个?你不能,该信息永远失去了。相反,您必须说:
$query= "SELECT * FROM things WHERE name='".mysql_real_escape_string($a)."'";
(或任何其他逃生功能更适合于您所使用的数据库。)
丑?地狱啊。这就是为什么我们使用参数化查询来代替。这从字符串连接其所有的困境得到了。
字符串连接看起来很容易。人们认为他们了解clodging串在一起。但实际上,他们没有。
我用这个方法:
$db->set('name',$name);
$db->set('title',$title);
$db->insert('users');
下面的$db->set()
方法自动逸出的值(即在第二个参数)。
使用PHP 5,也可以这样做:
$db->set('name',$name)->set('title',$title)->insert('users');
最后一件事我想要做的就是让参数化的语句,因为它将使系统更 复杂。我会考虑这个选项时,没有人会离开。的
护理来解释你的说法,参数化查询“更复杂”?我不串联外部数据导入查询 - 曾经的 - 这是世界上最简单的事情,以及作为远远超过任何逃避技术更接近“防弹”是有史以来可能。