我一直在阅读有关SQL注入攻击以及如何避免它们的内容,尽管我似乎永远无法在工作中制作"糟糕"的例子,例如看到这篇文章.
我在数据库中创建了一个PHP文件和一个表,有一个值传递$_GET并尝试通过执行删除表bob'); drop table students; --,但它不起作用.PHP自动转义\'并且查询有错误,没有造成任何伤害.尝试复制登录"攻击" AND WHERE 1=1等时出现同样的问题.
示例代码:
<?php
$id = $_GET['id'];
$sql = "INSERT INTO Users (Username) VALUES ($id)";
echo $sql;
mysql_query($sql) or die(mysql_error());
Run Code Online (Sandbox Code Playgroud)
而且我会通过 sql.php?id=1); delete from Users; --
那么这个过时的东西过去常常适用于PHP3或者什么东西,现在甚至新手都不受魔法引号之类的保护?
我在Ubuntu上使用PHP5.
什么是防止经典asp应用程序的SQL注入的强大方法?
仅供参考我正在使用访问数据库.(我没有写应用程序)
我已阅读并尝试将易受攻击的SQL查询注入我的应用程序.这不够安全.我只是使用Statement Connection进行数据库验证和其他插入操作.
preparedStatements安全吗?而且这个陈述也会有问题吗?
我觉得这有点傻,因为我似乎是世界上唯一一个没有得到它的人,但无论如何都要去.我将以Python为例.当我使用原始SQL查询(我通常使用ORM)时,我使用参数化,就像使用SQLite的这个例子一样:
方法A:
username = "wayne"
query_params = (username)
cursor.execute("SELECT * FROM mytable WHERE user=?", query_params)
Run Code Online (Sandbox Code Playgroud)
我知道这有效,我知道这是一般推荐的方法.一个SQL注入易受影响的方法来做同样的事情将是这样的:
方法B:
username = "wayne"
cursor.execute("SELECT * FROM mytable WHERE user='%s'" % username)
Run Code Online (Sandbox Code Playgroud)
到目前为止,我可以告诉我理解SQL注入,正如本维基百科文章中所解释的那样.我的问题很简单:方法A与方法B有什么不同?为什么方法A的最终结果与方法B不同?我假设该cursor.execute()方法(Python的DB-API规范的一部分)负责正确转义和输入类型检查,但这在任何地方都没有明确说明.在这种情况下,这就是所有参数化吗?对我来说,当我们说"参数化"时,所有这些都意味着"字符串替换",如%-formatting.这是不正确的?
最近我的网站被SQL注入攻击.黑客使用以下查询来获取我的数据库名称.我无法理解他们写的这个查询.
查询:
=-999.9%20UNION%20ALL%20SELECT%20concat(0x7e,0x27,Hex(cast(database()%20as%20char)),0x27,0x7e),0x31303235343830303536,0x31303235343830303536,0x31303235343830303536--
Run Code Online (Sandbox Code Playgroud)
查询运行后显示整数结果,如" 74545883".
你能解释一下查询是如何工作的吗?
有人攻击了我的数据库并放弃了该表.
在我的PHP页面中有一个单独的查询,我在使用mysql_real_escape_string:
$db_host="sql2.netsons.com";
$db_name="xxx";
$username="xxx";
$password="xxx";
$db_con=mysql_connect($db_host,$username,$password);
$connection_string=mysql_select_db($db_name);
mysql_connect($db_host,$username,$password);
mysql_set_charset('utf8',$db_con);
$email= mysql_real_escape_string($_POST['email']);
$name= mysql_real_escape_string($_POST['name']);
$sex= mysql_real_escape_string($_POST['sex']);
if($_POST['M']!=""){ $sim = 1; }else { $sim = 0; }
$query = "INSERT INTO `users` (`email`, `name`, `sex`, `M`) VALUES
( '".$email."', '".ucwords(strtolower($name))."', '".$sex."','".$sim."')";
$res = mysql_query($query) or die("Query fail: " . mysql_error() );
mysql_close($db_con);
Run Code Online (Sandbox Code Playgroud)
而register_globals被禁用.
那么,我的数据库是怎么被黑了的?
我已经尝试了各种各样的Python模块,它们要么逃避太多,要么以错误的方式逃脱.你在Python中找到逃避引号(",")的最佳方法是什么?
在Rails中,当我想通过用户找到给定的值并避免SQL注入(转义撇号等)时,我可以这样做:
Post.all(:conditions => ['title = ?', params[:title]])
Run Code Online (Sandbox Code Playgroud)
我知道这样做的一种不安全的方式(可能的SQL注入)是这样的:
Post.all(:conditions => "title = #{params[:title]}")
Run Code Online (Sandbox Code Playgroud)
我的问题是,以下方法是否会阻止SQL注入?
Post.all(:conditions => {:title => params[:title]})
Run Code Online (Sandbox Code Playgroud) 在CodeIgniter中,如何避免sql注入?是否有任何方法在配置文件中设置以避免sql注入?我正在使用此代码来选择值:
$this->db->query("SELECT * FROM tablename WHERE var='$val1'");
Run Code Online (Sandbox Code Playgroud)
这用于插入值:
$this->db->query("INSERT INTO tablename (`var1`,`var2`) VALUES ('$val1','$val2')");
Run Code Online (Sandbox Code Playgroud)
用于从数据库中插入和选择值的另一种方法是CodeIgniter insert()和get()方法.使用CodeIgniter的bulit-in函数时是否有机会进行sql注入
我刚看到这个出现在我们的请求日志中.他们想要实现什么目标?
完整的请求字符串是:
properties?page=2side1111111111111 UNION SELECT CHAR(45,120,49,45,81,45),CHAR(45,120,50,45,81,45),CHAR(45,120,51,45,81,45),CHAR(45,120,52,45,81,45),CHAR(45,120,53,45,81,45),CHAR(45,120,54,45,81,45),CHAR(45,120,55,45,81,45),CHAR(45,120,56,45,81,45),CHAR(45,120,57,45,81,45),CHAR(45,120,49,48,45,81,45),CHAR(45,120,49,49,45,81,45),CHAR(45,120,49,50,45,81,45),CHAR(45,120,49,51,45,81,45),CHAR(45,120,49,52,45,81,45),CHAR(45,120,49,53,45,81,45),CHAR(45,120,49,54,45,81,45) -- /*
Run Code Online (Sandbox Code Playgroud)
编辑:由于谷歌搜索没有返回任何有用的东西,我想问那些遇到同样事情的人.
sql-injection ×10
security ×3
mysql ×2
php ×2
sql ×2
asp-classic ×1
built-in ×1
codeigniter ×1
database ×1
escaping ×1
function ×1
java ×1
jdbc ×1
ms-access ×1
python ×1