如果我的网站上线(不认为它会,它只是一个学习练习).
我一直在使用mysql_real_escape_string(); 来自POST,SERVER和GET的数据.另外,我一直在使用intval(); 在必须只是数字的字符串上.
我认为这包括我从sql注入?正确?我可以做更多吗?
但是,我不确定它是如何提供的(如果它提供任何保护)来自XSS注射?
有关如何打击这两种攻击形式的更多信息,我们表示赞赏.
在遇到 antisamy 项目之前,我试图编写自己的过滤器,该项目允许您配置和防止 XSS 攻击。但我只是想知道是否可以使用同样的方法来防止sql注入攻击?
任何已经实施 antisamy 来防止 sql 注入攻击的人可以让我知道我们如何继续前进吗?
因此,我尝试在本地托管的网页上练习 SQL 注入。我对 SQL 很陌生,尤其是 SQL 注入。我已经做了一些研究,将新条目注入表中,但是当我尝试执行时,它似乎不起作用。
首先,我的网页是登录的。我有用户名和密码(显然)并且可以在不附加任何 SQL 注入的情况下登录。但是当我将注入代码添加到用户名框中时,它不起作用。例子:
username: admin'; insert into hall values (3,'https://google.com','Google'); --
password: 123321
Run Code Online (Sandbox Code Playgroud)
在我的大厅表中,有 3 个条目:id、链接、目的地。ID 是一个整数,链接和目标是 varchars。
我需要做什么才能成功注入并将此条目添加到数据库中?是需要输入正确的用户名和密码,还是只输入用户名,还是其他什么?
我不是SQL的专家,我想要实现的是以下内容.
我有一个名为的整数列表PersonIds.首先,我需要将这个整数列表转换为字符串列表.为什么?因为据我所知WHERE .. IN,SQL中的条件是我需要提供给查询的变量.
然后我需要修改字符串列表以防止SQL注入,因此@在每个Id列表之前插入.
最后,我创建了查询并提供了刚刚创建的列表.
我试图做的是:
var listIds = string.Join(",@", PersonIds, 0, PersonIds.Count()));
var query = $"DELETE FROM PersonTable WHERE PersonId IN (@{listIds})";
Run Code Online (Sandbox Code Playgroud)
有些事情我做错了.总结一下,我需要步骤:
提前致谢!
假设我有一个接受用户输入的多行 SQL 查询。是否可以通过注释使用标准 SQL 注入来中断?
这是针对通过环回 API 接受用户输入的 Microsoft SQL Server 查询。因为在多个位置使用相同的用户输入,我似乎无法编写一个输入来创建有效的 SQL 查询来运行注入攻击。
编辑代码:
SELECT Field_Name
FROM Table_Name
WHERE Field_Name != 'Hardcoded Value' AND (
Field_1 LIKE '%userinput%' OR
Field_2 LIKE '%userinput%' OR
Field_3 LIKE '%userinput%' OR
Field_4 LIKE '%userinput%'
)
Run Code Online (Sandbox Code Playgroud)
请注意,这userinput是来自前端的实际输入,在两个通配符之间使用。
' DROP TABLE USERS; --
由于 OR 语句,使用用户输入运行此代码
将出错。
这个查询是否可以通过 SQL 注入破坏?
我目前正在检查 StackOverflow 以获取有关使用 C# 代码防止 SQL 注入的最佳实践,许多答案包括 .NET SQL 类,例如SqlCommand, SqlDataAdapter, ...
问题是我必须使用专有的中间件组件将查询发送到数据库,而且我找不到任何方法来使用这些类而不使用SqlConnection.
这是我的示例代码:
SqlCommand sqlC = new SqlCommand("USP_MyProcedure");
sqlC.CommandType = System.Data.CommandType.StoredProcedure;
sqlC.Parameters.AddWithValue("@strRef", strRef);
sqlC.Parameters.AddWithValue("@strCmd", strCmd);
sqlC.Parameters.AddWithValue("@strParam", strParam);
sqlC.Parameters.AddWithValue("@strDef", strDef);
sqlC.Parameters.AddWithValue("@strWn", sWn);
Run Code Online (Sandbox Code Playgroud)
在SqlCommand似乎正确初始化时,SqlParameterCollection看起来不错,但物业SqlC.CommandText仅返回“USP_MyProcedure”。
如果我使用其他类来处理我的SqlCommand,例如:
SqlDataReader reader = sqlC.ExecuteReader();
Run Code Online (Sandbox Code Playgroud)
我收到一个错误,因为我没有可用的连接:
必须初始化连接属性
所以,我的问题是:
编辑:看起来我误解了这些课程的工作方式。
这些类不会“离线”准备 SQL 语句,而是设计为与 SqlConnection 一起使用。
但我可以改变问题,从另一个角度提出问题:是否有 .NET 类可以“离线”准备 SQL 语句以防止注入?
如何防止这些代码被 SQL 注入?这是我正在学习的登录系统。这是代码!
\n if (!(string.IsNullOrWhiteSpace(textBox1.Text)) && !(string.IsNullOrWhiteSpace(textBox2.Text)))\n {\n\n MySqlConnection mcon = new MySqlConnection("datasource = 127.0.0.1; port = 3306; username = root; password = ; database = rpgmaster;");\n\n mcon.Open();\n\n DataTable table = new DataTable();\n\n MySqlDataAdapter adapter = new MySqlDataAdapter("Select * From users where Username = '" + textBox2.Text + "' and password = '" + textBox1.Text + "'", mcon);\n \n adapter.Fill(table);\n\n if (table.Rows.Count <= 0)\n {\n MessageBox.Show("Voc\xc3\xaa n\xc3\xa3o est\xc3\xa1 registrado!");\n }\n else\n {\n MessageBox.Show("Logado com sucesso! ");\n }\n\n mcon.Close();\n }\n …Run Code Online (Sandbox Code Playgroud) 以下代码被强调为 SQL 注入攻击的安全漏洞。
StringBuilder sb = new StringBuilder();
sb.Append("DROP DATABASE IF EXISTS " + dbname);
String **sqlCommText** = sb.ToString();
using (SqlCommand command = new SqlCommand(**sqlCommText**, connection))
{
connection.Open();
Run Code Online (Sandbox Code Playgroud)
即sqlCommText
我知道在 DML sql 上创建准备好的语句(例如插入和更新),但我认为这不适用于 DDL sql - 我无法将 dbname 参数化到 sql 中。
有什么建议如何解决这个问题吗?
我正在构建一个登录页面来演示 SQL 注入。我已尽力构建最“简单”的登录。我一直在使用1' or '1' = '1用户名和密码等凭据,并在登录时收到“不”消息,这意味着它只是将其识别为不正确的用户和密码。1' or '1' = '1'))/*我还尝试使用用户名和密码登录foo,但登录时出现 500 服务器错误。
这是我的身份验证页面:
<?php
include('config.php');
$username = $_POST['username'];
$password = $_POST['password'];
$sql = "SELECT * FROM Users WHERE username = '$username' AND password = '$password'";
$result = mysqli_query($conn, sql);
$row = mysqli_fetch_array($result);
$count = mysqli_num_rows($result);
if($count == 1) {
echo "yay";
} else {
echo "nay";
}
?>
Run Code Online (Sandbox Code Playgroud)
我的问题可能是我试图获取输入的用户名和密码并与数据库中存储的数据进行比较,这就是为什么它只是将注入识别为不正确的用户名和密码。
我正在编写此代码以保护我的服务器免受SQL注入.目标是在匹配的任何内容之前插入[BloCKiT].请不要按空格分割单词,因为它不适用于这种情况.例如"s = 290'; DECLARE%".这会导致错误.
请在代码中查看评论,谢谢.
下面的代码是用c#编写的.
string MyOutPut = "";
string PatternAnywhereFromWord = "declare|exec|insert|update|delete|varchar|cast";//search any within the word CASE-INSENTIVE. This is the regular expression
string AttachmeMe = "[BloCKiT]";//Insert this string into the statement
//find patterns case-insensitive anywhere within the statement and attach the AttachmeMe variable in front of the matched position
string InputStatment = "delete s=290';DECLARE%20@S%20NVARCHAR(4000) ;insert into update all xdelete * from database exec";
//some logic here. I plan to write some loop but i think i would perform …Run Code Online (Sandbox Code Playgroud)