MySQL INJECTION解决方案

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中正确实现:

但是,您应该首先阅读SQL注入PHP手册条目.


要回答您的实际问题,您的方法的主要缺点是:

  1. 它不起作用
  2. 需要明确的是,它不起作用,并且会让您对SQL注入保持开放态度.
  3. 它还可以防止您输入任何与MySQL关键字冲突的数据.

如果您要重新发明轮子,我建议您查看预先存在的轮子.

  • @Val它不是个人的.我们之前刚刚看到人们受到这种伤害,对我们来说如何正确地做到这一点非常重要.尝试代码是一件好事; 这就是我们做我们所做的事情; 但这里有一个危险,你必须得到提醒.这就像走进一个消防站休息室并说:"我正在考虑制作自己的烟花,我有50公斤的火药,一个手提袋和一个火柴 - 你们觉得怎么样?"......你不应该如果反应有些消极,会感到惊讶 (5认同)
  • 它不会阻止子弹,但我的防弹背心的好处是获取颜色的范围...... (3认同)
  • @Val:SQL清理有众所周知,简单,经过测试和有效的解决方案.你的既不简单,也不经过测试或有效.如果你选择将"之前已经有人想到这个"的事实解释为"人们对我意味着",这显然是你的选择,但与编程没有多大关系. (2认同)

Pis*_*3.0 6

Wrong Way(TM)重新发明轮子并重新发明它.

  • 首先,有参数化查询(在MySQLi扩展中可用于PHP ); 如果那不是一个选项,那就是mysql_real_escape_string.这是主要问题 - 在决定自己实施之前检查已有的选项.
  • 其次,你试图在SQL中调用PHP函数,你想要的可能是类似的东西 '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)

  • @col和@piskvor ......好吧,我读过这个错误,大约4年了,我认为mysql_real_escape毕竟不是那么安全......; 但我认为这是对我认为首先出现问题的建议......然而,对于我自己以及那些过度思考SQL Injects以及懒惰的人来说,这可能是一个教训. ..这对我来说是个有用的话题...... (2认同)