在我的 java 程序中,我使用 Hybernate 技术访问名为 items 的 MySQL 数据库表。该表具有名为“itemname itemprice itemid”的列,我的 java 程序具有 HQL 语句来获取数据。它还有一个组合框,从项目表中填充。一旦我们从组合框中选择了一个 itemname,它会自动填充两个不可编辑的 jtext 字段,称为 itemid 和 itemprice,并且程序的另一部分具有从这些 jtextfields 中获取字符串值的代码,并使用 POJO 类将这些值写入另一个名为 orders 的数据库表中.
我想知道这种程序可以被sql注入攻击???,如果我们使用Hibernate,它是安全的免受sql注入攻击???....如果我的程序有安全威胁,请简要说明我如何避免这些...
我在这里发布一些代码。此语句填充组合框
String SQL_QUERY = "Select items.iname,items.iid,items.iprice from Item items";
Run Code Online (Sandbox Code Playgroud)
此语句填充 jtextfields。“selecteditem”变量是组合框的选定索引。
String SQL_QUERY ="Select items.iname,items.iid,items.iprice from Item items where items.iid = '"+selecteditem+"'";
Run Code Online (Sandbox Code Playgroud)
此方法将数据写入订单表中
//To send data to the orders table
private void fillordertable(){
String itemname = (String) jcbItemCode.getSelectedItem();
String itempric = jtfItemPrice.getText();
String tmp = jtfQuantity.getText();
int itemqty = Integer.parseInt(tmp);
String temp …Run Code Online (Sandbox Code Playgroud) 只是在堆栈溢出时读取这个,因此让我想知道是否可以通过CI中的活动记录进行SQL注入.
在我的项目的大多数地方,为了用户注册和用户配置文件更新,我已经完成了这样的SQL插入:
控制器:
$name = $this->input->post('name');
$last_name = $this->input->post('last_name');
$age = $this->input->post('dob');
$user_data = array(
'name' => $name,
'last_name' => $last_name,
'age' => $age
);
$this->user_model->add_user_function($user_data);
Run Code Online (Sandbox Code Playgroud)
模型:
function add_user_function($data)
{
$this->db->insert('user_table',$data);
return;
}
Run Code Online (Sandbox Code Playgroud)
就像上面SO链接中的示例一样,我的代码是否可以用于SQL注入?
如果可能损害我的系统,你能给出一个特定的例子,如果它存在,我该如何防止它.
我对 MySQL 相当陌生,所以如果这听起来像一个愚蠢的问题,我深表歉意。
当我学习 sql 安全性和防止 sql 注入时,我了解到在为这样的 id 获取结果时使用 bindparam 更好:
//Prepare Statement
$stmt = $mysqli->prepare("SELECT * FROM my_table WHERE id=?");
if ( false===$stmt ) {
die('prepare() failed: ' . htmlspecialchars($mysqli->error));
}
$rc = $stmt->bind_param("i", $id);
if ( false===$rc ) {
die('bind_param() failed: ' . htmlspecialchars($stmt->error));
}
$rc = $stmt->execute();
if ( false===$rc ) {
die('execute() failed: ' . htmlspecialchars($stmt->error));
}
// Get the data result from the query. You need to bind results for each column that is …Run Code Online (Sandbox Code Playgroud) 我正在创建一个SQL注入演示作为我班级的项目.我已经创建了一个登录页面,但我似乎无法注入它.这是我为该页面编写的内容.我试过盲目SQLi用username字段创建多个子句.我能想到的唯一另一件事是使用子查询或更改我的代码以使其更容易.
编辑*试图注入用户名字段*
<?php // Check to see if there was a request method that is a post type
if ($_SERVER['REQUEST_METHOD'] == 'POST')
{
// Check to see if username field is null
if (!empty($_POST['username'])) {
// Connect to the server using credentials
$con = mysql_connect('localhost','root','sqlcool1');
// If the connection was not successful
if (!$con){
echo 'OUCH';
die('Could not connect: '.mysql_error());
}
// Select the correct database from the server
$db = mysql_select_db('injectme',$con);
// Pass a sql query through the table …Run Code Online (Sandbox Code Playgroud) 我一直在学习准备好的语句和绑定参数......我曾希望能够做到这一点:
SELECT ? FROM table WHERE id=?
Run Code Online (Sandbox Code Playgroud)
但是,我发现你不能使用绑定参数来调用这里搜索的表或列.在这里搜索之后,我理解为什么现在背后的原因.
这让我有了这个问题.使用这样的变量是否安全:
$fields = "col1, col2, col3";
SELECT $fields FROM table WHERE id=?
Run Code Online (Sandbox Code Playgroud)
我问,因为我有一个很大的声明,并且能够使语句简短并使用$fields包含非常长的字符串是很好的.我可以使用select all,除了我然后存储然后绑定结果(不确定它是否真的必要......我还没有尝试使用$stmt->get_result(),只是升级的php才能够使用它昨天).
我对SQL注入的工作方式有一个大概的了解,从我一直在做的所有阅读中看来,准备和参数化语句的想法是它通过让SQL不运行整个语句来阻止SQL注入,但是将它分解为简单地说......
然而,当我放入$fields变量时,现在是否在语句中直接使用变量将它打开到SQL注入? $fields是硬编码的,不是来自代码本身以外的任何来源(不是来自用户,不来自数据库).我不知道SQL注入可以攻击的程度,这就是我在这里问的原因.我可以处理一个冗长的陈述,但这将有助于我理解正确的方法,并使其更安全.
谢谢.
我正在想办法解决以下问题,因为看起来有人这样做了,我想解决它。但是,在使用OWASP Recommendation 之类的东西修复它之前,我真的很想了解攻击的工作原理
Set conn = Server.CreateObject("ADODB.Connection")
conn.open xDb_Conn_Str
sSql = "SELECT * FROM [User]"
sSql = sSql & " WHERE [Username] = '" & CleanSql(sUserId) & "'"
Set rs = conn.Execute(sSql)
Run Code Online (Sandbox Code Playgroud)
CleanSql -
Function CleanSql(str)
Dim sWrk
sWrk = Trim(str&"")
sWrk = Replace(sWrk, "'", "''") ' Adjust for Single Quote
sWrk = Replace(sWrk, "[", "[[]") ' Adjust for Open Square Bracket
CleanSql = sWrk
End Function
Run Code Online (Sandbox Code Playgroud)
单引号显然在此转义。
在此之后,它将检查是否发现用户使用以下内容验证密码:
If UCase(rs("Password")) = UCase(sPassWd) Then
DoStuff()
Run Code Online (Sandbox Code Playgroud)
任何帮助表示赞赏。
这是一个有趣的场景.在最近的一次测试中,我在INSERT查询中遇到了SQL注入.后端代码看起来像这样:
$sqlquery= "INSERT INTO sometable set col1='" + $_GET['param'] + "'";
Run Code Online (Sandbox Code Playgroud)
我可以在文件中插入任意值,甚至可以使用SELECT子查询将'/ etc/passwd'的内容插入sometable中的col1,稍后通过应用程序中其他地方的完全不同的功能读取它.
$sqlquery= "INSERT INTO sometable set col1='1', (SELECT load_file('/etc/passwd'))";
Run Code Online (Sandbox Code Playgroud)
挑战是使用INTO OUTFILE将文件写入磁盘(我有FILE privs,文档根目录可由MySQL用户写入 - 已验证).看起来MySQL不支持以下内容:
$sqlquery= "INSERT INTO sometable set col1='1', (SELECT 'a' INTO OUTFILE '/tmp/data.txt')";
Run Code Online (Sandbox Code Playgroud)
目的是在我有写权限的文件夹中编写一个php web shell.需要执行的最终查询是:
$sqlquery= "INSERT INTO sometable set col1='1', (SELECT '<?php system($_GET['x']) ?>' INTO OUTFILE'/var/www/app/imgupload/shell.php')";
Run Code Online (Sandbox Code Playgroud)
MySQL期望子查询返回数据,这就是上述语句似乎不起作用的原因,因为INTO OUTFILE会将数据写入磁盘而不是将其返回给MySQL.
你认为有一个解决方法吗?
通常情况下,我们有与 setParameters 配对的 andWhere/orWhere 函数可以正确防止注入。
我有一个更复杂的案例,我想确保一切都是安全的。如果我正确阅读了教义代码,似乎使用文字具有相同的效果,但我不确定...你能吗?确认/确认以下两种情况是安全的(都使用准备好的语句和通配符注入防止 sql 注入)?
第一种情况
$expr = $queryBuilder->expr()->orX();
$expr->add($queryBuilder->expr()->lt('entityName.field - ' . $queryBuilder->expr()->literal($rule->getValue()), $queryBuilder->expr()->literal(self::MAX_ERROR))); // Since the second part is a constant (and a numeric one) it shouldn't need literal but... can't hurt.
Run Code Online (Sandbox Code Playgroud)
第二种情况
$expr = $queryBuilder->expr()->orX();
$expr->add($queryBuilder->expr()->like('entityName.field', $queryBuilder->expr()->literal(addcslashes($rule->getValue(), '%_') . '%')));
Run Code Online (Sandbox Code Playgroud) 我目前正在检查我的 Rest API 是否容易受到 SQL 注入的影响,但我对这个过程感到困惑。
我的 API 接受 JSON,然后将请求发送到 Mysql 数据库。我试过发送应该导致 SQL 注入的字符串,例如' OR 'x'='x,但不是被执行,而是作为字符串发送到服务器,我想这意味着它们不是问题。
我现在正在使用 Postman 进行一些更深入的测试,但是如果我尝试将字符串添加到我的参数中,例如:
{
"name": "test" OR 1 = 1 -- "
}
Run Code Online (Sandbox Code Playgroud)
邮递员只会告诉我 JSON 语法不正确,即使我确实发送了它,我也会收到“无效的 JSON”响应,而它甚至不会到达我的 Rest API。
这是好事还是坏事?我实际上如何测试我的 API?
下面是我截断表记录的代码行。表值来自前端。在我的 Veracode 扫描中,它显示了 SQL 注入。我怎样才能避免这种情况?我无法创建存储过程,因为连接字符串是动态的,我需要截断此表。还有另一种方法吗?
SqlCommand cmd = connection.CreateCommand();
cmd.Transaction = transaction;
cmd.CommandText = "TRUNCATE TABLE " + tablename;
cmd.ExecuteNonQuery();
Run Code Online (Sandbox Code Playgroud) sql-injection ×10
php ×5
mysql ×4
sql ×4
security ×2
activerecord ×1
asp-classic ×1
c# ×1
codeigniter ×1
doctrine-orm ×1
hibernate ×1
java ×1
symfony ×1