可能重复:
XKCD sql注入 - 请解释
什么是SQL注入?
我看过"SQL注入"一词,但仍然不理解它.它是什么?
为了防止SQL注入,是否有必要使用mysql_real_escape_string(),何时magic_quotes_gpc开启?
我有一个php文件,在开始时,从使用$ _GET发送的内容中分配一些变量.
然后它执行一些mysql查询,处理输出,然后回显一些文本和变量.
我在代码中设置的唯一保护是mysql_real_escape_string在GET上.
这足以防止攻击吗?
还有什么可以做的?
我通常不会处理数据库(我为我和我的朋友写的网络应用程序管理了一些小的)所以在问我的问题之前,我将验证我是否理解了一切是如何工作的.
SQL是一个"做"数据库的程序.它管理所有表和方案以及链接,并且它响应于它接收的命令执行大多数操作.您可以手动输入这些命令,或者使用命令编写脚本,或让其他程序将这些命令发送到SQL,但命令并没有真正改变.
当Web应用程序从用户接收输入并将其发送到SQL而不先清除它时,就会发生SQL注入.如果最终用户已经足够了,那么SQL将会看到它应该看作是将数据存储在某个表中的数据的命令,从而产生了讽刺.
典型的SQL注入预防涉及清理用户输入,即删除任何会使SQL认为正在发送命令的字符,而不是数据.
现在,我的问题:
为什么SQL不为我们处理这个?为什么SQL,在每个命令上都没有查找第一个",最后一个",并忽略其中的任何一个?(我不认为)是标准SQL命令语法的一部分,它已经有一段时间了,但如果没有,可能会发生变化)当然,它会阻止你同时发送多个命令(因为第二/第三个命令会被忽略)但是在"我一次发送1个命令"规则上,这几乎是忽略最终用户可能试图拉的任何恶作剧.
我确信其他人已经想到了这一点,并将其视为因某种原因无法工作.但我不知道理解为什么,我想.
我正在测试客户的查询,并遇到了一个有趣的问题.一个不好意图的黑客SQL会注入以下查询:
SELECT * FROM mytable WHERE 1
AND cfield='0'
AND (
field1 like '%$searchterm%' OR
field2 like '%$searchterm%' OR
)
Run Code Online (Sandbox Code Playgroud)
例如,在我看来,他无法评论第一个$ searchterm之后的内容,只是插入其他查询:
field1 like '%$searchterm%'
Run Code Online (Sandbox Code Playgroud)
不过,我可能错了.期待您的意见.先感谢您!
我使用PHP并使用名为Idiorm的ORM进行SQL调用.
请求可能如下所示:
$person = ORM::for_table('person')->create();
$person->name = $_POST['name'];
$person->age = $_POST['age'];
$person->save();
Run Code Online (Sandbox Code Playgroud)
它工作得很好,但它可能不安全反对SQL注入?解决这个问题的正确/最佳方法是什么?例?
这段代码似乎不安全:
<form method='post'>
<input type='text' name='x' style='width:1000px'>
<input type='submit' value='Send'>
</form>
<?php
if(isset($_POST['x']))
{
require_once("db_connect.php");
$q = mysqli_query($dbc, "SELECT x FROM table where x = '". $_POST['x'] ."'");
while($r = mysqli_fetch_assoc($q))
echo $r['x'];
}
Run Code Online (Sandbox Code Playgroud)
但是当我发送恶意输入时,它没有用.所以我制作了类似的剧本:
<form method='post'>
<input type='text' name='x' style='width:1000px'>
<input type='submit' value='Send'>
</form>
<?php
if(isset($_POST['x']))
echo $_POST['x'];
Run Code Online (Sandbox Code Playgroud)
当我发送'(撇号)时,我收到了\'.所以它会自动转义.我的问题是,它发生在哪里?如何发送'清除'撇号?
我有一些代码访问SQL Server数据库中的表:
...
if (GetViewNames(connection).Contains(name))
{
query = "SELECT * FROM [" + name + "]";
}
...
Run Code Online (Sandbox Code Playgroud)
这是"GetViewNames":
private List<string> GetViewNames(SqlConnection connection)
{
List<string> viewNames = new List<string>();
foreach (DataRow row in connection.GetSchema("Views").Rows)
{
// The third element in the "rows" array is the name of the view.
viewNames.Add(row[2].ToString());
}
return viewNames;
}
Run Code Online (Sandbox Code Playgroud)
我想知道的是这个代码是否对SQL注入开放.name是一个通过URL传递的字符串(坏,我知道),但它只会查询数据库,如果name在我的表列表中,对吧?或者我在这里遗漏了什么?
我不是安全专家,所以请善待您的回复.
我尝试使用sql参数的代码,但没有工作,并没有返回任何错误.我该如何解决?
string sql = "SELECT * FROM "+mw.db_name+".ananmez_genel Where hasta_id='@hastaid'";
string connectionString = ConfigurationManager.ConnectionStrings["MYDBConnectionString"].ConnectionString;
using (MySqlConnection connect = new MySqlConnection(connectionString))
{
using (MySqlCommand cmd = new MySqlCommand(sql, connect))
{
connect.Open();
cmd.Parameters.AddWithValue("@hastaid",hasta_id);
MySqlDataReader mdr;
mdr = cmd.ExecuteReader();
if (mdr.Read())
{
for (int i = 0; i < 20; i++)
{
arti = (i + 1).ToString();
kontrol = mdr.GetString("c_" + arti);
if (kontrol == "True")
{
ananmezcheck.ananmez_gnlkontrol(i, check);
}
}
yirmibir.Text = mdr.GetString("txt_1");
}
connect.Close();
}
Run Code Online (Sandbox Code Playgroud)
如果我像这样使用它,它的工作原理:
string sql = "SELECT * …Run Code Online (Sandbox Code Playgroud) 我正在W3schools上使用SQL示例关注Node.js. 这里
它说下面的代码防止SQL注入。
var adr = 'Mountain 21';
var sql = 'SELECT * FROM customers WHERE address = ' + mysql.escape(adr);
con.query(sql, function (err, result) {
if (err) throw err;
console.log(result);
});
Run Code Online (Sandbox Code Playgroud)
当查询值是用户提供的变量时,您应该转义这些值,以防止SQL注入,SQL注入是破坏或滥用数据库的常见Web黑客技术。
这就是解释。
我想了解这是多么安全。(这如何防止SQL注入)。
另外,以下代码危险吗?
var sql = 'SELECT * FROM customers WHERE address = "Mountain 21"';
sql-injection ×10
mysql ×7
sql ×5
php ×3
c# ×2
database ×1
escaping ×1
idiorm ×1
node.js ×1
oracle ×1
orm ×1
security ×1
sql-server ×1
sqlparameter ×1