在一些例子中阻止jss,php,mysql中的xss - 请指教

时间:2012-03-28 16:36:34

标签: php jquery mysql xss

有一段时间我因为新页面上可能存在XSS攻击漏洞而越来越困惑。我一直在阅读很多,在SO和其他Google搜索网站上。我想尽可能保证我的页面安全(是的,我知道我不能100%安全:)。

我也知道xss是如何工作的,但是想请你指出我的代码中可能存在的一些易受攻击的地方。 我一起使用jquery,javascript,mysql,php和html。当我使用这样的编码时,请告诉我它的安全性。这是个主意。

HTML:

<input name="test" id="id1" value="abc">
<div id="button"></div>
<div id="dest"></div>

jQuery:

1. $('#id').click (function() {
2.        var test='def' 
3.        var test2=$('#id1').val();
4.        $.variable = 1;
5.        $.ajax({
6.        type: "POST",
7.          url: "get_data.php",
8.          data: { 'function': 'first', 'name': $('#id').val() },
9.          success: function(html){
10.                $('#dest').html(html);
11.                 $('#id1').val = test2;
12.            }
13.         })
14.  })

我想这很容易。我有两个div - 一个是按钮,第二个是“get_data.php”输出的文本的目的地。因此,在单击我的按钮输入值为id'id1'后,将get_data.php作为POST数据,并根据该值的值返回一些数据。此数据以html格式发送到“目标”div。

get_data.php应如下所示:

   [connecting to database]
   switch($_POST['function']) {
     case 'first':
3.       $sql_query = "SELECT data from table_data WHERE name = '$_POST[name]'";
         break;
     default:
         $sql_query = "SELECT data from table_data WHERE name = 'zzz'";    
   }
   $sql_query = mysql_query($sql_query) or die(mysql_error());
   $row = mysql_fetch_array($sql_query);    
   echo $row['data']

现在考虑来自mysql的数据没有任何注入(我的意思是mysql_real_escaped)。

好的,这是问题:

JQuery部分:

第2行:任何人都可以像这样更改设置的值。注射?

第3行和第11行:很明显,在提交之前输入相同的值是非常XSS威胁。如何在不丢失功能的情况下使其安全(不打算将html标签复制到输入中)

第4行:任何人都可以通过注射(或任何其他方式)来改变这个值吗?

第8行:任何人都可以更改通过POST发送的'function'变量的值吗?如果是这样,如何预防?

第10行:如果POST数据在放入数据库之前被转义可以返回值(我的意思是sql查询的回应结果)在通过php脚本生成它并在jquery中使用它之间以某种方式改变了吗?

PHP部分:

请看第三行。写道:'$ _POST [name]'安全吗?我遇到了这样的建议:

     $sql_query = "SELECT data from table_data WHERE name = " . $_POST['name'];

而不是:

     $sql_query = "SELECT data from table_data WHERE name = '$_POST[name]'";

它在某些方面有所不同,特别是在安全方面吗? 同一行的下一个问题:如果我想要mysql_real_escape()$ _POST ['name']什么是最好的解决方案(考虑大量的POST数据,不仅仅是这个例子中的一个元素): - 对于mysql_real_escape()每个查询中的每个POST数据都是这样的:

$sql_query = "SELECT data from table_data WHERE name = " . mysql_real_escape($_POST['name']);
  • 在执行之前转义整个查询

     $sql_query = "SELECT data from table_data WHERE name = " . $_POST['name'];
     $sql_query = mysql_real_escape($sql_query);
    
  • 编写迭代所有POST数据并将其转义的函数:

     function my_function() {
        foreach ( $_POST as $i => $post ) {
             $_POST[$i] = mysql_real_escape($post)
        }
     }
    

什么 - 您认为最好,最安全的想法?

这个帖子变得相当大但是xss真的让我睡不着:)希望再次在这里得到帮助dudes :)我在这里写的所有东西都是写的,没有复制所以它可能有一些小错误,丢失逗号等等所以不要担心这个。

修改

好吧..如果我理解正确过滤数据在javascript级别或客户端根本不是必需的。一切都应该通过PHP完成。 所以我有一些数据转到ajax并进一步到php,因此我得到另一种数据输出到屏幕。我在php中过滤数据,但并不是所有数据都转到了mysql - 这可能会以某种方式改变并回显到屏幕并返回为'html'成功调用ajax的返回值。我还要提到我在OOP中感觉不舒服并且更喜欢结构方式。我可以使用PDO但仍然(如果我错了,请纠正我)我必须手动为每个POST数据添加过滤。当然,我获得了一些速度优势。但是使用mysql_real_escape转义数据现在看起来像是“同一级别的手动”。如果我错了,请纠正我。也许mysql_realescape不如PDO安全 - 如果是这样,那就是使用它的原因。

此外,我必须提到,对于所有恶意文本,必须删除不进入数据库的数据。请告诉我应该使用哪种功能,因为我发现了很多关于此的帖子。他们说“使用htmlentities()”或“使用htmlspecialchars()”等等。 考虑这种情况: 使用POST属性调用Ajax并调用file.php。它发送到file.php POST数据,即$ _POST ['data'] ='恶意警报()'。 file.php中我要做的第一件事是从$ _POST ['data']中删除所有威胁部分。你有什么建议,你怎么建议我应该这样做。请写一个例子。

2 个答案:

答案 0 :(得分:2)

XSS是Cross-site scripting。你谈到SQL injection。我将参考后者。

JQuery Part

可以更改每个JavaScript命令。您可以自己尝试,只需安装Firebug,更改源代码或在加载的页面中注入一些新的JavaScript代码并执行POST请求。或者,使用RestClient之类的工具直接发送您喜欢的任何POST请求。

主要洞察力 您无法控制客户端。您必须期待最坏的情况,并在服务器端执行所有验证和安全工作。

PHP部分

仔细检查每个用户输入始终是个好主意。通常必须执行两个步骤:

  1. 验证用户输入:这基本上是检查用户输入在语法上是否正确(例如,检查用户提交的文本是否是有效电子邮件地址的正则表达式)
  2. 转义数据库查询:在将动态数据提供给数据库查询时,始终转义动态数据。无论它来自哪里。但是不要逃避整个查询字符串,这可能会产生意想不到的结果。
  3. 也许(并且希望)您会喜欢使用ORM解决方案。对于PHP,例如PropelDoctrine。在许多其他方便的事物中,它们提供了可靠的解决方案来防止SQL注入。

    Propel中的示例:

    $result = TableDataQuery::create()
        ->addSelectColumn(TableDataPeer::DATA)
        ->findByName($_POST['name']);
    

    Doctrine中的示例:

    $qb = $em->createQueryBuilder();
    $qb->add('select', 'data')
       ->add('from', 'TableData')
       ->add('where', 'name = :name')
       ->setParameter('name', $_POST['name']);
    $result = $qb->getResult();
    

    如您所见,无需手动转义用户输入,ORM会为您执行此操作(此操作称为参数化查询)。

    更新

    您询问PDO是否也是ORM。我说PDO是一个数据库抽象层,而ORM提供了更多的功能。但无论如何,PDO是一个良好的开端。

      

    可以在浏览器页面中打开任何恶意代码并发送   垃圾到服务器上somwhere的php脚本?

    是的,绝对!

    您在JavaScript中验证用户输入的唯一原因是响应更快的用户界面和更好的外观和感觉您的Web应用程序。出于安全原因,你不这样做,这是服务器的工作。

答案 1 :(得分:0)

有一个firefox插件可以测试您的网站是否有XSS,它名为XSS Me

你也可以去

http://ha.ckers.org/xss.html

对于大多数XSS攻击

然后转到

http://ha.ckers.org/sqlinjection/

对于大多数sql注入攻击

并在您的网站上试用这些