Val*_*Val -7 mysql sql-injection solution
我一直被MySQL注射困扰,并且正在考虑一种消除这个问题的方法.我有什么事了如下的希望,很多人会觉得这非常有用.
我能想到的唯一回退是部分搜索:Jo =>使用类似的%%语句返回"John".
这是一个php解决方案:
<?php
function safeQ(){
$search= array('delete','select');//and every keyword...
$replace= array(base64_encode('delete'),base64_encode('select'));
foreach($_REQUEST as $k=>$v){
str_replace($search, $replace, $v);
}
}
safeQ();
function html($str){
$search= array(base64_encode('delete'),base64_encode('select'));
$replace= array('delete','select');//and every keyword...
str_replace($search, $replace, $str);
}
//example 1
...
...
$result = mysql_fetch_array($query);
echo html($result[0]['field_name']);
//example 2
$select = 'SELECT * FROM $_GET['query'] ';
//example 3
$insert = 'INSERT INTO .... value( $_GET['query'] )';
?>
Run Code Online (Sandbox Code Playgroud)
我知道,我知道你仍然可以注射使用1=1或任何其他类型的注射...但我认为这可以解决你的问题的一半,所以正确的mysql查询被执行.
所以我的问题是,如果有人能找到任何退款,请随时在这里发表评论.
如果您认为这是一个非常有用的解决方案并且没有发现任何重大缺点,或者您认为这些都是一个坏主意,请给出答案...
Col*_*ard 11
这已在PHP中正确实现:
要回答您的实际问题,您的方法的主要缺点是:
如果您要重新发明轮子,我建议您查看预先存在的轮子.
Wrong Way(TM)重新发明轮子并重新发明它.
'SELECT * FROM ' . safeQ($_GET['query'])编辑:要解决您在评论中给出的示例:
$v="1; DROP tbl;\";DROP tbl" // oh look, an SQL injection attempt!
$s = 'SELECT * FROM tbl WHERE ID='.$v; // SQL injection, no doubt
// if ID is an integer field, make it an integer. Simple, secure, and fast.
$s = 'SELECT * FROM tbl WHERE ID='.(int)$v;
// $s == 'SELECT * FROM tbl WHERE ID=1' // see PHP manual for explanation of type casting
// if ID is a string field, escape it. Simple, secure, and still plenty fast.
$s = 'SELECT * FROM tbl WHERE ID="'.mysql_real_escape_string($v) . '"';
// $s == 'SELECT * FROM tbl WHERE ID="1; DROP tbl;\";DROP tbl"';
// See? No injection, as the quote is *escaped*
Run Code Online (Sandbox Code Playgroud)